日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
SpringBoot郵件發(fā)送的5種姿勢

郵件發(fā)送其實是一個非常常見的需求,用戶注冊,找回密碼等地方,都會用到,使用 JavaSE 代碼發(fā)送郵件,步驟還是挺繁瑣的,Spring Boot 中對于郵件發(fā)送,提供了相關的自動化配置類,使得郵件發(fā)送變得非常容易,本文我們就來一探究竟!看看使用 Spring Boot 發(fā)送郵件的 5 中姿勢。

創(chuàng)新互聯(lián)公司是專業(yè)的肅寧網(wǎng)站建設公司,肅寧接單;提供成都做網(wǎng)站、網(wǎng)站建設,網(wǎng)頁設計,網(wǎng)站設計,建網(wǎng)站,PHP網(wǎng)站建設等專業(yè)做網(wǎng)站服務;采用PHP框架,可快速的進行肅寧網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!

郵件基礎

我們經(jīng)常會聽到各種各樣的郵件協(xié)議,比如 SMTP、POP3、IMAP ,那么這些協(xié)議有什么作用,有什么區(qū)別?我們先來討論一下這個問題。

SMTP 是一個基于 TCP/IP 的應用層協(xié)議,江湖地位有點類似于 HTTP,SMTP 服務器默認監(jiān)聽的端口號為 25 ??吹竭@里,小伙伴們可能會想到既然 SMTP 協(xié)議是基于 TCP/IP 的應用層協(xié)議,那么我是不是也可以通過 Socket 發(fā)送一封郵件呢?回答是肯定的。

生活中我們投遞一封郵件要經(jīng)過如下幾個步驟:

  1. 深圳的小王先將郵件投遞到深圳的郵局
  2. 深圳的郵局將郵件運送到上海的郵局
  3. 上海的小張來郵局取郵件

這是一個縮減版的生活中郵件發(fā)送過程。這三個步驟可以分別對應我們的郵件發(fā)送過程,假設從 aaa@qq.com 發(fā)送郵件到 111@163.com :

  1. aaa@qq.com 先將郵件投遞到騰訊的郵件服務器
  2. 騰訊的郵件服務器將我們的郵件投遞到網(wǎng)易的郵件服務器
  3. 111@163.com 登錄網(wǎng)易的郵件服務器查看郵件

郵件投遞大致就是這個過程,這個過程就涉及到了多個協(xié)議,我們來分別看一下。

SMTP 協(xié)議全稱為 Simple Mail Transfer Protocol,譯作簡單郵件傳輸協(xié)議,它定義了郵件客戶端軟件與 SMTP 服務器之間,以及 SMTP 服務器與 SMTP 服務器之間的通信規(guī)則。

也就是說 aaa@qq.com 用戶先將郵件投遞到騰訊的 SMTP 服務器這個過程就使用了 SMTP 協(xié)議,然后騰訊的 SMTP 服務器將郵件投遞到網(wǎng)易的 SMTP 服務器這個過程也依然使用了 SMTP 協(xié)議,SMTP 服務器就是用來收郵件。

而 POP3 協(xié)議全稱為 Post Office Protocol ,譯作郵局協(xié)議,它定義了郵件客戶端與 POP3 服務器之間的通信規(guī)則,那么該協(xié)議在什么場景下會用到呢?當郵件到達網(wǎng)易的 SMTP 服務器之后, 111@163.com 用戶需要登錄服務器查看郵件,這個時候就該協(xié)議就用上了:郵件服務商都會為每一個用戶提供專門的郵件存儲空間,SMTP 服務器收到郵件之后,就將郵件保存到相應用戶的郵件存儲空間中,如果用戶要讀取郵件,就需要通過郵件服務商的 POP3 郵件服務器來完成。

最后,可能也有小伙伴們聽說過 IMAP 協(xié)議,這個協(xié)議是對 POP3 協(xié)議的擴展,功能更強,作用類似,這里不再贅述。

準備工作

目前國內(nèi)大部分的郵件服務商都不允許直接使用用戶名/密碼的方式來在代碼中發(fā)送郵件,都是要先申請授權碼,這里以 QQ 郵箱為例,向大家演示授權碼的申請流程:首先我們需要先登錄 QQ 郵箱網(wǎng)頁版,點擊上方的設置按鈕:

p266

然后點擊賬戶選項卡:

p267

在賬戶選項卡中找到開啟POP3/SMTP選項,如下:

p268

