课程表

Spring Boot课程

工具箱
速查手册

Boot 邮件服务

当前位置:免费教程 » Java相关 » Spring Boot

发送邮件是网站的必备功能之一,什么注册验证,忘记密码或者是给用户发送推送信息。早期Java应用使用 JavaMail 相关 api 来写发送邮件的相关代码,后来 Spring 推出了 JavaMailSender 更加简化了邮件发送的过程,在之后 Spring Boot 对此进行了封装就有了现在的 spring-boot-starter-mail ,本章文章的介绍主要来自于此包。


一、简单使用

1、Pom.xml配置

Pom.xml 中 <dependencies> 和 </dependencies> 之间,添加如下依赖代码:

  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-mail</artifactId>
  4. </dependency>

2、添加application配置

如果使用的是 application.properties,则添加如下配置:

  1. spring.mail.host=smtp.126.com //邮箱服务器地址,此处为126真实的SMTP服务器地址,请确保你发送邮件的主体账号开通了smtp服务
  2. spring.mail.username=xxxxx //发送邮件的主体账号用户名
  3. spring.mail.password=xxyyooo    //发送邮件的主体账号密码
  4. spring.mail.default-encoding=UTF-8
  5.  
  6. mail.fromMail.addr=xxxxx@126.com  //以谁来发送邮件,一般默认为账号名+邮局域名

这里的邮箱服务器地址,需要去各个提供Email服务的网站查看,一般在“设置”里面。

相应的,如果用的是 application.yml,则在spring根节点下面加上如下配置:

  1. mail:
  2.   host: smtp.126.com #邮箱服务器地址,此处为126真实的SMTP服务器地址,请确保你发送邮件的主体账号开通了smtp服务
  3.   username: xxxxx #发送邮件的主体账号用户名
  4.   password: xxyyooo    #发送邮件的主体账号密码
  5.   default-encoding: UTF-8

新建mail根节点:

  1. mail:
  2.   fromMail:
  3.     addr: xxxxx@oo.com  #以谁来发送邮件,一般默认为账号名+邮局域名

3、编写service层

在主程序的service文件夹,新建一个邮件类接口 MailService接口 ,完整代码如下:

  1. package com.w3xue.jiaocheng.service;
  2.  
  3. public interface MailService {
  4.     public String sendSimpleMail(String to, String title, String content);
  5.  
  6. }

这里只预定义了一个方法sendSimpleMail。下面,我们在service文件夹,再新建一个邮件接口实现类 MailServiceImpl类 ,完整代码如下:

  1. package com.w3xue.jiaocheng.service;
  2.  
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.beans.factory.annotation.Value;
  5. import org.springframework.mail.SimpleMailMessage;
  6. import org.springframework.mail.javamail.JavaMailSender;
  7. import org.springframework.stereotype.Component;
  8.  
  9. @Component
  10. public class MailServiceImpl implements MailService{
  11.  
  12.     @Autowired
  13.     private JavaMailSender mailSender;
  14.  
  15.     @Value("${mail.fromMail.addr}")
  16.     private String from;
  17.  
  18.     @Override
  19.     public String sendSimpleMail(String to, String title, String content) {
  20.         SimpleMailMessage message = new SimpleMailMessage();
  21.         message.setFrom(from);
  22.         message.setTo(to);
  23.         message.setSubject(title);
  24.         message.setText(content);
  25.  
  26.         try {
  27.             mailSender.send(message);
  28.             return "简单邮件已经发送。";
  29.         } catch (Exception e) {
  30.             return "发送简单邮件时发生异常!";
  31.         }
  32.  
  33.     }
  34. }

4、应用到Controller层

下面,我们在Controller层中,使用刚才定义的方法。在 MainRestController类 中,先自动装配一个MailServiceImpl类

  1. @Autowired
  2. private MailServiceImpl mailServiceImpl;

然后,再定义一个方法和路由进行使用:

  1. //发送简要邮件
  2. @RequestMapping(value = "/email1")
  3. public String email1() {
  4.     return mailServiceImpl.sendSimpleMail("xxxxx@qq.com","test simple mail","hello this is simple mail");
  5. }

