赞
踩
Spring boot自带了发送邮件的功能,因此在我们自己的项目中可以引用一下邮件发送。顺势写了一个小Demo,并且把遇到的坑记录下来。
首先需要在pom文件中引入相对应的jar包
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-mail</artifactId>
- </dependency>
第二步。配置我们的邮件发送服务器。大家应该都知道发邮件必须要有一台SMTP服务器。以下以QQ邮箱为例,新浪,网易邮箱都可以的,具体的大家自己尝试下,步骤差不多。
① 、点开邮箱设置,进入账户页面
②、往下滑动会见到SMTP服务部分,开启SMTP服务
然后根据操作提示获取授权码。
第三步 邮箱我们配置完全以后,下面我们开始配置java端的代码。
java配置有2种形式,第一种我们通过application文件形式
- email:
- host: smtp.qq.com
- username: 710285449@qq.com
- password: *************** // 这个是刚才通过设置邮箱获取的授权码就可以
- default-encoding: UTF-8
- port: 587
第二种是通过代码方式注入
- @Configuration
- public class MailConfiguration {
-
- @Bean
- public JavaMailSenderImpl javaMailSender(){
- JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
- mailSender.setHost("smtp.qq.com");
- mailSender.setUsername("710285449@qq.com");
- mailSender.setPassword("**********");
- mailSender.setDefaultEncoding("UTF-8"); // 不加这部分会导致html格式的邮件乱码
- return mailSender;
- }
- }
两种方式我都试了一下,第一种我本地配置无法完成,启动的时候报错无法注入服务,因此我选择了第二种通过Bean的方式注入JavaMailSender服务。
具体注意下代码中的注释部分。编码部分如果不加的话发送普通邮件不会有太大问题,但是发送HTMl格式的代码时候可能会引起字符的乱码。
第四步 代码层的编写
代码网上有一大堆的例子,这里我引用了别人的博客文章 https://blog.csdn.net/gfd54gd5f46/article/details/77414560 中的代码
Service 接口层
- public interface EmailService {
-
- public void sendSimpleEmail(String to,String subject,String content);
-
- public void sendHtmlEmail(String to,String subject,String content);
-
- public void sendAttachmentsEmail(String to,String subject,String content,String filePath);
-
- public void sendInlineResoureceEmail(String to,String subject,String content,String rscPath,String rscId);
- }
接口实现层
- @Component
- public class EmailServiceImpl implements EmailService {
-
- private final Logger logger = LoggerFactory.getLogger(EmailServiceImpl.class);
-
- @Autowired
- private JavaMailSender mailSender;
-
- @Value("${mail.fromMail.addr}")
- private String from;
-
- @Override
- public void sendSimpleEmail(String to, String subject, String content) {
- SimpleMailMessage message = new SimpleMailMessage();//创建简单邮件消息
- message.setFrom(from);//设置发送人
- message.setTo(to);//设置收件人
-
- /* String[] adds = {"xxx@qq.com","yyy@qq.com"}; //同时发送给多人
- message.setTo(adds);*/
-
- message.setSubject(subject);//设置主题
- message.setText(content);//设置内容
- try {
- mailSender.send(message);//执行发送邮件
- logger.info("简单邮件已经发送。");
- } catch (Exception e) {
- logger.error("发送简单邮件时发生异常!", e);
- }
- }
-
- @Override
- public void sendHtmlEmail(String to, String subject, String content) {
- MimeMessage message = mailSender.createMimeMessage();//创建一个MINE消息
-
- try {
- //true表示需要创建一个multipart message
- MimeMessageHelper helper = new MimeMessageHelper(message, true);
- helper.setFrom(from);
- helper.setTo(to);
- helper.setSubject(subject);
- helper.setText(content, true);
-
- mailSender.send(message);
- logger.info("html邮件发送成功");
- } catch (MessagingException e) {
- logger.error("发送html邮件时发生异常!", e);
- }
- }
-
- @Override
- public void sendAttachmentsEmail(String to, String subject, String content, String filePath) {
- MimeMessage message = mailSender.createMimeMessage();//创建一个MINE消息
-
- try {
- MimeMessageHelper helper = new MimeMessageHelper(message, true);
- helper.setFrom(from);
- helper.setTo(to);
- helper.setSubject(subject);
- helper.setText(content, true);// true表示这个邮件是有附件的
-
- FileSystemResource file = new FileSystemResource(new File(filePath));//创建文件系统资源
- String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
- helper.addAttachment(fileName, file);//添加附件
-
- mailSender.send(message);
- logger.info("带附件的邮件已经发送。");
- } catch (MessagingException e) {
- logger.error("发送带附件的邮件时发生异常!", e);
- }
- }
-
- @Override
- public void sendInlineResoureceEmail(String to, String subject, String content, String rscPath, String rscId) {
- MimeMessage message = mailSender.createMimeMessage();
-
- try {
- MimeMessageHelper helper = new MimeMessageHelper(message, true);
- helper.setFrom(from);
- helper.setTo(to);
- helper.setSubject(subject);
- helper.setText(content, true);
-
- FileSystemResource res = new FileSystemResource(new File(rscPath));
-
- //添加内联资源,一个id对应一个资源,最终通过id来找到该资源
- helper.addInline(rscId, res);//添加多个图片可以使用多条 <img src='cid:" + rscId + "' > 和 helper.addInline(rscId, res) 来实现
-
- mailSender.send(message);
- logger.info("嵌入静态资源的邮件已经发送。");
- } catch (MessagingException e) {
- logger.error("发送嵌入静态资源的邮件时发生异常!", e);
- }
- }
- }
@Value注解对应的配置
- mail:
- fromMail:
- addr: 710285449@qq.com
这里值得注意的是一定要把fromMail的地址和自己邮箱服务器的地址对应,否则会报如下错误
剩下的就是自己写个 Junit的Test方法自己试下就OK了。
- public void sendSimpleMail() throws Exception {
- emailService.sendSimpleEmail("805288035@qq.com","邮件发送主题","Hello World!");
- }
至于实际业务中,大部分邮件都不是主要流程,如果因为批量发送邮件造成程序运行缓慢,可以使用多线程的方式去解决问题。
如果错误之处欢迎指出。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。