日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
SpringBoot發(fā)郵件和附件,超實用!

Spring Boot集成郵件服務(wù)竟如此簡單,快速掌握郵件業(yè)務(wù)類的核心邏輯和企業(yè)郵件的日常服務(wù)。

豐潤ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!

什么是SMTP?

SMTP全稱為Simple Mail Transfer Protocol(簡單郵件傳輸協(xié)議),它是一組用于從源地址到目的地址傳輸郵件的規(guī)范,通過它來控制郵件的中轉(zhuǎn)方式。SMTP認(rèn)證要求必須提供賬號和密碼才能登陸服務(wù)器,其設(shè)計目的在于避免用戶受到垃圾郵件的侵?jǐn)_。

什么是IMAP?

IMAP全稱為Internet Message Access Protocol(互聯(lián)網(wǎng)郵件訪問協(xié)議),IMAP允許從郵件服務(wù)器上獲取郵件的信息、下載郵件等。IMAP與POP類似,都是一種郵件獲取協(xié)議。

什么是POP3?

POP3全稱為Post Office Protocol 3(郵局協(xié)議),POP3支持客戶端遠(yuǎn)程管理服務(wù)器端的郵件。POP3常用于“離線”郵件處理,即允許客戶端下載服務(wù)器郵件,然后服務(wù)器上的郵件將會被刪除。目前很多POP3的郵件服務(wù)器只提供下載郵件功能,服務(wù)器本身并不刪除郵件,這種屬于改進(jìn)版的POP3協(xié)議。

IMAP和POP3協(xié)議有什么不同呢?

兩者最大的區(qū)別在于,IMAP允許雙向通信,即在客戶端的操作會反饋到服務(wù)器上,例如在客戶端收取郵件、標(biāo)記已讀等操作,服務(wù)器會跟著同步這些操作。而對于POP協(xié)議雖然也允許客戶端下載服務(wù)器郵件,但是在客戶端的操作并不會同步到服務(wù)器上面的,例如在客戶端收取或標(biāo)記已讀郵件,服務(wù)器不會同步這些操作。

什么是JavaMailSender和JavaMailSenderImpl?

JavaMailSender和JavaMailSenderImpl 是Spring官方提供的集成郵件服務(wù)的接口和實現(xiàn)類,以簡單高效的設(shè)計著稱,目前是Java后端發(fā)送郵件和集成郵件服務(wù)的主流工具。

如何通過JavaMailSenderImpl發(fā)送郵件?

非常簡單,直接在業(yè)務(wù)類注入JavaMailSenderImpl并調(diào)用send方法發(fā)送郵件。其中簡單郵件可以通過SimpleMailMessage來發(fā)送郵件,而復(fù)雜的郵件(例如添加附件)可以借助MimeMessageHelper來構(gòu)建MimeMessage發(fā)送郵件。例如: 

 
 
 
 
  1. @Autowired    
  2.     private JavaMailSenderImpl mailSender;    
  3.     public void sendMail() throws MessagingException {    
  4.         SimpleMailMessage simpleMailMessage = new SimpleMailMessage();    
  5.         simpleMailMessage.setFrom("admin@163.com");    
  6.         simpleMailMessage.setTo("socks@qq.com");    
  7.         simpleMailMessage.setSubject("Happy New Year");    
  8.         simpleMailMessage.setText("新年快樂!");    
  9.         mailSender.send(simpleMailMessage);    
  10.         MimeMessage mimeMessage = mailSender.createMimeMessage();   
  11.         MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage);    
  12.         messageHelper.setFrom("admin@163.com");    
  13.         messageHelper.setTo("socks@qq.com");    
  14.         messageHelper.setSubject("Happy New Year");    
  15.         messageHelper.setText("新年快樂!");    
  16.         messageHelper.addInline("doge.gif", new File("xx/xx/doge.gif"));    
  17.         messageHelper.addAttachment("work.docx", new File("xx/xx/work.docx"));    
  18.         mailSender.send(mimeMessage);    
  19.     } 

為什么`JavaMailSenderImpl` 能夠開箱即用 ?

