MyException - 我的异常网
当前位置:我的异常网» 研发管理 » springboot-邮件服务

springboot-邮件服务

www.MyException.Cn  网友分享于:2018-03-30  浏览:1次
springboot--邮件服务

springboot仍然在狂速发展,才五个多月没有关注,现在看官网已经到1.5.3.RELEASE版本了。准备慢慢在写写springboot相关的文章,本篇文章使用springboot最新版本1.5.3进行开发。

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

简单使用

1、pom包配置

pom包里面添加spring-boot-starter-mail包引用

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

 

2、在application.properties中添加邮箱配置

1.   spring.mail.host=smtp.qiye.163.com //邮箱服务器地址
2.   spring.mail.username=xxx@oo.com //用户名
3.   spring.mail.password=xxyyooo    //密码
4.   spring.mail.default-encoding=UTF-8
5.    
6.   mail.fromMail.addr=xxx@oo.com  //以谁来发送邮件

 

3、编写mailService,这里只提出实现类。

1.   @Component
2.   public class MailServiceImpl implements MailService{
3.    
4.       private final Logger logger = LoggerFactory.getLogger(this.getClass());
5.    
6.       @Autowired
7.       private JavaMailSender mailSender;
8.    
9.       @Value("${mail.fromMail.addr}")
10.      private String from;
11.   
12.      @Override
13.      public void sendSimpleMail(String to, String subject, String content) {
14.          SimpleMailMessage message = new SimpleMailMessage();
15.          message.setFrom(from);
16.          message.setTo(to);
17.          message.setSubject(subject);
18.          message.setText(content);
19.   
20.          try {
21.              mailSender.send(message);
22.              logger.info("简单邮件已经发送。");
23.          } catch (Exception e) {
24.              logger.error("发送简单邮件时发生异常!", e);
25.          }
26.   
27.      }
28.  }

 

4、编写test类进行测试

1.   @RunWith(SpringRunner.class)
2.   @SpringBootTest
3.   public class MailServiceTest {
4.    
5.       @Autowired
6.       private MailService MailService;
7.    
8.       @Test
9.       public void testSimpleMail() throws Exception {
10.          MailService.sendSimpleMail("ityouknow@126.com","test simple mail"," hello this is simple mail");
11.      }
12.  }

 至此一个简单的文本发送就完成了。

加点料

但是在正常使用的过程中,我们通常在邮件中加入图片或者附件来丰富邮件的内容,下面讲介绍如何使用springboot来发送丰富的邮件。

发送html格式邮件

其它都不变在MailService添加sendHtmlMail方法.

1.   public void sendHtmlMail(String to, String subject, String content) {
2.       MimeMessage message = mailSender.createMimeMessage();
3.    
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.          logger.info("html邮件发送成功");
14.      } catch (MessagingException e) {
15.          logger.error("发送html邮件时发生异常!", e);
16.      }
17.  }

 在测试类中构建html内容,测试发送

1.   @Test
2.   public void testHtmlMail() throws Exception {
3.       String content="<html>\n" +
4.               "<body>\n" +
5.               "    <h3>hello world ! 这是一封Html邮件!</h3>\n" +
6.               "</body>\n" +
7.               "</html>";
8.       MailService.sendHtmlMail("ityouknow@126.com","test simple mail",content);
9.   }

 

发送带附件的邮件

在MailService添加sendAttachmentsMail方法.

1.   public void sendAttachmentsMail(String to, String subject, String content, String filePath){
2.       MimeMessage message = mailSender.createMimeMessage();
3.    
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.          logger.info("带附件的邮件已经发送。");
17.      } catch (MessagingException e) {
18.          logger.error("发送带附件的邮件时发生异常!", e);
19.      }
20.  }

 添加多个附件可以使用多条 helper.addAttachment(fileName,file)

在测试类中添加测试方法

1.   @Test
2.   public void sendAttachmentsMail() {
3.       String filePath="e:\\tmp\\application.log";
4.       mailService.sendAttachmentsMail("ityouknow@126.com", "主题:带附件的邮件", "有附件,请查收!", filePath);
5.   }

 

发送带静态资源的邮件

邮件中的静态资源一般就是指图片,在MailService添加sendAttachmentsMail方法.

