SpringBoot+JavaMailSender发送邮件
概述
spring提供了发送邮件的接口JavaMailSender,通过JavaMailSender可以实现后端发送邮件,并且可以根据不同业务需求,利用JavaMailSender定制化发送邮件工具。spring boot +JavaMailSender接口发送邮件步骤如下
1、在pom.xml中引入spring-boot-starter-mail依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2、如果需要通过模板化发送邮件,则还需要引入spring-boot-starter-freemarker,通过freemarker来生成邮件模板
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
3、编写邮件发送类mailUtils(注意要使用@component标签),注入JavaMailSender,以及邮件模板freemarker bean,配置邮件发送方以及相关的STMP配置
@Value("${spring.mail.username}")
private String fromMail;
private final JavaMailSender sender;
private final FreeMarkerConfigurer freeMarkerConfigurer;
@Autowired
private JavaMailSender mailSender;
或者在同一初始化配置里创建JavaMailSender bean,再通过SpringContextUtils.getBean("mailSender") (mailSender为beanName)获取,本文通过第二种方式
MailUtils的sendMsg()方法实现通用邮件发送接口
这四个参数必须有
* @param mail 邮箱,支持多个
* @param subject 邮件主题
* @param title 邮件标题
* @param paragraph 段落内容,
public void SendMsg(String es_receiver, String es_title, String es_content) {
JavaMailSender mailSender = (JavaMailSender) SpringContextUtils.getBean("mailSender");
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = null;
//update-begin-author:taoyan date:20200811 for:配置类数据获取
if(oConvertUtils.isEmpty(emailFrom)){
StaticConfig staticConfig = SpringContextUtils.getBean(StaticConfig.class);
setEmailFrom(staticConfig.getEmailFrom());
}
//update-end-author:taoyan date:20200811 for:配置类数据获取
try {
helper = new MimeMessageHelper(message, true);
// 设置发送方邮箱地址
helper.setFrom(emailFrom);
helper.setTo(es_receiver);
helper.setSubject(es_title);
helper.setText(es_content, true);
mailSender.send(message);
} catch (MessagingException e) {
e.printStackTrace();
}
}
原理解析:要使用JavaMailSender发送邮件,
1、必须先获取JavaMailSender bean,
JavaMailSender mailSender = (JavaMailSender) SpringContextUtils.getBean("mailSender");
2、mailSender 创建MimeMessage实例,
message = mailSender.createMimeMessage();
3、通过MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true)封装邮件元数据信息;
helper.setFrom(emailFrom);
helper.setTo(es_receiver);
helper.setSubject(es_title);
helper.setText(es_content, true);
4、通过mailSender 的send方法发送邮件
mailSender.send(message);
通过模板发送邮件
1、发送文本文件
/**
* 发送文本邮件
* @param to 收件人
* @param subject 标题
* @param content 正文
*/
public void sendSimpleMail(String[] to, String subject, String content) {
SimpleMailMessage message = new SimpleMailMessage();
//发件人
message.setFrom(fromMail);
message.setTo(to);
message.setSubject(subject);
message.setText(content);
sender.send(message);
}
2、发送html邮件
/**
* 发送html邮件,带抄送功能
* @param to
* @param cc
* @param subject
* @param content
*/
public void sendHtmlMail(String[] to, String[] cc, String subject, String content) {
try {
//注意这里使用的是MimeMessage
MimeMessage message = sender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(fromMail);
helper.setTo(to);
// 抄送
if (ArrayUtils.isNotEmpty(cc)) {
helper.setCc(cc);
}
helper.setSubject(subject);
//第二个参数:格式是否为html
helper.setText(content, true);
sender.send(message);
}catch (MessagingException e){
log.error("发送邮件时发生异常!", e);
}
}
3、发送带附件的邮件
/**
* 发送带附件的邮件
* @param to
* @param subject
* @param content
* @param filePath
*/
public void sendAttachmentsMail(String to, String subject, String content, String filePath) {
try {
MimeMessage message = sender.createMimeMessage();
//要带附件第二个参数设为true
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(fromMail);
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);
sender.send(message);
}catch (MessagingException e){
log.error("发送邮件时发生异常!", e);
}
}
4、发送模板邮件
/**
* 发送模板邮件
*
* @param to
* @param subject
* @param template
* @param model 使用Map作为数据模型,定义属性和值
*/
public void sendTemplateMail(String[] to, String[] cc, String subject, String template, Map<String, Object> model) {
try {
// 获得模板
Template freeMarkerTemplate = freeMarkerConfigurer.getConfiguration().getTemplate(template);
// 传入数据模型到模板,替代模板中的占位符,并将模板转化为html字符串
String templateHtml = FreeMarkerTemplateUtils.processTemplateIntoString(freeMarkerTemplate, model);
// 该方法本质上还是发送html邮件,调用之前发送html邮件的方法
try {
//注意这里使用的是MimeMessage
MimeMessage message = sender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(fromMail);
helper.setTo(to);
// 抄送
if (ArrayUtils.isNotEmpty(cc)) {
helper.setCc(cc);
}
helper.setSubject(subject);
//第二个参数:格式是否为html
helper.setText(templateHtml , true);
sender.send(message);
}catch (MessagingException e){
log.error("发送邮件时发生异常!", e);
}
}
5、发送静态资源的邮件
public void sendMail() throws MessagingException {
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setFrom("so****@163.com");
helper.setTo("239****@qq.com");
helper.setSubject("主题:嵌入静态资源");
helper.setText("<html><body><img src=\"cid:hello\" ></body></html>", true);
// 注意addInline()中资源名称 hello 必须与 text正文中cid:hello对应起来
FileSystemResource file1 = new FileSystemResource(new File("d:\\cat.jpg"));
helper.addInline("hello", file1);
try {
mailSender.send(mimeMessage);
logger.info("嵌入静态资源的邮件已发送。");
} catch (Exception e) {
logger.error("静态资源的邮件时发生异常了!", e);
}
}