點擊開啟,開啟相關功能,開啟過程需要手機號碼驗證,按照步驟操作即可,不贅述。開啟成功之后,即可獲取一個授權碼,將該號碼保存好,一會使用。

項目創(chuàng)建

接下來,我們就可以創(chuàng)建項目了,Spring Boot 中,對于郵件發(fā)送提供了自動配置類,開發(fā)者只需要加入相關依賴,然后配置一下郵箱的基本信息,就可以發(fā)送郵件了。

首先創(chuàng)建一個 Spring Boot 項目,引入郵件發(fā)送依賴:

創(chuàng)建完成后,項目依賴如下:

 
 
 
 
  1.     org.springframework.boot
  2.     spring-boot-starter-mail
  3.     org.springframework.boot
  4.     spring-boot-starter-web
  • 配置郵箱基本信息

項目創(chuàng)建成功后,接下來在 application.properties 中配置郵箱的基本信息:

 
 
 
 
  1. spring.mail.host=smtp.qq.com
  2. spring.mail.port=587
  3. spring.mail.username=1510161612@qq.com
  4. spring.mail.password=ubknfzhjkhrbbabe
  5. spring.mail.default-encoding=UTF-8
  6. spring.mail.properties.mail.smtp.socketFactoryClass=javax.net.ssl.SSLSocketFactory
  7. spring.mail.properties.mail.debug=true

配置含義分別如下:

  • 配置 SMTP 服務器地址
  • SMTP 服務器的端口
  • 配置郵箱用戶名
  • 配置密碼,注意,不是真正的密碼,而是剛剛申請到的授權碼
  • 默認的郵件編碼
  • 配飾 SSL 加密工廠
  • 表示開啟 DEBUG 模式,這樣,郵件發(fā)送過程的日志會在控制臺打印出來,方便排查錯誤

如果不知道 smtp 服務器的端口或者地址的的話,可以參考 騰訊的郵箱文檔

  • https://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=371

做完這些之后,Spring Boot 就會自動幫我們配置好郵件發(fā)送類,相關的配置在 org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration 類中,部分源碼如下:

 
 
 
 
  1. @Configuration
  2. @ConditionalOnClass({ MimeMessage.class, MimeType.class, MailSender.class })
  3. @ConditionalOnMissingBean(MailSender.class)
  4. @Conditional(MailSenderCondition.class)
  5. @EnableConfigurationProperties(MailProperties.class)
  6. @Import({ MailSenderJndiConfiguration.class, MailSenderPropertiesConfiguration.class })
  7. public class MailSenderAutoConfiguration {
  8. }

從這段代碼中,可以看到,導入了另外一個配置 MailSenderPropertiesConfiguration 類,這個類中,提供了郵件發(fā)送相關的工具類:

 
 
 
 
  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.         }
  15. }

可以看到,這里創(chuàng)建了一個 JavaMailSenderImpl 的實例, JavaMailSenderImpl 是 JavaMailSender 的一個實現(xiàn),我們將使用 JavaMailSenderImpl 來完成郵件的發(fā)送工作。

做完如上兩步,郵件發(fā)送的準備工作就算是完成了,接下來就可以直接發(fā)送郵件了。

具體的發(fā)送,有 5 種不同的方式,我們一個一個來看。

發(fā)送簡單郵件

簡單郵件就是指郵件內(nèi)容是一個普通的文本文檔:

 
 
 
 
  1. @Autowired
  2. JavaMailSender javaMailSender;
  3. @Test
  4. public void sendSimpleMail() {
  5.     SimpleMailMessage message = new SimpleMailMessage();
  6.     message.setSubject("這是一封測試郵件");
  7.     message.setFrom("1510161612@qq.com");
  8.     message.setTo("25xxxxx755@qq.com");
  9.     message.setCc("37xxxxx37@qq.com");
  10.     message.setBcc("14xxxxx098@qq.com");
  11.     message.setSentDate(new Date());
  12.     message.setText("這是測試郵件的正文");
  13.     javaMailSender.send(message);
  14. }

從上往下,代碼含義分別如下:

  1. 構建一個郵件對象
  2. 設置郵件主題
  3. 設置郵件發(fā)送者
  4. 設置郵件接收者,可以有多個接收者
  5. 設置郵件抄送人,可以有多個抄送人
  6. 設置隱秘抄送人,可以有多個
  7. 設置郵件發(fā)送日期
  8. 設置郵件的正文
  9. 發(fā)送郵件

最后執(zhí)行該方法,就可以實現(xiàn)郵件的發(fā)送,發(fā)送效果圖如下:

