本文记录学习在 SpringBoot 中发送邮件.
一 邮件发送过程
发送邮件是一个我们在项目中经常会用到的功能, 如在用户注册时发送验证码, 账户激活等都会用到. 完整的一个邮件发送过程主要包含以下几个步骤:
1 发件人在用户邮件代理上写邮件内容及收件人的邮箱地址;
2 用户邮件代理根据发件人填写的邮件信息, 生成一封符合邮件格式的邮件;
3 用户邮件代理把邮件发送到发信人的邮件服务器上;
4 发件人的邮件服务器使用 SMTP 协议把这封邮件发送到收件人的邮件服务器上;
5 收件人的邮件服务器收到邮件后, 把这封邮件放到收件人在这个服务器上的信箱中;
6 收件人使用用户邮件代理来收取邮件.
二 发送邮件示例
以前发送邮件时, 调用 JavaMail 的相关 API 来开发实现, 需要我们自己去组装消息体, 代码量比较大, 实现起来也不是很容易; Spring 提供的 JavaMailSender 对 JavaMail 的 API 做了一定的封装, 简化了发邮件的过程. JavaMailSender 提供了强大的邮件发送功能, 可支持各种类型的邮件发送. Spring Boot 在 JavaMailSender 的基础上又做了进一步的封装, 让我们的使用更加的简单.
在 pom.xml 文件中引入需要得依赖
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-mail</artifactId>
- </dependency>
在 application.properties 中配置邮件服务相关信息 (测试使用得是 QQ 邮件服务)
- # 邮件默认字符集
- 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);
- }
如上方法就实现了向多人发送邮件并且抄送多人
来源: https://www.cnblogs.com/love-wzy/p/10345817.html