我们在浏览器中,访问“http://localhost:8080/jiaocheng/email1”,如果一切顺利,就会显示如下文字:

  1. 简单邮件已经发送。

然后,我们打开xxxxx@qq.com邮箱,就会发现,收到了一封邮件,标题为“test simple mail”,内容为“hello this is simple mail”。至此,我们的第一封邮件发送成功!


二、发送富文本邮件

在上一节中,我们已经成功发送了一封简单的邮件。但是,它只有文本,没有任何形式的图片、链接、附件等等。毫无疑问,我们需要这些富文本形式丰富我们的邮件的功能和样式。

1、发送HTML格式邮件

在上一节配置的基础上,我们在 MailService 添加 sendHtmlMail 方法:

  1. public String sendHtmlMail(String to, String title, String content);

相应的,我们在MailServiceImpl类 详细定义这个方法:

  1. @Override
  2. public String sendHtmlMail(String to, String subject, String content) {
  3.     MimeMessage message = mailSender.createMimeMessage();
  4.     try {
  5.         //true表示需要创建一个multipart message
  6.         MimeMessageHelper helper = new MimeMessageHelper(message, true);
  7.         helper.setFrom(from);
  8.         helper.setTo(to);
  9.         helper.setSubject(subject);
  10.         helper.setText(content, true);
  11.  
  12.         mailSender.send(message);
  13.         return "html邮件发送成功";
  14.     } catch (MessagingException e) {
  15.         return "发送html邮件时发生异常!";
  16.     }
  17. }

我们要相应的引入某些包:

  1. import org.springframework.mail.javamail.MimeMessageHelper;
  2. import javax.mail.MessagingException;
  3. import javax.mail.internet.MimeMessage;

最后,我们在在 MainRestController类 中定义一个方法和路由进行使用刚才定义的方法:

  1. //发送HTML邮件
  2. @RequestMapping(value = "/email2")
  3. public String email2() {
  4.     String content="<html>\n" +
  5.             "<body>\n" +
  6.             "    <h3>hello world ! 这是一封Html邮件!</h3>\n" +
  7.             "</body>\n" +
  8.             "</html>";
  9.     return mailServiceImpl.sendHtmlMail("xxxxx@qq.com","test html mail",content);
  10. }

我们在浏览器中,访问“http://localhost:8080/jiaocheng/email2”,如果一切顺利,就会显示如下文字:

  1. html邮件发送成功

然后,我们打开xxxxx@qq.com邮箱,就会发现,收到了一封邮件,标题为“test html mail”,内容为:

hello world ! 这是一封Html邮件!

至此,我们的第一封邮件发送成功!

2、发送带附件的邮件

首先,我们在 MailService 添加 sendAttachmentsMail 方法:

  1. public String sendAttachmentsMail(String to, String subject, String content, String filePath);

相应的,我们在MailServiceImpl类 详细定义这个方法:

  1. @Override
  2. public String sendAttachmentsMail(String to, String subject, String content, String filePath){
  3.     MimeMessage message = mailSender.createMimeMessage();
  4.     try {
  5.         MimeMessageHelper helper = new MimeMessageHelper(message, true);
  6.         helper.setFrom(from);
  7.         helper.setTo(to);
  8.         helper.setSubject(subject);
  9.         helper.setText(content, true);
  10.  
  11.         FileSystemResource file = new FileSystemResource(new File(filePath));
  12.         String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
  13.         helper.addAttachment(fileName, file);
  14.  
  15.         mailSender.send(message);
  16.         return "带附件的邮件已经发送。";
  17.     } catch (MessagingException e) {
  18.         return "发送带附件的邮件时发生异常!";
  19.     }
  20. }

添加多个附件可以使用多条 helper.addAttachment(fileName2, file2)...以此类推。

当然,我们需要在MailServiceImpl类中引入如下依赖包:

  1. import org.springframework.core.io.FileSystemResource;
  2. import java.io.File;