發(fā)送帶附件的郵件

郵件的附件可以是圖片,也可以是普通文件,都是支持的。

 
 
 
 
  1. @Test
  2. public void sendAttachFileMail() throws MessagingException {
  3.     MimeMessage mimeMessage = javaMailSender.createMimeMessage();
  4.     MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);
  5.     helper.setSubject("這是一封測試郵件");
  6.     helper.setFrom("1510161612@qq.com");
  7.     helper.setTo("25xxxxx755@qq.com");
  8.     helper.setCc("37xxxxx37@qq.com");
  9.     helper.setBcc("14xxxxx098@qq.com");
  10.     helper.setSentDate(new Date());
  11.     helper.setText("這是測試郵件的正文");
  12.     helper.addAttachment("javaboy.jpg",new File("C:\\Users\\sang\\Downloads\\javaboy.png"));
  13.     javaMailSender.send(mimeMessage);
  14. }

注意這里在構建郵件對象上和前文有所差異,這里是通過 javaMailSender 來獲取一個復雜郵件對象,然后再利用 MimeMessageHelper 對郵件進行配置,MimeMessageHelper 是一個郵件配置的輔助工具類,創(chuàng)建時候的 true 表示構建一個 multipart message 類型的郵件,有了 MimeMessageHelper 之后,我們針對郵件的配置都是由 MimeMessageHelper 來代勞。

最后通過 addAttachment 方法來添加一個附件。

執(zhí)行該方法,郵件發(fā)送效果圖如下:

發(fā)送帶圖片資源的郵件

