SpringBoot入门 (十) 发送邮件

本文记录学习在SpringBoot中发送邮件。

一 邮件发送过程

发送邮件是一个我们在项目中经常会用到的功能,如在用户注册时发送验证码,账户激活等都会用到。完整的一个邮件发送过程主要包含以下几个步骤:

1 发件人在用户邮件代理上写邮件内容及收件人的邮箱地址;

2 用户邮件代理根据发件人填写的邮件信息,生成一封符合邮件格式的邮件;

3 用户邮件代理把邮件发送到发信人的邮件服务器上;

4 发件人的邮件服务器使用 SMTP 协议把这封邮件发送到收件人的邮件服务器上;

5 收件人的邮件服务器收到邮件后,把这封邮件放到收件人在这个服务器上的信箱中;

6 收件人使用用户邮件代理来收取邮件。

二 发送邮件示例

以前发送邮件时,调用 JavaMail 的相关 API 来开发实现,需要我们自己去组装消息体,代码量比较大,实现起来也不是很容易;Spring 提供的JavaMailSender 对JavaMail的Api做了一定的封装,简化了发邮件的过程。JavaMailSender 提供了强大的邮件发送功能,可支持各种类型的邮件发送。Spring Boot在JavaMailSender 的基础上又做了进一步的封装,让我们的使用更加的简单。

在pom.xml文件中引入需要得依赖

1<dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-mail</artifactId> 4 </dependency>

在application.properties中配置邮件服务相关信息(测试使用得是QQ邮件服务)

1# Email 2#邮件默认字符集 3spring.mail.default-encoding=UTF-8 4#邮件服务地址 5spring.mail.host=smtp.qq.com 6#邮件服务协议,可以不写(查看源码可知,没有时默认值是smtp ) 7#spring.mail.protocol=smtp 8#端口 9spring.mail.port=25 10#账号 11spring.mail.username=********@qq.com 12#密码 使用第三方发送邮件时,需要开通授权,所以此处要写邮箱授权码 13spring.mail.password=****************

完成了上边得配置后,在启动服务得时候,SpringBoot会根据我们得配置,为我们初始化好一个JavaMailSender类供我们调用,我们只需要在要使用得地方注入就可以了。

定义一个邮件服务接口,提供我们得邮件服务方法,其他业务中用到发邮件功能时,调用找个接口就可以了

