最近项目上做邮箱发送功能,学习了公司已经实现邮箱功能,和结合自己实际上线操作经验,记录我一路走来那些坑。

在开发功能之前,度娘上一搜,八成点击了CSDN上某位大佬博客,代码copy在写个测试跑通后,心满意足的结束自己开发。这也是我也经历过的阶段,我还写过163和QQ邮箱二合一的工具类,其实其中隐藏的坑你可能碰都没碰到。
类似代码

private static void sendByQQ(String toMail, String subject, String text) throws MessagingException {Properties properties = new Properties();properties.put("mail.transport.protocol", "smtp");// 连接协议properties.put("mail.smtp.host", "smtp.qq.com");// 主机名properties.put("mail.smtp.port", 465);// 端口号properties.put("mail.smtp.auth", "true");properties.put("mail.smtp.ssl.enable", "true");// 设置是否使用ssl安全连接 ---一般都使用properties.put("mail.debug", "true");// 设置是否显示debug信息 true 会在控制台显示相关信息// 得到回话对象Session session = Session.getInstance(properties);// 获取邮件对象Message message = new MimeMessage(session);// 设置发件人邮箱地址message.setFrom(new InternetAddress(prop.getUserMail()));// 设置收件人邮箱地址message.setRecipient(Message.RecipientType.TO, new InternetAddress(toMail));//一个收件人// 设置邮件标题message.setSubject(subject);// 设置邮件内容message.setText(text);// 得到邮差对象Transport transport = session.getTransport();// 连接自己的邮箱账户transport.connect(prop.getUserMail(), prop.getPassword());// 密码为QQ邮箱开通的stmp服务后得到的客户端授权码// 发送邮件transport.sendMessage(message, message.getAllRecipients());transport.close();}

这个功能可能可以其他需求,比如要构造一个非常好看的正文内容,又比如添加一些附件等,这时候你又要重复修改你的工具类代码,这样代码的可维护性和稳定性难以保证,其实SpringBoot早就对这个高热点功能做了集成。

SpringBoot邮箱集成

导入依赖

<!-- 发送邮箱 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId>
</dependency>

编写配置文件

spring:mail:host: smtp.163.comport: 465protocol: smtpsusername: xxxxxxxxxxxxx@163.compassword: xxxxxxxxxxxxx

编写实现(这里只实现发纯文本)

@Slf4j
@Service
public class SendMailServiceImpl implements SendMailService {@Autowiredprivate JavaMailSender javaMailSender;@Value("${spring.mail.username}")private String from;@Overridepublic void sentMail(String sendTo, String subject, String text) {SimpleMailMessage message = new SimpleMailMessage();message.setFrom(from);message.setTo(sendTo);message.setSubject(subject);message.setText(text);try {javaMailSender.send(message);log.info("邮件已发送。");} catch (Exception e) {log.error("发送邮件时发生异常了!", e);}}}

测试

@RunWith(SpringRunner.class)
@SpringBootTest("classpath:application.yaml")
public class MailUtilTest {@Autowiredprivate SendMailService sendMailService;@Testpublic void test1(){sendMailService.sentMail("xxxxxx@qq.com ","测试","这是一份测试邮箱,请勿回复");}
}

第一个坑

上线部署后会发现这样报错现象

后续怀疑服务器没有开25端口,我找技术总监开一下端口,结果还是一样报错问题,经过网上查询后发现25端口发邮箱,在云服务器上是不允许的,运营商会把25端口封杀掉,所有会一直导致超时。

解决办法

所以邮箱应用请不要走25端口,除了25端口还有465端口走smtps协议,这样完美解决线上超时问题

第二个坑

像这样的功能,一般会很费时因为你要发请求到邮箱服务器,然后邮箱服务器执行你的请求把结果返回,如果途中出现意外,不小心这个请求阻塞了,或者其他怎么了情况太多了。而我们程序不可能只发一条信息,如果直接调用这个发邮箱方法,会出现这样情况,一个阻塞,其他就都进不来情况。

解决办法

  • 异步处理
    这需要消息队列支撑,才能实现异步处理。一般看项目大小,中大型项目推荐使用
  • 线程池
    我这是在公司项目中看到做法,其实思路非常清晰,而且不需要额外框架支撑,非常适合小公司小项目使用。
    1.写一个线程用于执行发送邮箱方法
    2.写一个Service用于创建线程池和创建线程放入线程池执行方法
    3.调用创建线程放入线程池执行方法即可

一篇就懂SpringBoot邮箱功能相关推荐

  1. 一文带你看懂Springboot核心功能及优缺点

    点击上方[视学算法]→右上角[...]→[设为星标⭐] SpringBoot核心功能 1.独立运行Spring项目 Spring boot 可以以jar包形式独立运行,运行一个Spring Boot项 ...

  2. 一篇读懂springboot用echarts实现实时柱状图和饼状图查询

    1.业务说明 将数据库中的数据分别以柱状图和饼状图呈现出来 gitee项目路径:https://gitee.com/ziac/ls.git 2.1 柱状图需要引入的js 建议去echarts官网直接用 ...

  3. SpringBoot集成邮箱功能并使用Knife4j测试

    SpringBoot集成邮箱功能并使用Knife4j测试 哔哩哔哩链接:https://www.bilibili.com/video/BV1uA411N7cm 1.获取163或QQ邮箱授权码 163邮 ...

  4. 一文读懂SpringBoot中的事件机制

    一文读懂SpringBoot中的事件机制?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法. 要"监听"事件,我们总是 ...

  5. python 类-Python入门--一篇搞懂什么是类

    原标题:Python入门--一篇搞懂什么是类 写一篇Python类的入门文章,在高级编程语言中,明白类的概念和懂得如何运用是必不可少的.文章有点长,3000多字. Python是面向对象的高级编程语言 ...

  6. 新一配:一篇看懂加油站产业链解决方案

    新一配:一篇看懂加油站产业链解决方案的文章 一.加油站市场规模 截至2018年9月,全国机动车保有量达3.22亿辆,机动车驾驶人达4.03亿人.在这庞大的汽车生活消费生态链中,加油是汽车消费必不可少的 ...

  7. 一篇搞定 SpringBoot+Mybatis+Shiro 实现多角色权限管理

    初衷:我在网上想找整合springboot+mybatis+shiro并且多角色认证的博客,发现找了好久也没有找到想到的,现在自己会了,就打算写个博客分享出去,希望能帮到你. 原创不易,请点赞支持! ...

  8. 一篇读懂:Android手机如何通过USB接口与外设通信(附原理分析及方案选型)

    更多技术干货,欢迎扫码关注博主微信公众号:HowieXue,共同探讨软件知识经验,关注就有海量学习资料免费领哦: 目录 0背景 1.手机USB接口通信特点 1.1 使用方便 1.2 通用性强 1.3 ...

  9. 计算机网络知识点全面总结(一篇全懂)

    一.计算机网络概述 1.1 计算机网络的分类 按照网络的作用范围:广域网(WAN).城域网(MAN).局域网(LAN):按照网络使用者:公用网络.专用网络. 1.2 计算机网络的层次结构 ​TCP/I ...

最新文章

  1. symfony 2 app.php,php / symfony2从URL隐藏app.php
  2. 构建Docker镜像(三)
  3. 【leetcode】944. Delete Columns to Make Sorted
  4. C#基础概念二十五问 【二】 [转]
  5. 来自Riot 的一份游戏美术教程(一):核心原则
  6. ExtJS MVC学习手记 1
  7. 关于工业级RS485串口服务器的组网方式详解
  8. 前端学习(3008):vue+element今日头条管理--登录中的loding
  9. Pyinstaller打包Django项目
  10. linux和windows输入法,关于输入法框架,这里有可以跨平台的linux和windows。。。。...
  11. bigdecimal不等于0怎么写_写文章死憋写不出来,怎么破?
  12. 测控技术与仪器是计算机相关的,测控技术与仪器专业
  13. python json()是什么函数_python 处理 json 四个函数dumps、loads、dump、load的区别
  14. python+selenium 使用for循环,遍历 定位 获取 单个元素中想要的值
  15. WIN31DOSBox中魔改PWIN32 - 温故、浸馨、继而知新
  16. Python3 文档批量助手
  17. 12、添加和删除页码符号
  18. python处理淘宝助理csv_淘宝助理上传CSV文件
  19. SpringCloudGateway原理——Gateway集成eureka服务发现转发请求
  20. 华为2018年服务器销售额,2018Q4华为服务器收入全球第三 同比增45.9%

热门文章

  1. 手势密码设置需求——测试用例
  2. 安徽计算机省一级考试试题,安徽省计算机一级考试试题
  3. 小红书无水印解析API
  4. 关于IDEA启动Spring Boot项目出现Caused by: java.lang.NoClassDefFoundError: javax/servlet/ServletContext at j
  5. 【调剂】中国石油大学(华东)应用岩石物理实验室接收调剂研究生
  6. 《SaltStack技术入门与实践》——执行结果处理
  7. C#经纬度加减运算(度°分′秒″格式)
  8. Blat - Windows命令行SMTP邮件程序
  9. 建立数据目录的6个步骤
  10. FPGA基础知识极简教程(7)详解亚稳态与跨时钟域传输