spring-boot-starter-mail 邮件发送
Sun公司提供了JavaMail用来实现邮件发送,但是配置烦琐,Spring中提供了JavaMailSender用来简化邮件配置,Spring Boot则提供了MailSenderAutoConfiguration对邮件的发送做了进一步简化。
开通POP3/SMTP服务或者IMAP/SMTP服务
使用邮箱发送邮件,首先要申请开通POP3/SMTP服务或者IMAP/SMTP服务。
SMTP全称为Simple Mail Transfer Protocol,译作简单邮件传输协议,它定义了邮件客户端软件与SMTP服务器之间,以及SMTP服务器与SMTP服务器之间的通信规则。
添加邮件依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
邮件基本信息配置:
spring:
mail:
host: smtp.xxx.com
username: xxx@xxx.com
password: xxx
default-encoding: UTF-8
properties.mail.smtp.socketFactory.class: javax.net.ssl.SSLSocketFactory
properties.mail.debug: true
发送简单邮件:
@Component
public class MailService {
/**
* JavaMailSender是Spring Boot在MailSenderPropertiesConfiguration类中配置好的,
* 该类在Mail自动配置类MailSenderAutoConfiguration中导入,因此这里注入JavaMailSender就可以使用了。
*/
@Autowired
JavaMailSender javaMailSender;
/**
* sendSimpleMail方法的5个参数分别表示邮件发送者、收件人、抄送人、邮件主题以及邮件内容。
*
* @param from 发送者
* @param to 收件人
* @param cc 抄送人
* @param subject 主题
* @param content 内容
*/
public void sendSimpleMail(String from, String to, String cc, String subject, String content) {
// 简单邮件可以直接构建一个SimpleMailMessage对象进行配置,配置完成后,通过JavaMailSender将邮件发送出去。
SimpleMailMessage simpMsg = new SimpleMailMessage();
simpMsg.setFrom(from);
simpMsg.setTo(to);
simpMsg.setCc(cc);
simpMsg.setSubject(subject);
simpMsg.setText(content);
javaMailSender.send(simpMsg);
}
}
发送带附件的邮件:
/**
* 发送带附件的邮件
*
* @param from 发送者
* @param to 收件人
* @param subject 主题
* @param content 内容
* @param file 附件
*/
public void sendAttachFileMail(String from, String to, String subject, String content, File file) {
try {
MimeMessage message = javaMailSender.createMimeMessage();
/*
* 这里使用MimeMessageHelper简化了邮件配置,
* 它的构造方法的第二个参数true表示构造一个multipart message类型的邮件,
* multipart message类型的邮件包含多个正文、附件以及内嵌资源,邮件的表现形式更加丰富
*/
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content);
helper.addAttachment(file.getName(), file);
javaMailSender.send(message);
} catch (MessagingException e) {
e.printStackTrace();
}
}
发送带图片资源的邮件:
/**
* 发送带图片资源的邮件
*
* @param from 发送者
* @param to 收件人
* @param subject 主题
* @param content 内容
* @param srcPath 图片资源路径
* @param resIds 资源id
*/
public void sendMailWithImg(String from, String to, String subject, String content, String[] srcPath, String[] resIds) {
if (srcPath.length != resIds.length) {
System.out.println("发送失败");
return;
}
try {
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);//第二个参数true表示邮件正文是HTML格式的,该参数不传默认为false。
for (int i = 0; i < srcPath.length; i++) {
FileSystemResource res = new FileSystemResource(new File(srcPath[i]));//通过FileSystemResource构造静态资源
helper.addInline(resIds[i], res);//调用addInline方法将资源加入邮件对象中
}
javaMailSender.send(message);
} catch (MessagingException e) {
System.out.println("发送失败");
}
}
使用Thymeleaf构建邮件模板:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
public void sendHtmlMail(String from, String to, String subject, String content) {
try {
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setTo(to);
helper.setFrom(from);
helper.setSubject(subject);
helper.setText(content, true);
javaMailSender.send(message);
} catch (MessagingException e) {
System.out.println("发送失败");
}
}
测试:
@RunWith(SpringRunner.class)
@SpringBootTest
public class MailServiceTest {
@Autowired
MailService mailService;
@Test
public void sendSimpleMail() {
mailService.sendSimpleMail(
"xxx@xxx.com ",
"xxx@xxx.com ",
"xxx@xxx.com ",
"测试邮件主题",
"测试邮件内容");
}
@Test
public void sendAttachFileMail() {
mailService.sendAttachFileMail(
"xxx@xxx.com ",
"xxx@xxx.com ",
"测试邮件主题sendAttachFileMail",
"测试邮件内容sendAttachFileMail",
new File("C:\\Usersxxx\\Desktop\\导出导入\\邮件附件.docx"));
}
@Test
public void sendMailWithImg() {
mailService.sendMailWithImg(
"xxx@xxx.com ",
"xxx@xxx.com ",
"测试邮件主题(图片)",
"<div>hello,这是一封带图片资源的邮件:" +
"这是图片1:<div><img src='cid:p01'/></div>" +
"这是图片2:<div><img src='cid:p02'/></div>" +
"</div>",
new String[]{
"C:\\Usersxxx\\Desktop\\Snipaste_2021-01-11_14-41-57.jpg",
"C:\\Usersxxx\\Desktop\\Snipaste_2021-01-11_14-41-57.jpg"
},
new String[]{"p01", "p02"});
}
@Autowired
TemplateEngine templateEngine;
@Test
public void sendHtmlMailThymeleaf() {
/*
* Thymeleaf提供了TemplateEngine来对模板进行渲染,通过Context构造模板中变量需要的值
*/
Context ctx = new Context();
ctx.setVariable("username", "sang");
ctx.setVariable("gender", "男");
String mail = templateEngine.process("mailtemplate.html", ctx);
mailService.sendHtmlMail(
"xxx@xxx.com ",
"xxx@xxx.com ",
"测试邮件主题Thymeleaf",
mail);
}
}
文章来源: Spring Boot+Vue全栈开发实战 - 13.1 邮件发送

浙公网安备 33010602011771号