Boot 邮件服务
发送邮件是网站的必备功能之一,什么注册验证,忘记密码或者是给用户发送推送信息。早期Java应用使用 JavaMail 相关 api 来写发送邮件的相关代码,后来 Spring 推出了 JavaMailSender 更加简化了邮件发送的过程,在之后 Spring Boot 对此进行了封装就有了现在的 spring-boot-starter-mail ,本章文章的介绍主要来自于此包。
一、简单使用
1、Pom.xml配置
在Pom.xml 中 <dependencies> 和 </dependencies> 之间,添加如下依赖代码:
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-mail</artifactId>
- </dependency>
2、添加application配置
如果使用的是 application.properties,则添加如下配置:
- spring.mail.host=smtp.126.com //邮箱服务器地址,此处为126真实的SMTP服务器地址,请确保你发送邮件的主体账号开通了smtp服务
- spring.mail.username=xxxxx //发送邮件的主体账号用户名
- spring.mail.password=xxyyooo //发送邮件的主体账号密码
- spring.mail.default-encoding=UTF-8
- mail.fromMail.addr=xxxxx@126.com //以谁来发送邮件,一般默认为账号名+邮局域名
这里的邮箱服务器地址,需要去各个提供Email服务的网站查看,一般在“设置”里面。
相应的,如果用的是 application.yml,则在spring根节点下面加上如下配置:
- mail:
- host: smtp.126.com #邮箱服务器地址,此处为126真实的SMTP服务器地址,请确保你发送邮件的主体账号开通了smtp服务
- username: xxxxx #发送邮件的主体账号用户名
- password: xxyyooo #发送邮件的主体账号密码
- default-encoding: UTF-8
新建mail根节点:
- mail:
- fromMail:
- addr: xxxxx@oo.com #以谁来发送邮件,一般默认为账号名+邮局域名
3、编写service层
在主程序的service文件夹,新建一个邮件类接口 MailService接口 ,完整代码如下:
- package com.w3xue.jiaocheng.service;
- public interface MailService {
- public String sendSimpleMail(String to, String title, String content);
- }
这里只预定义了一个方法sendSimpleMail。下面,我们在service文件夹,再新建一个邮件接口实现类 MailServiceImpl类 ,完整代码如下:
- package com.w3xue.jiaocheng.service;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.mail.SimpleMailMessage;
- import org.springframework.mail.javamail.JavaMailSender;
- import org.springframework.stereotype.Component;
- @Component
- public class MailServiceImpl implements MailService{
- @Autowired
- private JavaMailSender mailSender;
- @Value("${mail.fromMail.addr}")
- private String from;
- @Override
- public String sendSimpleMail(String to, String title, String content) {
- SimpleMailMessage message = new SimpleMailMessage();
- message.setFrom(from);
- message.setTo(to);
- message.setSubject(title);
- message.setText(content);
- try {
- mailSender.send(message);
- return "简单邮件已经发送。";
- } catch (Exception e) {
- return "发送简单邮件时发生异常!";
- }
- }
- }
4、应用到Controller层
下面,我们在Controller层中,使用刚才定义的方法。在 MainRestController类 中,先自动装配一个MailServiceImpl类:
- @Autowired
- private MailServiceImpl mailServiceImpl;
然后,再定义一个方法和路由进行使用:
- //发送简要邮件
- @RequestMapping(value = "/email1")
- public String email1() {
- return mailServiceImpl.sendSimpleMail("xxxxx@qq.com","test simple mail","hello this is simple mail");
- }
我们在浏览器中,访问“http://localhost:8080/jiaocheng/email1”,如果一切顺利,就会显示如下文字:
- 简单邮件已经发送。
然后,我们打开xxxxx@qq.com邮箱,就会发现,收到了一封邮件,标题为“test simple mail”,内容为“hello this is simple mail”。至此,我们的第一封邮件发送成功!
二、发送富文本邮件
在上一节中,我们已经成功发送了一封简单的邮件。但是,它只有文本,没有任何形式的图片、链接、附件等等。毫无疑问,我们需要这些富文本形式丰富我们的邮件的功能和样式。
1、发送HTML格式邮件
在上一节配置的基础上,我们在 MailService 添加 sendHtmlMail 方法:
- public String sendHtmlMail(String to, String title, String content);
相应的,我们在MailServiceImpl类 详细定义这个方法:
- @Override
- public String sendHtmlMail(String to, String subject, String content) {
- MimeMessage message = mailSender.createMimeMessage();
- try {
- //true表示需要创建一个multipart message
- MimeMessageHelper helper = new MimeMessageHelper(message, true);
- helper.setFrom(from);
- helper.setTo(to);
- helper.setSubject(subject);
- helper.setText(content, true);
- mailSender.send(message);
- return "html邮件发送成功";
- } catch (MessagingException e) {
- return "发送html邮件时发生异常!";
- }
- }
我们要相应的引入某些包:
- import org.springframework.mail.javamail.MimeMessageHelper;
- import javax.mail.MessagingException;
- import javax.mail.internet.MimeMessage;
最后,我们在在 MainRestController类 中定义一个方法和路由进行使用刚才定义的方法:
- //发送HTML邮件
- @RequestMapping(value = "/email2")
- public String email2() {
- String content="<html>\n" +
- "<body>\n" +
- " <h3>hello world ! 这是一封Html邮件!</h3>\n" +
- "</body>\n" +
- "</html>";
- return mailServiceImpl.sendHtmlMail("xxxxx@qq.com","test html mail",content);
- }
我们在浏览器中,访问“http://localhost:8080/jiaocheng/email2”,如果一切顺利,就会显示如下文字:
- html邮件发送成功
然后,我们打开xxxxx@qq.com邮箱,就会发现,收到了一封邮件,标题为“test html mail”,内容为:
hello world ! 这是一封Html邮件!
至此,我们的第一封邮件发送成功!
2、发送带附件的邮件
首先,我们在 MailService 添加 sendAttachmentsMail 方法:
- public String sendAttachmentsMail(String to, String subject, String content, String filePath);
相应的,我们在MailServiceImpl类 详细定义这个方法:
- @Override
- public String sendAttachmentsMail(String to, String subject, String content, String filePath){
- MimeMessage message = mailSender.createMimeMessage();
- try {
- MimeMessageHelper helper = new MimeMessageHelper(message, true);
- helper.setFrom(from);
- helper.setTo(to);
- helper.setSubject(subject);
- helper.setText(content, true);
- FileSystemResource file = new FileSystemResource(new File(filePath));
- String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
- helper.addAttachment(fileName, file);
- mailSender.send(message);
- return "带附件的邮件已经发送。";
- } catch (MessagingException e) {
- return "发送带附件的邮件时发生异常!";
- }
- }
添加多个附件可以使用多条 helper.addAttachment(fileName2, file2)...以此类推。
当然,我们需要在MailServiceImpl类中引入如下依赖包:
- import org.springframework.core.io.FileSystemResource;
- import java.io.File;
最后,我们在 MainRestController类 中定义一个方法和路由进行使用刚才定义的方法:
- //发送带附件的邮件
- @RequestMapping(value = "/email3")
- public String email3() {
- String filePath="H:\\图片\\eagle.jpg";
- return mailServiceImpl.sendAttachmentsMail("xxxxx@qq.com", "主题:带附件的邮件", "有附件,请查收!", filePath);
- }
我们在浏览器中,访问“http://localhost:8080/jiaocheng/email3”,如果一切顺利,就会显示如下文字:
- 带附件的邮件已经发送。
然后,我们打开xxxxx@qq.com邮箱,就会发现,收到了一封邮件,标题为“主题:带附件的邮件”,内容为:"有附件,请查收!",而且还带了一个图片附件:
3、发送带静态资源的邮件
邮件中的静态资源一般就是指图片,首先,我们在 MailService接口 添加 sendAttachmentsMail 方法:
- public String sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId);
然后,我们相应的,在MailServiceImpl类 详细定义这个方法:
- @Override
- public String sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId){
- MimeMessage message = mailSender.createMimeMessage();
- try {
- MimeMessageHelper helper = new MimeMessageHelper(message, true);
- helper.setFrom(from);
- helper.setTo(to);
- helper.setSubject(subject);
- helper.setText(content, true);
- FileSystemResource res = new FileSystemResource(new File(rscPath));
- helper.addInline(rscId, res);
- mailSender.send(message);
- return "嵌入静态资源的邮件已经发送。";
- } catch (MessagingException e) {
- return "发送嵌入静态资源的邮件时发生异常!";
- }
- }
同发送附件邮件一样,我们可以添加多个图片可以使用多条 <img src='cid:" + rscId + "' > 和 helper.addInline(rscId, res) 来实现。
然后,我们在 MainRestController类 中定义一个方法和路由进行使用刚才定义的方法:
- //发送带附件的邮件
- @RequestMapping(value = "/email4")
- public String email4() {
- String rscId = "neo006";
- String content="<html><body>这是有图片的邮件:<img src=\'cid:" + rscId + "\' ></body></html>";
- String imgPath = "H:\\图片【\\eagle.jpg";
- return mailServiceImpl.sendInlineResourceMail("xxxxx@qq.com", "主题:这是有图片的邮件", content, imgPath, rscId);
- }
我们在浏览器中,访问“http://localhost:8080/jiaocheng/email4”,如果一切顺利,就会显示如下文字:
- 嵌入静态资源的邮件已经发送。
然后,我们打开xxxxx@qq.com邮箱,就会发现,收到了一封邮件,标题为“主题:这是有图片的邮件”,内容为:"这是有图片的邮件:"+雕的图片,刚才的雕的图片是嵌入的,而不是作为附件形式。
学习了以上3种方式发送邮件后,市面上支持的邮件功能基本都已经实现。
三、其他问题
如果学会了上面这些,我们基本已经可以正常发送邮件了。但是,还有些问题,需要我们做好思想准备。
1、发送失败
因为各种原因,总会有邮件发送失败的情况,比如:邮件发送过于频繁、网络异常等。在出现这种情况的时候,我们一般会考虑重新重试发送邮件,会分为以下几个步骤来实现:
(1)接收到发送邮件请求,首先记录请求并且入库。
(2)调用邮件发送接口发送邮件,并且将发送结果记录入库。
(3)启动定时系统扫描时间段内,未发送成功并且重试次数小于3次的邮件,进行再次发送
2、异步发送
很多时候邮件发送并不是我们主业务必须关注的结果,比如通知类、提醒类的业务可以允许延时或者失败。这个时候可以采用异步的方式来发送邮件,加快主交易执行速度,在实际项目中可以采用RabbitMQ发送邮件相关参数,监听到消息队列之后启动发送邮件,此处不再详述。
参考自:https://www.cnblogs.com/ityouknow/p/6823356.html
转载本站内容时,请务必注明来自W3xue,违者必究。