本文记录学习在SpringBoot中发送邮件。java
发送邮件是一个咱们在项目中常常会用到的功能,如在用户注册时发送验证码,帐户激活等都会用到。完整的一个邮件发送过程主要包含如下几个步骤:spring
1 发件人在用户邮件代理上写邮件内容及收件人的邮箱地址;服务器
2 用户邮件代理根据发件人填写的邮件信息,生成一封符合邮件格式的邮件;app
3 用户邮件代理把邮件发送到发信人的邮件服务器上;ide
4 发件人的邮件服务器使用 SMTP 协议把这封邮件发送到收件人的邮件服务器上;spring-boot
5 收件人的邮件服务器收到邮件后,把这封邮件放到收件人在这个服务器上的信箱中;学习
6 收件人使用用户邮件代理来收取邮件。测试
之前发送邮件时,调用 JavaMail 的相关 API 来开发实现,须要咱们本身去组装消息体,代码量比较大,实现起来也不是很容易;Spring 提供的JavaMailSender 对JavaMail的Api作了必定的封装,简化了发邮件的过程。JavaMailSender 提供了强大的邮件发送功能,可支持各类类型的邮件发送。Spring Boot在JavaMailSender 的基础上又作了进一步的封装,让咱们的使用更加的简单。spa
在pom.xml文件中引入须要得依赖代理
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
在application.properties中配置邮件服务相关信息(测试使用得是QQ邮件服务)
# Email
#邮件默认字符集
spring.mail.default-encoding=UTF-8
#邮件服务地址
spring.mail.host=smtp.qq.com
#邮件服务协议,能够不写(查看源码可知,没有时默认值是smtp )
#spring.mail.protocol=smtp
#端口
spring.mail.port=25
#帐号
spring.mail.username=********@qq.com
#密码 使用第三方发送邮件时,须要开通受权,因此此处要写邮箱受权码
spring.mail.password=****************
完成了上边得配置后,在启动服务得时候,SpringBoot会根据咱们得配置,为咱们初始化好一个JavaMailSender类供咱们调用,咱们只须要在要使用得地方注入就能够了。
定义一个邮件服务接口,提供咱们得邮件服务方法,其余业务中用到发邮件功能时,调用找个接口就能够了
public interface EmailSenderService {
/**
* 发送文本消息
* @param subject 邮件主题
* @param content 邮件内容
* @param to 收件人(可变参数,多个时用逗号隔开)
*/
void sendTextMail(String subject, String content, String... to);
}
@Service
public class EmailSenderServiceImpl implements EmailSenderService {
@Autowired
private JavaMailSender javaMailSender;
//发件人邮箱
@Value("${spring.mail.username}")
private String from;
@Override
public void sendTextMail(String subject, String content, String... to) {
SimpleMailMessage mailMessage = new SimpleMailMessage();
mailMessage.setFrom(from);
mailMessage.setTo(to);
mailMessage.setSubject(subject);
mailMessage.setText(content);
mailMessage.setSentDate(new Date());
javaMailSender.send(mailMessage);
}
}
如上,咱们在实现类中注入JavaMailSender后直接调用它send方法就能够完成发邮件。其余业务中用到发邮件业务了,直接调用EmailSenderService 接口得方法便可。咱们彻底也能够把JavaMailSender直接注入到咱们得各个业务模块中去,在发邮件时直接调用JavaMailSender得send方法发邮件。可是仍是推荐将邮件发送相关功能独立起来,便于维护。
上边咱们实现了发送一个文本邮件,有时候咱们还须要在发送邮件时附带发送附件,这种也是支持的,咱们添加接口及实现方法
/**
* 发送带附件邮件
* @param subject 主题
* @param content 内容
* @param filePath 附件得本地路径
* @param fileName 附件名
* @param to 收件人
*/
void sendAttachmentMail(String subject, String content, String filePath, String fileName, String... to);
@Override
public void sendAttachmentMail(String subject, String content, String filePath, String fileName, String... to) {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content);
//附件
FileSystemResource file = new FileSystemResource(new File(filePath));
helper.addAttachment(fileName, file);
javaMailSender.send(mimeMessage);
} catch (MessagingException e) {
e.printStackTrace();
}
}
若是咱们发送邮件时,除了收件人以外,还想让某些人知道即抄送某些人,这种也是支持得,接口及实现方法以下:
/**
* 发送一个邮件并抄送
* @param subject 主题
* @param content 内容
* @param ccList 抄送人(能够有多个)
* @param to 收件人(能够有多个)
*/
void sendTextMail(String subject, String content, List<String> ccList, String... to);
@Override
public void sendTextMail(String subject, String content, List<String> ccList, String... to) {
//收件人地址
InternetAddress[] addressesTo = new InternetAddress[to.length];
if(to != null && to.length>0){
for(int i=0;i<to.length;i++){
InternetAddress addressTo = null;
try {
addressTo = new InternetAddress(to[i]);
addressesTo[i] = addressTo;
} catch (AddressException e) {
e.printStackTrace();
}
}
}
//抄送人地址
InternetAddress[] addressesCc = new InternetAddress[ccList.size()];
if(ccList != null && ccList.size() > 0){
for(int i=0;i<ccList.size();i++){
String ccAdd = ccList.get(i);
InternetAddress address = null;
try {
address = new InternetAddress(ccAdd);
addressesCc[i] = address;
} catch (AddressException e) {
e.printStackTrace();
}
}
}
MimeMessagePreparator preparator = new MimeMessagePreparator() {
@Override
public void prepare(MimeMessage mimeMessage) throws Exception {
mimeMessage.setFrom(from);
mimeMessage.setSubject(subject);
mimeMessage.setText(content);
mimeMessage.setRecipients(Message.RecipientType.TO, addressesTo);
mimeMessage.setRecipients(Message.RecipientType.CC, addressesCc);
}
};
javaMailSender.send(preparator);
}
如上方法就实现了向多人发送邮件而且抄送多人