1public interface EmailSenderService { 2 3 /** 4 * 发送文本消息 5 * @param subject 邮件主题 6 * @param content 邮件内容 7 * @param to 收件人(可变参数,多个时用逗号隔开) 8 */ 9 void sendTextMail(String subject, String content, String... to); 10 11} 12 13@Service 14public class EmailSenderServiceImpl implements EmailSenderService { 15 16 @Autowired 17 private JavaMailSender javaMailSender; 18 19 //发件人邮箱 20 @Value("${spring.mail.username}") 21 private String from; 22 23 @Override 24 public void sendTextMail(String subject, String content, String... to) { 25 SimpleMailMessage mailMessage = new SimpleMailMessage(); 26 mailMessage.setFrom(from); 27 mailMessage.setTo(to); 28 mailMessage.setSubject(subject); 29 mailMessage.setText(content); 30 mailMessage.setSentDate(new Date()); 31 javaMailSender.send(mailMessage); 32 } 33}

如上,我们在实现类中注入JavaMailSender后直接调用它send方法就可以完成发邮件。其他业务中用到发邮件业务了,直接调用EmailSenderService 接口得方法即可。我们完全也可以把JavaMailSender直接注入到我们得各个业务模块中去,在发邮件时直接调用JavaMailSender得send方法发邮件。但是还是推荐将邮件发送相关功能独立起来,便于维护。

上边我们实现了发送一个文本邮件,有时候我们还需要在发送邮件时附带发送附件,这种也是支持的,我们添加接口及实现方法

1/** 2 * 发送带附件邮件 3 * @param subject 主题 4 * @param content 内容 5 * @param filePath 附件得本地路径 6 * @param fileName 附件名 7 * @param to 收件人 8 */ 9 void sendAttachmentMail(String subject, String content, String filePath, String fileName, String... to); 10 11@Override 12 public void sendAttachmentMail(String subject, String content, String filePath, String fileName, String... to) { 13 MimeMessage mimeMessage = javaMailSender.createMimeMessage(); 14 try { 15 MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); 16 helper.setFrom(from); 17 helper.setTo(to); 18 helper.setSubject(subject); 19 helper.setText(content); 20 //附件 21 FileSystemResource file = new FileSystemResource(new File(filePath)); 22 helper.addAttachment(fileName, file); 23 24 javaMailSender.send(mimeMessage); 25 } catch (MessagingException e) { 26 e.printStackTrace(); 27 } 28 }

如果我们发送邮件时,除了收件人之外,还想让某些人知道即抄送某些人,这种也是支持得,接口及实现方法如下:

1/** 2 * 发送一个邮件并抄送 3 * @param subject 主题 4 * @param content 内容 5 * @param ccList 抄送人(可以有多个) 6 * @param to 收件人(可以有多个) 7 */ 8 void sendTextMail(String subject, String content, List<String> ccList, String... to); 9 10@Override 11 public void sendTextMail(String subject, String content, List<String> ccList, String... to) { 12 //收件人地址 13 InternetAddress[] addressesTo = new InternetAddress[to.length]; 14 if(to != null && to.length>0){ 15 for(int i=0;i<to.length;i++){ 16 InternetAddress addressTo = null; 17 try { 18 addressTo = new InternetAddress(to[i]); 19 addressesTo[i] = addressTo; 20 } catch (AddressException e) { 21 e.printStackTrace(); 22 } 23 } 24 } 25 //抄送人地址 26 InternetAddress[] addressesCc = new InternetAddress[ccList.size()]; 27 if(ccList != null && ccList.size() > 0){ 28 for(int i=0;i<ccList.size();i++){ 29 String ccAdd = ccList.get(i); 30 InternetAddress address = null; 31 try { 32 address = new InternetAddress(ccAdd); 33 addressesCc[i] = address; 34 } catch (AddressException e) { 35 e.printStackTrace(); 36 } 37 } 38 } 39 40 MimeMessagePreparator preparator = new MimeMessagePreparator() { 41 @Override 42 public void prepare(MimeMessage mimeMessage) throws Exception { 43 mimeMessage.setFrom(from); 44 mimeMessage.setSubject(subject); 45 mimeMessage.setText(content); 46 mimeMessage.setRecipients(Message.RecipientType.TO, addressesTo); 47 mimeMessage.setRecipients(Message.RecipientType.CC, addressesCc); 48 } 49 }; 50 javaMailSender.send(preparator); 51 }

如上方法就实现了向多人发送邮件并且抄送多人

点赞
收藏

评论区

加载中...

相关推荐

sprintboot

一、邮件发送使用springboot自带的邮件系统就能实现邮件的发送,首先导入依赖:1、新建springboot项目,添加依赖<dependency<groupIdorg.springframework.boot</groupId<artifactIdspringbootstartermail

最全总结!聊聊 Python 发送邮件的几种方式

1\.前言邮件,作为最正式规范的沟通方式,在日常办公过程中经常被用到我们都知道Python内置了对SMTP的支持,可以发送纯文本、富文本、HTML等格式的邮件本文将聊聊利用 Python发送邮件的3种方式2\.准备以126邮箱为例,在编码之前,我们需要开启SMTP服务然后,手动新增一个授权码其中,账号、授权码和服务器地址用于连接登录

最全总结!聊聊 Python 发送邮件的几种方式

1\.前言邮件,作为最正式规范的沟通方式,在日常办公过程中经常被用到我们都知道Python内置了对SMTP的支持,可以发送纯文本、富文本、HTML等格式的邮件本文将聊聊利用 Python发送邮件的3种方式2\.准备以126邮箱为例,在编码之前,我们需要开启SMTP服务然后,手动新增一个授权码其中,账号、授权码和服务器地址用于连接登录

赶在元旦前夕!10分钟用Python批量定制化发送元旦祝福邮件!

上一篇关于邮件的自动发送教程中,我们讲解了如何使用yagmail进行简单的邮件发送:现实生活中,如果只是发邮件给自己,像上一篇文章那样简陋的格式是可以接受的,但若要针对每个人进行邮件的定制化,群发给公司客户、内部员工、亲戚朋友,则需更加高级的邮件发送方式。我们可以通过HTML制作一封精美的元旦祝福邮件,但是邮件的内容——比如姓名、祝福语等应该怎样动态

Jenkins 配置邮件通知步骤

Jenkins配置邮件通知前言可以在Jenkins中配置邮件通知,比如在构建失败时发送邮件通知项目组来及时修复问题。Jenkins邮件通知功能的插件主要包括:MailerPlugin(默认的发送邮件插件)EmailExtensionPlugin(功能更强大的发送邮件插件)建议同时安装这两个插件。下面来介绍如何在

SpringBoot使用JavaMailSender发送邮件(1)

邮件发送是一个非常常见的功能,最初Sun公司提供了JavaMail用来实现邮件发送,但是配置烦琐。后来Spring中提供了JavaMailsender用来简化邮件配置,而SpringBoot则提供了MailSenderAutoConfiguration对邮件的发送做了进一步简化。在开始之前我们需要申请开通POP3/SMTP服