先看怎么在spring boot发邮件,我们通过一个service来实现:

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;@Slf4j
@Service
public class MailService {@AutowiredJavaMailSender javaMailSender;@Value("${mail.from}")private String mailFrom;@Value("${mail.to}")private String mailTo;@Asyncpublic void sendSimpleMail(String subject, String content) {SimpleMailMessage message = new SimpleMailMessage();message.setFrom(mailFrom);message.setTo(mailTo);message.setSubject(subject);message.setText(content);try {javaMailSender.send(message);log.info("邮件已经发送");} catch (Exception e) {log.error("发送邮件异常", e);}}}

  我们在application.properties文件中配置邮件参数,给mait.to配置多个邮箱,并用分号分隔

#邮件
spring.mail.host=smtp.163.com
spring.mail.username=tangseng2019@163.com
spring.mail.password=wlf123
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.starttls.required=true
spring.mail.properties.mail.starttls.enable=true
spring.mail.default-encoding=UTF-8
mail.from=${spring.mail.username}
mail.to=sunwukong2019@126.com;zhubajie2019@126.com

  注意spring.mail.password不是邮箱密码,而是授权码,需要在邮箱的“设置”中启用授权码:

  调用上面的发送接口sendSimpleMail

  问题来了:

2020-01-02 16:29:00.549 |-ERROR [http-nio-9988-exec-6] com.wlf.order.prize.service.MailService [34] -| 发送邮件异常
org.springframework.mail.MailParseException: Could not parse mail; nested exception is javax.mail.internet.AddressException: Illegal semicolon, not in group in string ``sunwukong2019@126.com;zhubajie2019@126.com'' at position 17at org.springframework.mail.javamail.MimeMailMessage.setTo(MimeMailMessage.java:111)at org.springframework.mail.SimpleMailMessage.copyTo(SimpleMailMessage.java:204)at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:319)at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:311)at com.wlf.order.prize.service.MailService.sendSimpleMail(MailService.java:31)at com.wlf.order.prize.aop.RequestInterceptor.postHandle(RequestInterceptor.java:117)at org.springframework.web.servlet.HandlerExecutionChain.applyPostHandle(HandlerExecutionChain.java:156)at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1046)at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908)at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:853)at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1587)at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)at java.lang.Thread.run(Thread.java:745)
Caused by: javax.mail.internet.AddressException: Illegal semicolon, not in groupat javax.mail.internet.InternetAddress.parse(InternetAddress.java:1045)at javax.mail.internet.InternetAddress.parse(InternetAddress.java:752)at javax.mail.internet.InternetAddress.parse(InternetAddress.java:729)at org.springframework.mail.javamail.MimeMessageHelper.parseAddress(MimeMessageHelper.java:710)at org.springframework.mail.javamail.MimeMessageHelper.setTo(MimeMessageHelper.java:596)at org.springframework.mail.javamail.MimeMailMessage.setTo(MimeMailMessage.java:108)... 50 common frames omitted
2020-01-02 16:29:00.550 |-DEBUG [http-nio-9988-exec-6] org.springframework.orm.jpa.support.OpenEntityManagerInViewInterceptor [111] -| Closing JPA EntityManager in OpenEntityManagerInViewInterceptor

  我们跟进MimeMailMessage类,发现最终死在了InternetAddress手上

  非法分号,也就是群发我们不应该调setTo(String to),而应该是setTo(String... to),我们需要自己把分号拆分一下,统一起来就是:

  自此开始批发邮件了,但问题又来了,邮件服务器开始把你的邮件当垃圾邮件来处理了。详情件spring发邮件被识别为垃圾邮件:org.springframework.mail.MailSendException: Failed messages: com.sun.mail.smtp.SMTPSendFailedException: 554 DT:SPM 163。