1.   public void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId){
2.       MimeMessage message = mailSender.createMimeMessage();
3.    
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.          logger.info("嵌入静态资源的邮件已经发送。");
16.      } catch (MessagingException e) {
17.          logger.error("发送嵌入静态资源的邮件时发生异常!", e);
18.      }
19.  }

 在测试类中添加测试方法

1.   @Test
2.   public void sendInlineResourceMail() {
3.       String rscId = "neo006";
4.       String content="<html><body>这是有图片的邮件:<img src=\'cid:" + rscId + "\' ></body></html>";
5.       String imgPath = "C:\\Users\\summer\\Pictures\\favicon.png";
6.    
7.       mailService.sendInlineResourceMail("ityouknow@126.com", "主题:这是有图片的邮件", content, imgPath, rscId);
8.   }

 添加多个图片可以使用多条  和 helper.addInline(rscId,res)来实现

到此所有的邮件发送服务已经完成了。

邮件系统

上面发送邮件的基础服务就这些了,但是如果我们要做成一个邮件系统的话还需要考虑以下几个问题:

邮件模板

我们会经常收到这样的邮件:

1.   尊敬的neo用户:
2.    
3.                 恭喜您注册成为xxx网的用户,,同时感谢您对xxx的关注与支持并欢迎您使用xx的产品与服务。
4.                 ...

 其中只有neo这个用户名在变化,其它邮件内容均不变,如果每次发送邮件都需要手动拼接的话会不够优雅,并且每次模板的修改都需要改动代码的话也很不方便,因此对于这类邮件需求,都建议做成邮件模板来处理。模板的本质很简单,就是在模板中替换变化的参数,转换为html字符串即可,这里以 thymeleaf为例来演示。

1、pom中导入thymeleaf的包

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

 2、在resorces/templates下创建emailTemplate.html

1.   <!DOCTYPE html>
2.   <html lang="zh" xmlns:th="http://www.thymeleaf.org">
3.       <head>
4.           <meta charset="UTF-8"/>
5.           <title>Title</title>
6.       </head>
7.       <body>
8.           您好,这是验证邮件,请点击下面的链接完成验证,<br/>
9.           <a href="#" th:href="@{ http://www.ityouknow.com/neo/{id}(id=${id}) }">激活账号</a>
10.      </body>
11.  </html>

 3、解析模板并发送

1.   @Test
2.   public void sendTemplateMail() {
3.       //创建邮件正文
4.       Context context = new Context();
5.       context.setVariable("id", "006");
6.       String emailContent = templateEngine.process("emailTemplate", context);
7.    
8.       mailService.sendHtmlMail("ityouknow@126.com","主题:这是模板邮件",emailContent);
9.   }

 

发送失败

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

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

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

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

异步发送

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

示例代码:https://github.com/ityouknow/spring-boot-starter

文章来源:http://mp.weixin.qq.com/s/PUN5nY9-Y_eVej1EvdVTtQ

视频学习参考:http://www.roncoo.com/course/list.html?courseName=spring+boot

文章评论

当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
中美印日四国程序员比较
中美印日四国程序员比较
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
Java程序员必看电影
Java程序员必看电影
编程语言是女人
编程语言是女人
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
每天工作4小时的程序员
每天工作4小时的程序员
程序员都该阅读的书
程序员都该阅读的书
代码女神横空出世
代码女神横空出世
那些争议最大的编程观点
那些争议最大的编程观点
程序员和编码员之间的区别
程序员和编码员之间的区别
10个调试和排错的小建议
10个调试和排错的小建议
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
我的丈夫是个程序员
我的丈夫是个程序员
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
老程序员的下场
老程序员的下场
 程序员的样子
程序员的样子
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
为什么程序员都是夜猫子
为什么程序员都是夜猫子
鲜为人知的编程真相
鲜为人知的编程真相
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
程序员应该关注的一些事儿
程序员应该关注的一些事儿
漫画:程序员的工作
漫画:程序员的工作
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
总结2014中国互联网十大段子
总结2014中国互联网十大段子
我是如何打败拖延症的
我是如何打败拖延症的
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
旅行,写作,编程
旅行,写作,编程
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
程序员的鄙视链
程序员的鄙视链
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有