SpringBoot2.x整合JavaMail以qq邮箱发送邮件
本文参考spring官网email接口文档所写。
spring-email官方网址:https://docs.spring.io/spring/docs/5.1.8.RELEASE/spring-framework-reference/integration.html#mail
1:相关依赖
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-mail --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> <version>2.1.6.RELEASE</version> </dependency>
2:邮箱收件人
public class EmailModel implements Serializable { /** * 收件人姓名 **/ private String recieverName; /** * 收件人邮箱地址 **/ private String recieverEmailAddress; /** * 邮件主题 **/ private String emailTheme; /** * 邮件内容 **/ private String emailContent; public String getRecieverName() { return recieverName; } public void setRecieverName(String recieverName) { this.recieverName = recieverName; } public String getRecieverEmailAddress() { return recieverEmailAddress; } public void setRecieverEmailAddress(String recieverEmailAddress) { this.recieverEmailAddress = recieverEmailAddress; } public String getEmailTheme() { return emailTheme; } public void setEmailTheme(String emailTheme) { this.emailTheme = emailTheme; } public String getEmailContent() { return emailContent; } public void setEmailContent(String emailContent) { this.emailContent = emailContent; } }
3:邮箱工具类
package com.dev.utils.email; import com.dev.model.email.EmailModel; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.mail.MailException; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.mail.javamail.MimeMessagePreparator; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; /** * Created on 2019-08-02 16:06. * * @author zgq7 */ public class MailSendUtils { private static final Logger logger = LoggerFactory.getLogger(MailSendUtils.class); /** * 发送者地址 **/ private static String posterAdress = "xxx@qq.com"; /** * 发送者姓名 **/ private static final String posterName = "xxx"; @Autowired private JavaMailSender javaMailSender; @Autowired private JavaMailSenderImpl javaMailSenderImpl; /** * 文本发送 **/ public void sendEmailAsText(final EmailModel emailModel) { MimeMessagePreparator mimeMessagePreparator = mimeMessage -> { mimeMessage.setFrom(posterAdress); mimeMessage.setRecipients(Message.RecipientType.TO, emailModel.getRecieverEmailAddress()); mimeMessage.setText("<html><body>" + "hello:" + emailModel.getRecieverName() + "<br>" + "msg:" + emailModel.getEmailContent() + "<br>" + "from :" + posterName + "</body></html>"); }; try { this.javaMailSender.send(mimeMessagePreparator); logger.info("邮箱已返送至[{}]邮箱!", emailModel.getRecieverName()); } catch (MailException e) { logger.error("邮箱异常:{}", e); } } /** * html 网页发送 * 该方法为同步方法 **/ public void sendEmailAsSysExceptionHtml(final EmailModel emailModel) { MimeMessage mimeMessage = javaMailSenderImpl.createMimeMessage(); MimeMessageHelper mimeMessageHelper; try { mimeMessageHelper = new MimeMessageHelper(mimeMessage, true); mimeMessageHelper.setFrom(posterAdress); mimeMessageHelper.setTo(emailModel.getRecieverEmailAddress()); mimeMessageHelper.setText("<!DOCTYPE html>\n" + "<html>\n" + "\t<head>\n" + "\t\t<meta charset=\"UTF-8\">\n" + "\t\t<title></title>\n" + "\t</head>\n" + "\t<style>\n" + "\t\tbody,\n" + "\t\ttable,\n" + "\t\ttbody,\n" + "\t\ttr {\n" + "\t\t\tbackground-color: aquamarine;\n" + "\t\t\tbackground-size: 100%;\n" + "\t\t}\n" + "\t</style>\n" + "\n" + "\t<body>\n" + "\t\t<table border=\"solid 2 px\" align=\"center\" style=\"text-align: center;\">\n" + "\t\t\t<tbody>\n" + "\t\t\t\t<tr>\n" + "\t\t\t\t\t<td width=\"200px\" bgcolor=\"coral\">时间</td>\n" + "\t\t\t\t\t<td width=\"80%\" bgcolor=\"azure\">" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + "</td>\n" + "\t\t\t\t</tr>\n" + "\t\t\t\t<tr>\n" + "\t\t\t\t\t<td width=\"200px\" bgcolor=\"coral\">信息</td>\n" + "\t\t\t\t\t<td width=\"80%\" bgcolor=\"azure\">" + "测试" + "</td>\n" + "\t\t\t\t</tr>\n" + "\t\t\t\t<tr>\n" + "\t\t\t\t\t<td width=\"200px\" bgcolor=\"coral\">堆栈</td>\n" + "\t\t\t\t\t<td width=\"80%\" bgcolor=\"azure\" style=\"text-align: left;\">" + emailModel.getEmailContent() + "</td>\n" + "\t\t\t\t</tr>\n" + "\t\t\t</tbody>\n" + "\t\t</table>\n" + "\t</body>\n" + "\n" + "</html>" , true); this.javaMailSender.send(mimeMessage); logger.info("邮箱已返送至[{}]邮箱!", emailModel.getRecieverName()); } catch (MessagingException e) { e.printStackTrace(); } catch (MailException e) { logger.error("邮箱异常:{}", e); } } }
notice3.1:可自行设置文本发送api、html发送api、图片发送api等。
我的工具类中只写了文本发送和html发送两种格式的api。
4:EmailUtils Bean
因为我们是整合springBoot的,因此我们需要向spring容器注入这个Bean,(因为默认单例)。
@Configuration public class BeanRegistryCenterConfig {
/** * 邮箱工具类 bean 注册 **/ @Bean public MailSendUtils mailSendUtils() { return new MailSendUtils(); } }
5:Application.properties
spring.mail.host=smtp.qq.com spring.mail.port=587 spring.mail.username=你的qq@qq.com spring.mail.password=xxxxx spring.mail.protocol=smtp spring.mail.default-encoding=UTF-8
spring.mail.usernam:是你的qq邮箱地址
spring.mail.password:不要用真正的qq邮箱密码,而是qq邮箱第三方服务授权码
6:获取邮箱第三方服务授权码
①:登录qq邮箱,进入首页,点击设置按钮
②:点击账户设置
并拉到最下面点击我圈中的开启按钮
然后会弹出一个小框提示你发信息,发就行了,发送之后点击验证会收到授权码
除了spring.mail.username、spring.mail.password 两项要换成自己的 ,其他的和我一样就行;
7:测试
7.1:文本格式邮件
/** * Java Mail 文本发送 **/ @Test public void EmaiTest() { EmailModel emailModel = new EmailModel(); emailModel.setEmailTheme("测试"); emailModel.setRecieverName("测试"); emailModel.setEmailContent("测试"); emailModel.setRecieverEmailAddress("xxx@qq.com"); mailSendUtils.sendEmailAsText(emailModel); }
控制台:
目标邮箱收到的邮件:
7.2:html格式邮件
/** * Java Mail 网页发送 **/ @Test public void EmailTest2() throws MessagingException, InterruptedException { EmailModel emailModel = new EmailModel(); emailModel.setEmailTheme("测试"); emailModel.setRecieverName("测试"); emailModel.setEmailContent("测试"); emailModel.setRecieverEmailAddress("xxx@qq.com"); mailSendUtils.sendEmailAsSysExceptionHtml(emailModel); }
目标邮箱收到的邮件:
这个展示效果可以自己设置。
8:注意点
发送邮件者的邮箱地址为qq邮箱,否则会QQ邮箱认证报错。而接收者邮箱可以为其他的邮箱,如企业邮箱、网易邮箱等。
记录同学的问题:
①:如何同时发送邮件给多个邮箱?
回:获取接收者的邮箱,放到一个集合,然后调用封装的api逐个发送。也可以考虑多线程处理,这样会比较快。
②:接收者邮箱需要按平台分开发送吗?
回:不需要,只要接收者的邮箱正确,直接发送就行,我们只需要配置发件人的邮箱。毕竟你不用JavaMail,打开你的邮箱APP,编写好邮件直接发送就行了,不用在乎接收者的邮箱平台。