前言
Spring中提供了JavaMailSender用来简化邮件配置,Spring Boot则提供了MailSenderAutoConfiguration对邮件的发送做了进一步简化
SMTP/POP3协议的用处
- SMTP全称为Simple MailTransfer Protocol,译作简单邮件传输协议,它定义了邮件客户端软件与SMTP服务器之间,以及SMTP服务器与SMTP服务器之间的通信规则。
用处:SMTP服务器就是在不同的服务商之间来传送邮件的,
- POP3全称为PostOffice Protocol3,译作邮局协议,它定义了邮件客户端与POP3服务器之间的通信规则。
用处;111@163.com用户需要登录服务器查看邮件,这个时候就用上该协议了。
发送邮件
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
配置邮件信息
application.properties中:
spring.mail.host=smtp.qq.com
spring.mail.port=465
spring.mail.username=403401255@qq.com
//这是SMTP服务商的授权码,可以自己来开启SMTP后获取
spring.mail.password=opvjfkfiginacafe
spring.mail.default-encoding=utf-8
//安全相关的东西
spring.mail.properties.mail.smtp.socoketFactory.class=javax.net.ssl.SSLSocketFactory
debug=true
编写MailService
@Component
public class MailService {
@Autowired
JavaMailSender javaMailSender;
/**
* @param from 发送方地址
* @param to 收件方地址
* @param subject 主题
* @param content 内容
* @param srcPath 图片路径数组
* @param resIds 图片id
*
* 有的邮件正文中可能要插入图片,使用FileSystemResource可以实现这一功能,代码如下
*/
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);
for (int i = 0; i < srcPath.length; i++) {
FileSystemResource res =
new FileSystemResource(new File(srcPath[i]));
//然后调用addInline方法将资源加入邮件对象中
helper.addInline(resIds[i], res);
}
javaMailSender.send(message);
} catch (MessagingException e) {
System.out.println("发送失败");
}
}
/**
* @param from 邮件发送方
* @param to 接受地址
* @param cc 抄送者
* @param subject 主题
* @param content 内容
*/
public void sendSimpleMail(String from, String to, String cc, String subject, String content) {
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 附件
*
* 这里使用MimeMessageHelper简化了邮件配置,
* 它的构造方法的第二个参数true表示构造一个multipart message类型的邮件,
* multipart message类型的邮件包含多个正文、附件以及内嵌资源,邮件的表现形式更加丰富。
* 最后通过addAttachment方法添加附件。
*
*
*/
public void sendAttachFileMail(String from, String to,
String subject, String content, File file) {
try {
MimeMessage message = javaMailSender.createMimeMessage();
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();
}
}
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);
//true 表示是复html文本
helper.setText(content, true);
javaMailSender.send(message);
} catch (MessagingException e) {
System.out.println("发送失败");
}
}
}
测试用例
public class User {
private String username;
private String gender;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
@Autowired
MailService mailService;
@Test
public void sendMailWithImg() {
mailService.sendMailWithImg("1510161612@qq.com",
"584991843@qq.com",
"测试邮件主题(图片)",
"<div>hello,这是一封带图片资源的邮件:" +
"这是图片1:<div><img src='cid:p01'/></div>" +
"这是图片2:<div><img src='cid:p02'/></div>" +
"</div>",
new String[]{"C:\\Users\\sang\\Pictures\\picpick\\p1.png",
"C:\\Users\\sang\\Pictures\\picpick\\p2.png"},
new String[]{"p01", "p02"});
}
@Test
public void sendAttachFileMail() {
mailService.sendAttachFileMail("1510161612@qq.com",
"584991843@qq.com",
"测试邮件主题",
"测试邮件内容",
new File("E:\\邮件附件.docx"));
}
@Test
public void sendSimpleMail() {
mailService.sendSimpleMail(
"403401255@qq.com",
"995191647@qq.com",
"403401255@qq.com",
"Hello world",
"Hello world");
}
@Autowired
TemplateEngine templateEngine;
@Test
public void sendHtmlMailThymeleaf() {
Context ctx = new Context();
ctx.setVariable("username", "sang");
ctx.setVariable("gender", "男");
String mail = templateEngine.process("mailtemplate.html", ctx);
mailService.sendHtmlMail(
"403401255@qq.com",
"403401255@qq.com",
"测试邮件主题",
mail);
}
总结
- 使用JavaMailSenser 发送 SimpleMessage ,
- 对于复杂的消息 使用的是MimeMessage进行处理。
- Spring中提供了JavaMailSender用来简化邮件配置,Spring Boot则提供了MailSenderAutoConfiguration对邮件的发送做了进一步简化