SpringBoot发送邮件
发送邮件原理:
最早的邮件传输协议:
SMTP协议:
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。
POP3协议:
POP3,全名为"Post Office Protocol - Version 3",即"邮局协议版本3"。是TCP/IP协议族中的一员,由RFC1939 定义。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。提供了SSL加密的POP3协议被称为POP3S。
目前邮件传输协议:
IMAP协议:
IMAP(Internet Mail Access Protocol,Internet邮件访问协议)以前称作交互邮件访问协议(Interactive Mail Access Protocol)。IMAP是斯坦福大学在1986年开发的一种邮件获取协议。它的主要作用是邮件客户端(例如MS Outlook Express)可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。当前的权威定义是RFC3501。IMAP协议运行在TCP/IP协议之上,使用的端口是143。它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作。
Mime协议:
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
邮件发送流程:
邮件发送历史:
创建SpringBoot项目配置模板:
导入到 IDEA编辑器中:
可以将模板项目重命名为自定义的,需要修改:
修改项目名,修改pom.xml文件中的两处地方:
修改后我们的项目目录如下:
代码实现:
一、发送文本邮件
第一:引入相关jar包
第二:application.properties配置邮箱参数
第三:封装SimpleMailMessage
第四:JavaMailSender进行发送
第五:测试
第一:pom.xml 中引入 spring-boot-starter-mail
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
第二:添加参数application.properties
第三:src/main/xxxx/service/MailService.java
@Service
public class MailService {
private final Logger logger= LoggerFactory.getLogger(this.getClass());
@Value("${spring.mail.username}")
private String from;
@Autowired
private JavaMailSender javaMailSender;
public void sendSimpleMail(String to,String subject,String content){
logger.info("发送文本邮件开始:{}___{}___{}",to,subject,content);
SimpleMailMessage simpleMailMessage=new SimpleMailMessage();
simpleMailMessage.setTo(to);
simpleMailMessage.setSubject(subject);
simpleMailMessage.setText(content);
simpleMailMessage.setFrom(from);
javaMailSender.send(simpleMailMessage);
}
}
第四:单元测试src/test/xxxx/service/ServiceTest.java
@RunWith(SpringRunner.class)
@SpringBootTest
public class ServiceTest {
@Resource
MailService mailService;
@Resource
TemplateEngine templateEngine;
@Test
public void sendSimpleMailTest(){
mailService.sendSimpleMail("xxxxx@163.com",
"发送第一封文本邮件",
"搭建完毕,发送第一封文本邮件!!!");
}
}
控制台打印日志:说明发送成功
二、发送HTML邮件
src/main/xxxx/service/MailService.java
@Service
public class MailService {
private final Logger logger= LoggerFactory.getLogger(this.getClass());
@Value("${spring.mail.username}")
private String from;
@Autowired
private JavaMailSender javaMailSender;
public void sendHtmlMail(String to,String subject,String content){
MimeMessage mimeMessage=javaMailSender.createMimeMessage();
logger.info("发送HTML邮件开始:{},{},{}",to,subject,content);
MimeMessageHelper mimeMessageHelper= null;
try {
mimeMessageHelper = new MimeMessageHelper(mimeMessage,true,"utf-8");
mimeMessageHelper.setTo(to);
mimeMessageHelper.setSubject(subject);
mimeMessageHelper.setText(content,true);
mimeMessageHelper.setFrom(from);
javaMailSender.send(mimeMessage);
logger.info("发送HTML邮件成功!");
} catch (MessagingException e) {
logger.error("发送HTML邮件异常",e);
}
}
}
src/testxxxx/service/ServiceTest.java
@RunWith(SpringRunner.class)
@SpringBootTest
public class ServiceTest {
@Resource
MailService mailService;
@Resource
TemplateEngine templateEngine;
@Test
public void sendHtmlMailTest(){
String content = "<html>\n"
+ "<body>\n"
+ "<h3>"+"Hello World!,这是第一封HTML邮件!!!"+"</h3>\n"
+ "</body>\n"
+ "</html>";
mailService.sendHtmlMail("xxxxxx@163.com", "发送第一封HTML邮件", content);
}
}
控制台打印:日志信息
三、发送附件邮件
src/main/xxxx/service/MailService.java
@Service
public class MailService {
private final Logger logger= LoggerFactory.getLogger(this.getClass());
@Value("${spring.mail.username}")
private String from;
@Autowired
private JavaMailSender javaMailSender;
public void sendAttachmentsMail(String to,String subject,String content,
String filePath){
MimeMessage mimeMessage=javaMailSender.createMimeMessage();
logger.info("发送附件邮件开始:{},{},{},{}",to,subject,content,filePath);
MimeMessageHelper mimeMessageHelper= null;
try {
mimeMessageHelper = new MimeMessageHelper(mimeMessage,true,"UTF-8");
mimeMessageHelper.setTo(to);
mimeMessageHelper.setFrom(from);
mimeMessageHelper.setSubject(subject);
mimeMessageHelper.setText(content,true);
FileSystemResource fileSystemResource=
new FileSystemResource(new File(filePath));
String fileName=fileSystemResource.getFilename();
mimeMessageHelper.addAttachment(fileName,fileSystemResource);
//可以发送多个附件或是一个数组,遍历发送附件
mimeMessageHelper.addAttachment(fileName+"_test1",fileSystemResource);
mimeMessageHelper.addAttachment(fileName+"_test2",fileSystemResource);
mimeMessageHelper.addAttachment(fileName+"_test3",fileSystemResource);
javaMailSender.send(mimeMessage);
logger.info("发送附件邮件成功!");
} catch (MessagingException e) {
logger.error("发送附件邮件异常",e);
}
}
}
src/test/xxxx/service/ServiceTest.java
@RunWith(SpringRunner.class)
@SpringBootTest
public class ServiceTest {
@Resource
MailService mailService;
@Resource
TemplateEngine templateEngine;
@Test
public void sendAttachmentsMailTest(){
String filePath="D:/SpringBoot/helloWorld.zip";
mailService.sendAttachmentsMail("xxxxx@163.com",
"发送第一封附件邮件",
"这是一封带有附件的邮件",filePath);
}
}
控制台打印:日志显示
四、带图片的邮件
src/main/xxxx/service/MailService.java
@Service
public class MailService {
private final Logger logger= LoggerFactory.getLogger(this.getClass());
@Value("${spring.mail.username}")
private String from;
@Autowired
private JavaMailSender javaMailSender;
public void sendInLineResourceMail(String to,String subject,String content,
String rscPath,String rscID){
MimeMessage mimeMessage=javaMailSender.createMimeMessage();
logger.info("发送静态邮件开始:{},{},{},{},{}",to,subject,content,rscPath,rscID);
MimeMessageHelper mimeMessageHelper= null;
try {
mimeMessageHelper = new MimeMessageHelper(mimeMessage,true,"UTF-8");
mimeMessageHelper.setFrom(from);
mimeMessageHelper.setTo(to);
mimeMessageHelper.setSubject(subject);
mimeMessageHelper.setText(content,true);
FileSystemResource fileSystemResource=
new FileSystemResource(new File(rscPath));
mimeMessageHelper.addInline(rscID,fileSystemResource);
javaMailSender.send(mimeMessage);
logger.info("发送图片邮件成功!");
} catch (MessagingException e) {
logger.error("发送图片邮件失败!",e);
}
}
}
src/test/xxxx/service/ServiceTest.java
@RunWith(SpringRunner.class)
@SpringBootTest
public class ServiceTest {
@Resource
MailService mailService;
@Resource
TemplateEngine templateEngine;
@Test
public void sendInLineMailTest(){
String imgPath="D:/SpringBoot/mail.jpg";
String rscId="mail001";
String content="<html><body>"
+"这是有图片的文件:"
+"<img src=\'cid"+rscId+"\'></img>"
+"<img src=\'cid"+rscId+"\'></img>"
+"</body></html>";
mailService.sendInLineResourceMail("xxxxx@163.com",
"发送第一封图片邮件",
content,
imgPath,
rscId);
}
}
控制台打印:日志信息
五、邮件模板
常用模板引擎:FreeMarker Thymeleaf Velocity Groovy Mustache等。不建议使用JSP。
具体实现后面博客中查看
六、常见异常
http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html
七、 邮件系统
需要考虑因素:
- 独立微服务
- 异常处理
- 定时重试邮件
- 异步发送请求