Implementation of spring boot sending mail function
background
A little friend asked me how you used to do the email function. Then I found a demo for him. I happened to write it here and share it with you.
Clarify pain points
Send mail, you can think, where is the pit? I think it's three. First: the email white list problem. Second: mail timeout. Third: mail with attachments. I will introduce these problems and solutions in the following demo.
Implementation scheme
preparation
First, we need to prepare an email that can be sent. I take my 163 email as an example. Now the rules for sending email require you to enter something called an authorization code. Note that this thing is not a password. Steps to obtain authorization code:
The springboot project introduces mail packages
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
YML configure mail related
spring:
mail:
# 邮件服务地址
host: smtp.163.com
# 端口,可不写默认
port: 25
# 编码格式
default-encoding: utf-8
# 用户名
username: xxx@163.com
# 授权码,就是我们刚才准备工作获取的代码
password: xxx
# 其它参数
properties:
mail:
smtp:
# 如果是用 SSL 方式,需要配置如下属性,使用QQ邮箱的话需要开启
ssl:
enable: true
required: true
# 邮件接收时间的限制,单位毫秒
timeout: 10000
# 连接时间的限制,单位毫秒
connectiontimeout: 10000
# 邮件发送时间的限制,单位毫秒
writetimeout: 10000
For the timeout problem mentioned above, the timeout exception can be caught to solve it.
Mail sending tool class
The following tool classes can meet the needs of sending java mail. After we have finished YML configuration, springboot will help us configure javamailsender automatically. We can operate java to send mail through this Java class. Here are some common emails.
@Service
public class MailService {
private static final Logger logger = LoggerFactory.getLogger(MailServiceImpl.class);
@Autowired
private JavaMailSender mailSender;
private static final String SENDER = "xxx@163.com";
/**
* 发送普通邮件
*
* @param to 收件人
* @param subject 主题
* @param content 内容
*/
@Override
public void sendSimpleMailMessge(String to,String subject,String content) {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(SENDER);
message.setTo(to);
message.setSubject(subject);
message.setText(content);
try {
mailSender.send(message);
} catch (Exception e) {
logger.error("发送简单邮件时发生异常!",e);
}
}
/**
* 发送 HTML 邮件
*
* @param to 收件人
* @param subject 主题
* @param content 内容
*/
@Override
public void sendMimeMessge(String to,String content) {
MimeMessage message = mailSender.createMimeMessage();
try {
//true表示需要创建一个multipart message
MimeMessageHelper helper = new MimeMessageHelper(message,true);
helper.setFrom(SENDER);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content,true);
mailSender.send(message);
} catch (MessagingException e) {
logger.error("发送MimeMessge时发生异常!",e);
}
}
/**
* 发送带附件的邮件
*
* @param to 收件人
* @param subject 主题
* @param content 内容
* @param filePath 附件路径
*/
@Override
public void sendMimeMessge(String to,String content,String filePath) {
MimeMessage message = mailSender.createMimeMessage();
try {
//true表示需要创建一个multipart message
MimeMessageHelper helper = new MimeMessageHelper(message,true);
FileSystemResource file = new FileSystemResource(new File(filePath));
String fileName = file.getFilename();
helper.addAttachment(fileName,file);
mailSender.send(message);
} catch (MessagingException e) {
logger.error("发送带附件的MimeMessge时发生异常!",e);
}
}
/**
* 发送带静态文件的邮件
*
* @param to 收件人
* @param subject 主题
* @param content 内容
* @param rscIdMap 需要替换的静态文件
*/
@Override
public void sendMimeMessge(String to,Map<String,String> rscIdMap) {
MimeMessage message = mailSender.createMimeMessage();
try {
//true表示需要创建一个multipart message
MimeMessageHelper helper = new MimeMessageHelper(message,true);
for (Map.Entry<String,String> entry : rscIdMap.entrySet()) {
FileSystemResource file = new FileSystemResource(new File(entry.getValue()));
helper.addInline(entry.getKey(),file);
}
mailSender.send(message);
} catch (MessagingException e) {
logger.error("发送带静态文件的MimeMessge时发生异常!",e);
}
}
}
Send mail demo
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbooEmailDemoApplicationTests {
@Autowired
private MailService mailService;
private static final String TO = "xxx@qq.com";
private static final String SUBJECT = "测试邮件";
private static final String CONTENT = "test content";
/**
* 测试发送普通邮件
*/
@Test
public void sendSimpleMailMessage() {
mailService.sendSimpleMailMessge(TO,SUBJECT,CONTENT);
}
/**
* 测试发送html邮件
*/
@Test
public void sendHtmlMessage() {
String htmlStr = "<h1>Test</h1>";
mailService.sendMimeMessge(TO,htmlStr);
}
/**
* 测试发送带附件的邮件
* @throws FileNotFoundException
*/
@Test
public void sendAttachmentMessage() throws FileNotFoundException {
File file = ResourceUtils.getFile("classpath:test.txt");
String filePath = file.getAbsolutePath();
mailService.sendMimeMessge(TO,CONTENT,filePath);
}
/**
* 测试发送带附件的邮件
* @throws FileNotFoundException
*/
@Test
public void sendPicMessage() throws FileNotFoundException {
String htmlStr = "<html><body>测试:图片1 <br> <img src=\'cid:pic1\'/> <br>图片2 <br> <img src=\'cid:pic2\'/></body></html>";
Map<String,String> rscIdMap = new HashMap<>(2);
rscIdMap.put("pic1",ResourceUtils.getFile("classpath:pic01.jpg").getAbsolutePath());
rscIdMap.put("pic2",ResourceUtils.getFile("classpath:pic02.jpg").getAbsolutePath());
mailService.sendMimeMessge(TO,htmlStr,rscIdMap);
}
}
White list problem
If it is sent to a fixed mailbox, you can directly set a white list in the fixed mailbox. If it is frequently sent to multiple mailboxes, you'd better set the following sending time interval instead of sending it to one mailbox.