圖片資源和附件有什么區(qū)別呢?圖片資源是放在郵件正文中的,即一打開郵件,就能看到圖片。但是一般來說,不建議使用這種方式,一些公司會對郵件內(nèi)容的大小有限制(因為這種方式是將圖片一起發(fā)送的)。

 
 
 
 
  1. @Test
  2. public void sendImgResMail() throws MessagingException {
  3.     MimeMessage mimeMessage = javaMailSender.createMimeMessage();
  4.     MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
  5.     helper.setSubject("這是一封測試郵件");
  6.     helper.setFrom("1510161612@qq.com");
  7.     helper.setTo("25xxxxx755@qq.com");
  8.     helper.setCc("37xxxxx37@qq.com");
  9.     helper.setBcc("14xxxxx098@qq.com");
  10.     helper.setSentDate(new Date());
  11.     helper.setText("

    hello 大家好,這是一封測試郵件,這封郵件包含兩種圖片,分別如下

    第一張圖片:

    第二張圖片:

    ",true);
  12.     helper.addInline("p01",new FileSystemResource(new File("C:\\Users\\sang\\Downloads\\javaboy.png")));
  13.     helper.addInline("p02",new FileSystemResource(new File("C:\\Users\\sang\\Downloads\\javaboy2.png")));
  14.     javaMailSender.send(mimeMessage);
  15. }

這里的郵件 text 是一個 HTML 文本,里邊涉及到的圖片資源先用一個占位符占著,setText 方法的第二個參數(shù) true 表示第一個參數(shù)是一個 HTML 文本。

setText 之后,再通過 addInline 方法來添加圖片資源。

最后執(zhí)行該方法,發(fā)送郵件,效果如下:

在公司實際開發(fā)中,第一種和第三種都不是使用最多的郵件發(fā)送方案。因為正常來說,郵件的內(nèi)容都是比較的豐富的,所以大部分郵件都是通過 HTML 來呈現(xiàn)的,如果直接拼接 HTML 字符串,這樣以后不好維護,為了解決這個問題,一般郵件發(fā)送,都會有相應的郵件模板。最具代表性的兩個模板就是 Freemarker 模板和 Thyemeleaf 模板了。

使用 Freemarker 作郵件模板

首先需要引入 Freemarker 依賴:

 
 
 
 
  1.     org.springframework.boot
  2.     spring-boot-starter-freemarker

然后在 resources/templates 目錄下創(chuàng)建一個 mail.ftl 作為郵件發(fā)送模板:

 
 
 
 
  1.     
  2.     Title
  3. hello 歡迎加入 xxx 大家庭,您的入職信息如下:

  4.     
  5.         姓名
  6.         ${username}
  7.     
  8.     
  9.         工號
  10.         ${num}
  11.     
  12.     
  13.         薪水
  14.         ${salary}
  15.     
  16. 一起努力創(chuàng)造輝煌
  • 接下來,將郵件模板渲染成 HTML ,然后發(fā)送即可。

     
     
     
     
    1. @Test
    2. public void sendFreemarkerMail() throws MessagingException, IOException, TemplateException {
    3.     MimeMessage mimeMessage = javaMailSender.createMimeMessage();
    4.     MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
    5.     helper.setSubject("這是一封測試郵件");
    6.     helper.setFrom("1510161612@qq.com");
    7.     helper.setTo("25xxxxx755@qq.com");
    8.     helper.setCc("37xxxxx37@qq.com");
    9.     helper.setBcc("14xxxxx098@qq.com");
    10.     helper.setSentDate(new Date());
    11.     //構建 Freemarker 的基本配置
    12.     Configuration configuration = new Configuration(Configuration.VERSION_2_3_0);
    13.     // 配置模板位置
    14.     ClassLoader loader = MailApplication.class.getClassLoader();
    15.     configuration.setClassLoaderForTemplateLoading(loader, "templates");
    16.     //加載模板
    17.     Template template = configuration.getTemplate("mail.ftl");
    18.     User user = new User();
    19.     user.setUsername("javaboy");
    20.     user.setNum(1);
    21.     user.setSalary((double) 99999);
    22.     StringWriter out = new StringWriter();
    23.     //模板渲染,渲染的結果將被保存到 out 中 ,將out 中的 html 字符串發(fā)送即可
    24.     template.process(user, out);
    25.     helper.setText(out.toString(),true);
    26.     javaMailSender.send(mimeMessage);
    27. }

    需要注意的是,雖然引入了 Freemarker 的自動化配置,但是我們在這里是直接 new Configuration 來重新配置 Freemarker 的,所以 Freemarker 默認的配置這里不生效,因此,在填寫模板位置時,值為 templates 。

    調(diào)用該方法,發(fā)送郵件,效果圖如下:

    使用 Thymeleaf 作郵件模板

    推薦在 Spring Boot 中使用 Thymeleaf 來構建郵件模板。因為 Thymeleaf 的自動化配置提供了一個 TemplateEngine,通過 TemplateEngine 可以方便的將 Thymeleaf 模板渲染為 HTML ,同時,Thymeleaf 的自動化配置在這里是繼續(xù)有效的 。

    首先,引入 Thymeleaf 依賴:

     
     
     
     
    1.     org.springframework.boot
    2.     spring-boot-starter-thymeleaf

    然后,創(chuàng)建 Thymeleaf 郵件模板:

     
     
     
     
    1.     
    2.     Title
    3. hello 歡迎加入 xxx 大家庭,您的入職信息如下:

    4.     
    5.         姓名
    6.         
    7.     
    8.     
    9.         工號
    10.         
    11.     
    12.     
    13.         薪水
    14.         
    15.     
    16. 一起努力創(chuàng)造輝煌
  • 接下來發(fā)送郵件:

     
     
     
     
    1. @Autowired
    2. TemplateEngine templateEngine;
    3. @Test
    4. public void sendThymeleafMail() throws MessagingException {
    5.     MimeMessage mimeMessage = javaMailSender.createMimeMessage();
    6.     MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
    7.     helper.setSubject("這是一封測試郵件");
    8.     helper.setFrom("1510161612@qq.com");
    9.     helper.setTo("25xxxxx755@qq.com");
    10.     helper.setCc("37xxxxx37@qq.com");
    11.     helper.setBcc("14xxxxx098@qq.com");
    12.     helper.setSentDate(new Date());
    13.     Context context = new Context();
    14.     context.setVariable("username", "javaboy");
    15.     context.setVariable("num","000001");
    16.     context.setVariable("salary", "99999");
    17.     String process = templateEngine.process("mail.html", context);
    18.     helper.setText(process,true);
    19.     javaMailSender.send(mimeMessage);
    20. }

    調(diào)用該方法,發(fā)送郵件,效果圖如下:

    好了,這就是我們今天說的 5 種郵件發(fā)送姿勢,不知道你掌握了沒有呢?

    本文案例已經(jīng)上傳到 GitHub:https://github.com/lenve/javaboy-code-samples。

    本文轉(zhuǎn)載自微信公眾號「江南一點雨」,可以通過以下二維碼關注。轉(zhuǎn)載本文請聯(lián)系江南一點雨公眾號。


    名稱欄目:SpringBoot郵件發(fā)送的5種姿勢
    當前鏈接:http://www.dlmjj.cn/article/cdpjhee.html