最后,我们在 MainRestController类 中定义一个方法和路由进行使用刚才定义的方法:

  1. //发送带附件的邮件
  2. @RequestMapping(value = "/email3")
  3. public String email3() {
  4.     String filePath="H:\\图片\\eagle.jpg";
  5.     return mailServiceImpl.sendAttachmentsMail("xxxxx@qq.com", "主题:带附件的邮件", "有附件,请查收!", filePath);
  6. }

我们在浏览器中,访问“http://localhost:8080/jiaocheng/email3”,如果一切顺利,就会显示如下文字:

  1. 带附件的邮件已经发送。

然后,我们打开xxxxx@qq.com邮箱,就会发现,收到了一封邮件,标题为“主题:带附件的邮件”,内容为:"有附件,请查收!",而且还带了一个图片附件:

eagle.jpg

3、发送带静态资源的邮件

邮件中的静态资源一般就是指图片,首先,我们在 MailService接口 添加 sendAttachmentsMail 方法:

  1. public String sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId);

然后,我们相应的,MailServiceImpl类 详细定义这个方法:

  1. @Override
  2. public String sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId){
  3.     MimeMessage message = mailSender.createMimeMessage();
  4.     try {
  5.         MimeMessageHelper helper = new MimeMessageHelper(message, true);
  6.         helper.setFrom(from);
  7.         helper.setTo(to);
  8.         helper.setSubject(subject);
  9.         helper.setText(content, true);
  10.  
  11.         FileSystemResource res = new FileSystemResource(new File(rscPath));
  12.         helper.addInline(rscId, res);
  13.  
  14.         mailSender.send(message);
  15.         return  "嵌入静态资源的邮件已经发送。";
  16.     } catch (MessagingException e) {
  17.         return  "发送嵌入静态资源的邮件时发生异常!";
  18.     }
  19. }

同发送附件邮件一样,我们可以添加多个图片可以使用多条 <img src='cid:" + rscId + "' > 和 helper.addInline(rscId, res) 来实现。

然后,我们在 MainRestController类 中定义一个方法和路由进行使用刚才定义的方法:

  1. //发送带附件的邮件
  2. @RequestMapping(value = "/email4")
  3. public String email4() {
  4.     String rscId = "neo006";
  5.     String content="<html><body>这是有图片的邮件:<img src=\'cid:" + rscId + "\' ></body></html>";
  6.     String imgPath = "H:\\图片【\\eagle.jpg";
  7.     return mailServiceImpl.sendInlineResourceMail("xxxxx@qq.com", "主题:这是有图片的邮件", content, imgPath, rscId);
  8. }

我们在浏览器中,访问“http://localhost:8080/jiaocheng/email4”,如果一切顺利,就会显示如下文字:

  1. 嵌入静态资源的邮件已经发送。

然后,我们打开xxxxx@qq.com邮箱,就会发现,收到了一封邮件,标题为“主题:这是有图片的邮件”,内容为:"这是有图片的邮件:"+雕的图片,刚才的雕的图片是嵌入的,而不是作为附件形式。

学习了以上3种方式发送邮件后,市面上支持的邮件功能基本都已经实现。


三、其他问题

如果学会了上面这些,我们基本已经可以正常发送邮件了。但是,还有些问题,需要我们做好思想准备。

1、发送失败

因为各种原因,总会有邮件发送失败的情况,比如:邮件发送过于频繁、网络异常等。在出现这种情况的时候,我们一般会考虑重新重试发送邮件,会分为以下几个步骤来实现:

(1)接收到发送邮件请求,首先记录请求并且入库。

(2)调用邮件发送接口发送邮件,并且将发送结果记录入库。

(3)启动定时系统扫描时间段内,未发送成功并且重试次数小于3次的邮件,进行再次发送

2、异步发送

很多时候邮件发送并不是我们主业务必须关注的结果,比如通知类、提醒类的业务可以允许延时或者失败。这个时候可以采用异步的方式来发送邮件,加快主交易执行速度,在实际项目中可以采用RabbitMQ发送邮件相关参数,监听到消息队列之后启动发送邮件,此处不再详述。

参考自:https://www.cnblogs.com/ityouknow/p/6823356.html

转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号