消息-邮件

1. 开通邮箱发送权限

可以使用163,qq等邮箱,一般是打开邮箱设置页面,找到POP3/SMTP服务,并开启服务,记录授权码

2. 发送邮件

2.1 简单发送

  • 添加依赖
1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
  • 添加配置文件
1
2
3
4
5
6
7
spring:
mail:
host: smtp.qq.com
port: 465
username: 969312613@qq.com
password: xxxxxx
protocol: smtps
  • 发送参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Data
public class SendMailDTO {

/**
* 收件人邮箱列表
*/
private String receiver;
/**
* 邮件标题
*/
private String title;
/**
* 邮件内容
*/
private String content;
}
  • 发送邮件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
@Service
@Slf4j
public class MailServiceImpl implements MailService {

@Resource
private JavaMailSender javaMailSender;

/**
* 发送邮件
*
* @param sendMailDTO
*/
@Override
public void sendMail(SendMailDTO sendMailDTO) {
try {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
// 设置发件人
helper.setFrom(((JavaMailSenderImpl)javaMailSender).getUsername());
// 设置接收人
helper.setTo(sendMailDTO.getReceiver());
// 设标题
helper.setSubject(sendMailDTO.getTitle());
// 设置文本
helper.setText(sendMailDTO.getContent());
//发送邮件
javaMailSender.send(mimeMessage);
} catch (Exception e) {
log.error("发送邮件异常,异常信息:{}, 参数:{}", e.getMessage(), sendMailDTO.getTitle());
e.printStackTrace();
throw new RuntimeException(e);
}
}
}

2.2 通过spring-mail发送带附件的邮件

  • 发送参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
@Data
public class SendMailDTO {

/**
* 邮件服务器host
*/
private String host;
/**
* 邮箱服务器端口
*/
private Integer port;
/**
* 发件箱名称
*/
private String name;
/**
* 发件人账号邮箱
*/
private String username;
/**
* 发件人密码
*/
private String password;
/**
* 收件人邮箱列表
*/
private String[] receivers;
/**
* 抄送人邮箱列表
*/
private String[] cc;
/**
* 邮件标题
*/
private String title;
/**
* 邮件内容
*/
private String content;
/**
* 邮件附件
*/
private List<EmailAttachmentDTO> attachments;
}
  • 附件参数
1
2
3
4
5
6
7
8
9
10
11
12
13
@Data
public class EmailAttachmentDTO {
/**
* 附件名称
*/
private String fileName;
/**
* 附件流
* 可以通过下面代码把输入流转为可多次获取的流
* InputStreamSource inputStreamSource = new ByteArrayResource(IoUtil.readBytes(inputStream));
*/
private InputStreamSource inputStreamSource;
}
  • 发送邮件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
@Service
@Slf4j
public class MailServiceImpl implements MailService {

/**
* 发送邮件
*
* @param sendMailDTO
*/
@Override
public void sendMail(SendMailDTO sendMailDTO) {
try {
JavaMailSender javaMailSender = initMailSender(sendMailDTO);
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
// 设置发件人
helper.setFrom(new InternetAddress(sendMailDTO.getUsername(),
MimeUtility.encodeText(sendMailDTO.getName(), "UTF-8", "B")));
// 设置接收人
helper.setTo(sendMailDTO.getReceivers());
// 设置抄送人
helper.setCc(sendMailDTO.getCc());
// 设标题
helper.setSubject(sendMailDTO.getTitle());
// 设置文本
helper.setText(sendMailDTO.getContent(), true);
// 设置附件
List<EmailAttachmentDTO> attachments = sendMailDTO.getAttachments();
for (EmailAttachmentDTO attachment : attachments) {
helper.addAttachment(MimeUtility.encodeWord(attachment.getFileName(),"UTF-8","B"),
attachment.getInputStreamSource());
}

//发送邮件
javaMailSender.send(mimeMessage);
} catch (Exception e) {
log.error("发送邮件异常,异常信息:{}, 参数:{}", e.getMessage(), sendMailDTO.getTitle());
e.printStackTrace();
throw new RuntimeException(e);
}
}

/**
* 设置邮件服务器
* @param sendMailDTO
* @return
*/
private JavaMailSender initMailSender(SendMailDTO sendMailDTO) {
System.setProperty("mail.mime.splitlongparameters", "false");
JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
javaMailSender.setHost(sendMailDTO.getHost());
javaMailSender.setPort(sendMailDTO.getPort());
javaMailSender.setPassword(sendMailDTO.getPassword());
javaMailSender.setUsername(sendMailDTO.getUsername());
javaMailSender.setDefaultEncoding("UTF-8");
Properties properties = new Properties();
properties.setProperty("mail.smtp.starttls.enable", "true");
properties.setProperty("mail.smtp.starttls.required", "true");
properties.setProperty("mail.smtp.auth", "true");
properties.setProperty("mail.smtp.timeout", "100000");
properties.setProperty("mail.smtp.connectiontimeout", "100000");
properties.setProperty("mail.smtp.writetimeout", "100000");
properties.setProperty("mail.mime.splitlongparameters", "false");
javaMailSender.setJavaMailProperties(properties);
return javaMailSender;
}
}