springboot群发邮件问题实例相关推荐

  1. springboot 集成rabbitmq 实例

    springboot 集成rabbitmq 实例 个人在学习rabbitmq时发现网上很少有系统性介绍springboot和rabbitmq如何集成的,其他人总结的都片段化,所以结合个人调研过程,整理 ...

  2. spring-boot整合场景实例分析

    Spring Boot 一.简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发 ...

  3. SpringBoot整合MongoDB实例

    目录 前言 1.表及字段设计 2.引入pom 3.yml配置 4.实体类创建 5.Repository 5.1.基础实现 5.2.方法查询 5.3.语句查询 6.具体实现 0.创建Repository ...

  4. Springboot集成websocket实例

    一.简介 WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议. WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数 ...

  5. springBoot之 Redis 实例

    1. 环境搭建 连接上redis 服务 导入依赖 <dependency><groupId>org.springframework.boot</groupId>&l ...

  6. Springboot集成netty实例

    一.简介 netty是jboss提供的一个java开源框架,netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可用性的网络服务器和客户端程序.也就是说netty是一个基于n ...

  7. URLClassLoader热加载、卸载,自定义热加载数据池 jar包(附:Springboot + Hutool-db 使用实例)

    参考文章: 利用classloader实现jar包的加载和卸载,实现类的热替换 动态添加classpath 关于ClassLoader.getSystemClassLoader()和Thread.cu ...

  8. angular图片传到后台_告诉你,SpringBoot+Angular有多牛逼!

    点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐] 零 本文基于<SpringBoot+Angular入门实例教程>第5.1节的内容理解并简化而来.本文的目的浅析前后台分离的普通 ...

  9. SpringBoot | 第九章:Mybatis-plus的集成和使用

    前言 本章节开始介绍数据访问方面的相关知识点.对于后端开发者而言,和数据库打交道是每天都在进行的,所以一个好用的ORM框架是很有必要的.目前,绝大部分公司都选择MyBatis框架作为底层数据库持久化框 ...

  10. 完美实现SpringBoot+Angular普通登录

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:2020,搞个 Mac 玩玩!个人原创+1博客:点击前往,查看更多 作者:LYX6666 链接:https:// ...

最新文章

  1. 要做服务和酒店行业的“领英” ,Industry 获得230万美元种子轮融资
  2. 美团_cc城市自定义
  3. 文件内容查找java,java库从文件内容中查找mime类型
  4. Oracle删库跑路
  5. Unity 5 来了!引领开发引擎进入次时代
  6. 根据库位获取仓库id
  7. 疫情之下,精准测试的智能可信模式正在成为中流砥柱
  8. 1、环境搭建、Helloworld
  9. 使用Promise链式调用解决多个异步回调的问题
  10. 三维点云学习(4)6-ransac 地面分割
  11. 缠论中枢python源码_缠论画中枢主图指标 源码 通达信 贴图
  12. 基于WEB的自行车租赁管理系统设计与实现
  13. lvds接口屏线安装图解_lvds液晶屏幕接口详解
  14. 计算机电脑怎么开热点,图解电脑怎么开热点wifi——广传攻柴
  15. Frequent Subsets Problem
  16. 码元速率与进制数无关
  17. Matlab求解AX=XB(手眼标定用)
  18. 一个BUG导致3000万损失!涉及资金交易的功能该如何做好测试和项目管理
  19. 自定义安装MS Office Project2007会出错
  20. 让AI玩俄罗斯方块 UCL ENGF2 CA4.1 作业

热门文章

  1. 数据库基础知识(1)--数据库php连接
  2. 英雄联盟3月17日服务器维护,英雄联盟将于3月17日凌晨2点开始进行全区停机维护...
  3. html svg 线条动画,HTML5 SVG图形轮廓线条绘制动画插件-vivus
  4. ITUT-T recommendations G.168 标准回声模型
  5. 2020秋招阿里测试开发一面
  6. 攻击机与靶机的文件共享、演示流程以及第三方主机的访问
  7. 慢慢的,就没有了,就像从未存在过
  8. 微博、微信朋友圈、QQ空间功能对比
  9. 图文并茂简介如何查询文章是否被SCI收录以及获取SCI索引号
  10. 2020 年 4 月使用 Aria2 加速下载百度网盘文件