所謂開箱即用其實就是基于官方內(nèi)置的自動配置,翻看源碼可知曉郵件自動配置類(MailSenderPropertiesConfiguration) 為上下文提供了郵件服務(wù)實例(JavaMailSenderImpl)。具體源碼如下: 

 
 
 
 
  1. @Configuration    
  2. @ConditionalOnProperty(prefix = "spring.mail", name = "host")    
  3. class MailSenderPropertiesConfiguration {    
  4.     private final MailProperties properties;    
  5.     MailSenderPropertiesConfiguration(MailProperties properties) {   
  6.         this.properties = properties;    
  7.     }    
  8.     @Bean    
  9.     @ConditionalOnMissingBean    
  10.     public JavaMailSenderImpl mailSender() {   
  11.         JavaMailSenderImpl sender = new JavaMailSenderImpl();    
  12.         applyProperties(sender);    
  13.         return sender;    
  14.     } 

其中MailProperties是關(guān)于郵件服務(wù)器的配置信息,具體源碼如下: 

 
 
 
 
  1. @ConfigurationProperties(prefix = "spring.mail")    
  2. public class MailProperties {    
  3.     private static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;    
  4.     private String host;    
  5.     private Integer port;    
  6.     private String username;    
  7.     private String password;    
  8.     private String protocol = "smtp";    
  9.     private Charset defaultEncoding = DEFAULT_CHARSET;   
  10.     private Map properties = new HashMap<>();    

一、開啟郵件服務(wù)

登陸網(wǎng)易郵箱163,在設(shè)置中打開并勾選POP3/SMTP/IMAP服務(wù),然后會得到一個授權(quán)碼,這個郵箱和授權(quán)碼將用作登陸認(rèn)證。

二、配置郵件服務(wù)

首先咱們通過 Spring Initializr  創(chuàng)建工程springboot-send-mail,如圖所示:推薦看下:年輕人的第一個 Spring Boot 應(yīng)用。

然后在pom.xml 引入web、thymeleaf 和spring-boot-starter-mail等相關(guān)依賴。例如: 

 
 
 
 
  1.     
  2.             
  3.             org.springframework.boot   
  4.             spring-boot-starter-web    
  5.             
  6.             
  7.             org.springframework.boot   
  8.             spring-boot-starter-thymeleaf    
  9.             
  10.             
  11.             org.springframework.boot   
  12.             spring-boot-starter-mail    
  13.             
  14.             
  15.             org.webjars   
  16.             webjars-locator-core    
  17.             
  18.             
  19.             org.webjars   
  20.             jquery    
  21.             3.3.1    
  22.             
  23.             
  24.             org.webjars    
  25.             bootstrap    
  26.             3.3.7    
  27.             
  28.             
  29.             org.springframework.boot    
  30.             spring-boot-devtools    
  31.             runtime    
  32.             
  33.             
  34.             org.springframework.boot  
  35.             spring-boot-starter-test    
  36.             test    
  37.             
  38.      

根據(jù)前面提到的配置項(MailProperties)填寫相關(guān)配置信息,其中spring.mail.username 表示連接郵件服務(wù)器時認(rèn)證的登陸賬號,可以是普通的手機(jī)號或者登陸賬號,并非一定是郵箱,為了解決這個問題,推薦大家在spring.mail. properties.from填寫郵件發(fā)信人即真實郵箱。

然后在application.yml添加如下配置: 

 
 
 
 
  1. spring:    
  2.   mail:    
  3.     host: smtp.163.com #SMTP服務(wù)器地址    
  4.     username: socks #登陸賬號    
  5.     password: 123456 #登陸密碼(或授權(quán)碼)   
  6.     properties:    
  7.       from: socks@163.com #郵件發(fā)信人(即真實郵箱)  
  8.   thymeleaf:    
  9.     cache: false    
  10.     prefix: classpath:/views/   
  11.   servlet:    
  12.     multipart:    
  13.       max-file-size: 10MB #限制單個文件大小    
  14.       max-request-size: 50MB #限制請求總量 

透過前面的進(jìn)階知識,我們知道在發(fā)送郵件前,需要先構(gòu)建 SimpleMailMessage或 MimeMessage 郵件信息類來填寫郵件標(biāo)題、郵件內(nèi)容等信息,最后提交給JavaMailSenderImpl發(fā)送郵件,這樣看起來沒什么問題,也能實現(xiàn)既定目標(biāo),但在實際使用中會出現(xiàn)大量零散和重復(fù)的代碼,還不便于保存郵件到數(shù)據(jù)庫。

那么優(yōu)雅的發(fā)送郵件應(yīng)該是如何的呢?應(yīng)該屏蔽掉這些構(gòu)建信息和發(fā)送郵件的細(xì)節(jié),不管是簡單還是復(fù)雜郵件,都可以通過統(tǒng)一的API來發(fā)送郵件。例如:mailService.send(mailVo) 。

例如通過郵件信息類(MailVo) 來保存發(fā)送郵件時的郵件主題、郵件內(nèi)容等信息 : 

 
 
 
 
  1. package com.hehe.vo;    
  2. public class MailVo {    
  3.     private String id;    
  4.     private String from;    
  5.     private String to;    
  6.     private String subject;    
  7.     private String text;    
  8.     private Date sentDate;    
  9.     private String cc;    
  10.     private String bcc;    
  11.     private String status;    
  12.     private String error;    
  13.     @JsonIgnore    
  14.     private MultipartFile[] multipartFiles;   

三、發(fā)送郵件和附件

除了發(fā)送郵件之外,還包括檢測郵件和保存郵件等操作,例如:

  •  檢測郵件  checkMail();  首先校驗郵件收信人、郵件主題和郵件內(nèi)容這些必填項,若為空則拒絕發(fā)送。
  •  發(fā)送郵件  sendMimeMail();  其次通過MimeMessageHelper來解析MailVo并構(gòu)建MimeMessage傳輸郵件。
  •  保存郵件  sendMimeMail(); 最后將郵件保存到數(shù)據(jù)庫,便于統(tǒng)計和追查郵件問題。

本案例郵件業(yè)務(wù)類 MailService 的具體源碼如下: 

 
 
 
 
  1. package com.hehe.service;    
  2. @Service    
  3. public class MailService {    
  4.     private Logger logger = LoggerFactory.getLogger(getClass());  
  5.     @Autowired    
  6.     private JavaMailSenderImpl mailSender;    
  7.     public MailVo sendMail(MailVo mailVo) {   
  8.         try {    
  9.             checkMail(mailVo);    
  10.             sendMimeMail(mailVo);    
  11.             return saveMail(mailVo);    
  12.         } catch (Exception e) {    
  13.             logger.error("發(fā)送郵件失敗:", e);   
  14.             mailVo.setStatus("fail");    
  15.             mailVo.setError(e.getMessage());    
  16.             return mailVo;    
  17.         }    
  18.     }    
  19.     private void checkMail(MailVo mailVo) {  
  20.         if (StringUtils.isEmpty(mailVo.getTo())) {    
  21.             throw new RuntimeException("郵件收信人不能為空");    
  22.         }    
  23.         if (StringUtils.isEmpty(mailVo.getSubject())) {  
  24.             throw new RuntimeException("郵件主題不能為空");   
  25.         }    
  26.         if (StringUtils.isEmpty(mailVo.getText())) {    
  27.             throw new RuntimeException("郵件內(nèi)容不能為空");   
  28.         }    
  29.     }    
  30.     private void sendMimeMail(MailVo mailVo) {    
  31.         try {    
  32.             MimeMessageHelper messageHelper = new MimeMessageHelper(mailSender.createMimeMessage(), true);  
  33.             mailVo.setFrom(getMailSendFrom());    
  34.             messageHelper.setFrom(mailVo.getFrom());    
  35.             messageHelper.setTo(mailVo.getTo().split(","));    
  36.             messageHelper.setSubject(mailVo.getSubject());    
  37.             messageHelper.setText(mailVo.getText());    
  38.             if (!StringUtils.isEmpty(mailVo.getCc())) {    
  39.                 messageHelper.setCc(mailVo.getCc().split(","));    
  40.             }    
  41.             if (!StringUtils.isEmpty(mailVo.getBcc())) {    
  42.                 messageHelper.setCc(mailVo.getBcc().split(","));  
  43.             }    
  44.             if (mailVo.getMultipartFiles() != null) {    
  45.                 for (MultipartFile multipartFile : mailVo.getMultipartFiles()) {    
  46.                     messageHelper.addAttachment(multipartFile.getOriginalFilename(), multipartFile);    
  47.                 }    
  48.             }    
  49.             if (StringUtils.isEmpty(mailVo.getSentDate())) {    
  50.                 mailVo.setSentDate(new Date());    
  51.                 messageHelper.setSentDate(mailVo.getSentDate());    
  52.             }    
  53.             mailSender.send(messageHelper.getMimeMessage());    
  54.             mailVo.setStatus("ok");    
  55.             logger.info("發(fā)送郵件成功:{}->{}", mailVo.getFrom(), mailVo.getTo());  
  56.         } catch (Exception e) {    
  57.             throw new RuntimeException(e);    
  58.         }    
  59.     }    
  60.     private MailVo saveMail(MailVo mailVo) {    
  61.         return mailVo;    
  62.     }    
  63.     public String getMailSendFrom() {    
  64.         return mailSender.getJavaMailProperties().getProperty("from");  
  65.     }    

搞定了發(fā)送郵件最核心的業(yè)務(wù)邏輯,接下來咱們寫一個簡單頁面用來發(fā)送郵件。Spring Boot 如何快速改造老項目?推薦看下。

首先寫好跟頁面交互的控制器 MailController,具體源碼如下: 

 
 
 
 
  1. @RestController    
  2. public class MailController {   
  3.     @Autowired    
  4.     private MailService mailService;    
  5.     @GetMapping("/")    
  6.     public ModelAndView index() {   
  7.         ModelAndView mv = new ModelAndView("mail/sendMail");    
  8.         mv.addObject("from", mailService.getMailSendFrom());    
  9.         return mv;    
  10.     }    
  11.     @PostMapping("/mail/send")    
  12.     public MailVo sendMail(MailVo mailVo, MultipartFile[] files) {    
  13.         mailVo.setMultipartFiles(files);    
  14.         return mailService.sendMail(mailVo);    
  15.     }    

然后在/resources/views/mail目錄新建sendMail.html,具體源碼如下: 

 
 
 
 
  1.     
  2.   
  3.     
  4.         
  5.     發(fā)送郵件    
  6.         
  7.         
  8.         
  9.     
  10.     
  11.     
  12.     
  13.              onMouseOut="this.start();$('#egg').text('嗯 真聽話!');"   
  14.               onMouseOver="this.stop();$('#egg').text('有本事放開我呀!');">    
  15.         祝大家新年快樂!    
  16.         
  17.        
  18.             
  19.             郵件發(fā)信人:    
  20.                 
  21.                   
  22.             
    
  •         
  •     
  •             
  •             郵件收信人:    
  •                 
  •                     
  •             
  •     
  •         
  •     
  •             
  •             郵件主題:    
  •                 
  •                     
  •             
  •     
  •         
  •     
  •             
  •             郵件內(nèi)容:   
  •                 
  •                     
  •             
  •     
  •         
  •     
  •             
  •             郵件附件:   
  •                 
  •                   
  •             
  •     
  •         
  •     
  •             
  •             郵件操作:  
  •                 
  •                 發(fā)送郵件   
  •             
  •     
  •                 
  •                 清空    
  •             
  •     
  •             
  •         
  •         
  •     
  •     
  •  
  • 四、測試發(fā)送郵件

    如果是初學(xué)者,建議大家先下載源碼,修改配置后運行工程,成功后再自己重新寫一遍代碼,這樣有助于加深記憶。關(guān)注公眾號:Java技術(shù)棧,回復(fù):boot,獲取 Spring Boot 系列教程。

    啟動工程并訪問:http://localhost:8080  然后可以看到發(fā)送郵件的主界面如下:

    然后填寫你的小號郵箱,點擊發(fā)送郵件,若成功則可以登陸小號郵箱查看郵件和剛才上傳的附件。

    五、常見失敗編碼

    如果企業(yè)定制了郵件服務(wù)器,自然會記錄郵件日志,根據(jù)錯誤編碼存儲日志有利于日常維護(hù)。1 分鐘教會你用 Spring Boot 發(fā)郵件,推薦看下。

    例如這些由網(wǎng)易郵箱提供的錯誤編碼標(biāo)識:

    421

    421 HL:REP 該IP發(fā)送行為異常,存在接收者大量不存在情況,被臨時禁止連接。請檢查是否有用戶發(fā)送病毒或者垃圾郵件,并核對發(fā)送列表有效性; 

    421 HL:ICC 該IP同時并發(fā)連接數(shù)過大,超過了網(wǎng)易的限制,被臨時禁止連接。請檢查是否有用戶發(fā)送病毒或者垃圾郵件,并降低IP并發(fā)連接數(shù)量; 

    421 HL:IFC 該IP短期內(nèi)發(fā)送了大量信件,超過了網(wǎng)易的限制,被臨時禁止連接。請檢查是否有用戶發(fā)送病毒或者垃圾郵件,并降低發(fā)送頻率; 

    421 HL:MEP 該IP發(fā)送行為異常,存在大量偽造發(fā)送域域名行為,被臨時禁止連接。請檢查是否有用戶發(fā)送病毒或者垃圾郵件,并使用真實有效的域名發(fā)送;

    450

    450 MI:CEL 發(fā)送方出現(xiàn)過多的錯誤指令。請檢查發(fā)信程序; 

    450 MI:DMC 當(dāng)前連接發(fā)送的郵件數(shù)量超出限制。請減少每次連接中投遞的郵件數(shù)量; 

    450 MI:CCL 發(fā)送方發(fā)送超出正常的指令數(shù)量。請檢查發(fā)信程序; 

    450 RP:DRC 當(dāng)前連接發(fā)送的收件人數(shù)量超出限制。請控制每次連接投遞的郵件數(shù)量; 

    450 RP:CCL 發(fā)送方發(fā)送超出正常的指令數(shù)量。請檢查發(fā)信程序; 

    450 DT:RBL 發(fā)信IP位于一個或多個RBL里。請參考http://www.rbls.org/關(guān)于RBL的相關(guān)信息; 

    450 WM:BLI 該IP不在網(wǎng)易允許的發(fā)送地址列表里; 

    450 WM:BLU 此用戶不在網(wǎng)易允許的發(fā)信用戶列表里;

    451

    451 DT:SPM ,please try again 郵件正文帶有垃圾郵件特征或發(fā)送環(huán)境缺乏規(guī)范性,被臨時拒收。請保持郵件隊列,兩分鐘后重投郵件。需調(diào)整郵件內(nèi)容或優(yōu)化發(fā)送環(huán)境; 

    451 Requested mail action not taken: too much fail authentication 登錄失敗次數(shù)過多,被臨時禁止登錄。請檢查密碼與帳號驗證設(shè)置; 

    451 RP:CEL 發(fā)送方出現(xiàn)過多的錯誤指令。請檢查發(fā)信程序; 

    451 MI:DMC 當(dāng)前連接發(fā)送的郵件數(shù)量超出限制。請控制每次連接中投遞的郵件數(shù)量; 

    451 MI:SFQ 發(fā)信人在15分鐘內(nèi)的發(fā)信數(shù)量超過限制,請控制發(fā)信頻率; 

    451 RP:QRC 發(fā)信方短期內(nèi)累計的收件人數(shù)量超過限制,該發(fā)件人被臨時禁止發(fā)信。請降低該用戶發(fā)信頻率; 

    451 Requested action aborted: local error in processing 系統(tǒng)暫時出現(xiàn)故障,請稍后再次嘗試發(fā)送;

    500

    500 Error: bad syntaxU
    本文名稱:SpringBoot發(fā)郵件和附件,超實用!
    網(wǎng)站網(wǎng)址:http://www.5511xx.com/article/ccehpsi.html

    其他資訊