工作中经常会遇到发邮件的功能,如邮件预警,注册时发一个邮件确认等,这里给出在Spring Boot中发送邮件的完整集成示例
邮件发送支持的内容类型如下:
- 发送简单邮件。
- 发送html格式的邮件
- 发送带附件简单邮件
- 发送模板邮件
1. pom.xml
发送模板邮件需要用到spring-boot-starter-thymeleaf,其他其他邮件内容不需要该依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
2. application.properties
spring.mail.host=smtp.163.com
spring.mail.username=xxx@163.com
# 注意这里的密码不是邮箱的登录密码
spring.mail.password=邮箱客户端授权码
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
注意:如果密码不对在发送邮件中会报异常javax.mail.AuthenticationFailedException: 535 Error, 如果设置了也开启了还是不行再重新设置一下
3. MailUtil
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMail message ;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
@Component
public class MailUtil {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
JavaMailSender mailSender;
@Autowired
TemplateEngine templateEngine;
/**
* 发送简单邮件
* @param from 发送人
* @param to 接收人
* @param carbonCopy 抄送人
* @param subject 主题
* @param content 内容
*/ public void sendSimpleEmail(String from, String[] to, String[] carbonCopy, String subject , String content) {
long startTimestamp = System.currentTimeMillis();
logger.info("Start send mail ... ");
try {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from);
message.setTo(to);
message.setCc(carbonCopy);
message.setSubject(subject);
message.setText(content);
mailSender.send(message);
logger.info("Send mail success, cost {} million seconds", System.currentTimeMillis() - startTimestamp);
} catch (MailException e) {
logger.error("Send mail failed, error message is : {} n", e. getMessage ());
}
}
/**
* 发送html邮件
*/ public void sendHtmlEmail(String deliver , String[] receiver, String[] carbonCopy, String subject, String content, boolean isHtml) {
long startTimestamp = System.currentTimeMillis();
logger.info("Start send email ...");
try {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(message);
messageHelper.setFrom(deliver);
messageHelper.setTo(receiver);
messageHelper.setCc(carbonCopy);
messageHelper.setSubject(subject);
messageHelper.setText(content, isHtml);
mailSender.send(message);
logger.info("Send email success, cost {} million seconds", System.currentTimeMillis() - startTimestamp);
} catch (MessagingException e) {
logger.error("Send email failed, error message is {} n", e.getMessage());
e.printStackTrace();
}
}
/**
* 发送带附件的邮件
*/ public void sendAttachmentFileEmail(String deliver, String[] receiver, String[] carbonCopy, String subject, String content, boolean isHtml, String fileName, File file) {
long startTimestamp = System.currentTimeMillis();
logger.info("Start send mail ...");
try {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);
messageHelper.setFrom(deliver);
messageHelper.setTo(receiver);
messageHelper.setCc(carbonCopy);
messageHelper.setSubject(subject);
messageHelper.setText(content, isHtml);
messageHelper.addAttachment(fileName, file);
mailSender.send(message);
logger.info("Send mail success, cost {} million seconds", System.currentTimeMillis() - startTimestamp);
} catch (MessagingException e) {
logger.error("Send mail failed, error message is {}n", e.getMessage());
e.printStackTrace();
}
}
/**
* 发送模板邮件
*/ public void sendTemplateEmail(String deliver, String[] receiver, String[] carbonCopy, String subject, String template, Context context) {
long startTimestamp = System.currentTimeMillis();
logger.info("Start send mail ...");
try {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(message);
String content = templateEngine.process(template, context);
messageHelper.setFrom(deliver);
messageHelper.setTo(receiver);
messageHelper.setCc(carbonCopy);
messageHelper.setSubject(subject);
messageHelper.setText(content, true);
mailSender.send(message);
logger.info("Send mail success, cost {} million seconds", System.currentTimeMillis() - startTimestamp);
} catch (MessagingException e) {
logger.error("Send mail failed, error message is {} n", e.getMessage());
e.printStackTrace();
}
}
}
src/main/resource/templates/mailTemplate.html
<!DOCTYPE html>
<html xmlns:th="#34;>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
[[${content}]] <br/>
[[${content}]] <br/>
[[${content}]] <br/>
</body>
</html>
4. Test
@RunWith(SpringRunner.class)
@SpringBootTest
public class MailApplicationTests {
@Autowired
private MailUtil mailUtil;
@Test
public void sendSimpleEmail() {
String deliver = "xxx@163.com";
String[] receiver = {"xxx@gmail.com"};
String[] carbonCopy = {"xxx@qq.com"};
String subject = "This is a simple email";
String content = "This is a simple content";
try {
mailUtil.sendSimpleEmail(deliver, receiver, carbonCopy, subject, content);
} catch (Exception e) {
assertFalse("Send simple email failed", true);
e.printStackTrace();
}
}
@Test
public void sendHtmlMail(){
String deliver = "xxx@163.com";
String[] receiver = {"xxx@gmail.com"};
String[] carbonCopy = {"xxx@qq.com"};
String subject = "退信代码说明";
String content = "<h1>org.springframework.mail.MailSendException: Failed messages: " +
"com. sun .mail.smtp.SMTPSendFailedException: 554 DT:SPM 163 smtp9,DcCowAAXf2r4c8da2cPWBQ--." +
"33626S3 1523020853,please see " +
"#34;;
boolean isHtml = true;
mailUtil.sendHtmlEmail(deliver, receiver, carbonCopy, subject, content, isHtml);
}
@Test
public void sendAttachmentFileEmail() {
String FILE_PATH = "/Users/mengday/Desktop/02.png";
String deliver = "xxx@163.com";
String[] receiver = {"xxx@gmail.com"};
String[] carbonCopy = {"xxx@qq.com"};
String subject = "退信代码说明";
String content = "<h1>org.springframework.mail.MailSendException: Failed messages: " +
"com.sun.mail.smtp.SMTPSendFailedException: 554 DT:SPM 163 smtp9,DcCowAAXf2r4c8da2cPWBQ--." +
"33626S3 1523020853,please see " +
"#34;;
boolean isHtml = true;
File file = new File(FILE_PATH);
String fileName = FILE_PATH.substring(FILE_PATH.lastIndexOf(File.separator));
try {
mailUtil.sendAttachmentFileEmail(deliver, receiver, carbonCopy, subject, content, isHtml, fileName, file);
} catch (Exception e) {
e.printStackTrace();
assertFalse("Send attachment file email failed", true);
}
}
@Test
public void sendTemplateEmail() {
String deliver = "xxx@163.com";
String[] receiver = {"xxx@gmail.com"};
String[] carbonCopy = {"xxx@qq.com"};
String subject = "DT:SPM 发送的邮件内容包含了未被许可的信息,或被系统识别为垃圾邮件。请检查是否有用户发送病毒或者垃圾邮件";
String template = "mailTemplate";
String content = "554 DT:SPM 发送的邮件内容包含了未被许可的信息,或被系统识别为垃圾邮件。请检查是否有用户发送病毒或者垃圾邮件";
Context context = new Context();
context.setVariable("content", content);
try {
mailUtil.sendTemplateEmail(deliver, receiver, carbonCopy, subject, template, context);
} catch (Exception e) {
e.printStackTrace();
assertFalse("Send template email failed", true);
}
}
}
注意:如果标题和内容过于简单,或者包含test之类的内容,163会认为这是垃圾邮件,会造成发送失败,报以下异常,解决办法就是将发送的表体和内容写的比较真实点
org.springframework.mail.MailSendException: Failed messages:
com.sun.mail.smtp.SMTPSendFailedException: 554 DT:SPM 163
smtp7,C8CowABH3LWqe8daHXmDNw--.3202S3 1523022763,please see