springboot邮件发送 端口587/465不同配置

2023-11-20

Spring Boot教程(26) – 如何发送邮件 - 知乎

大体上来说,发送的方式有两种,一种是使用SMTP协议,连上SMTP服务器发送邮件,一种是使用第三方的邮件发送服务,调调API就行。我们先来说说前者。

SMTP是“简单邮件传输协议”的简称,是用来邮件的,与之对应的是用来邮件的IMAP和POP3协议,后俩协议暂且不提。现在各大邮件服务商比如Gmail,网易邮箱,QQ邮箱等都有提供SMTP服务器方便你发送邮件,比如你本地的邮件客户端,在添加你的邮箱的时候就需要提供SMTP服务器的地址和端口。同时还需要提供的,就是你的邮箱和密码,这个密码通常不是你的登陆密码,而是一个授权码,类似于token的东西,你需要在后台生成,在账户出现安全问题的时候这个授权码是有办法revoke的。有了SMTP服务的地址、端口、邮箱和密码,你就能在邮件客户端上或者编写代码来发送邮件了。

SMTP服务器的地址,不同的服务商会不同,比如网易的就是smtp.163.com。SMTP协议的端口号是25,使用了TLS加密的端口可能是465、587和994,不同的服务商可能用的还不一样,你需要利用服务商文档和搜索引擎确定哪个是能用的,他们的区别下面会提到。注意!!如果你用的阿里云ECS,用25端口是发不出去邮件的,也就是连不到外面服务器的25端口,应该是出于安全原因或者是防止滥用,总之,记得换端口。

如果你们是一家严肃的企业,考虑到对外形象,邮箱肯定会用到自己的域名。这种情况下,要么是自建邮件服务器,要么是使用市场上的企业邮件服务,比如Gmail和腾讯企业邮箱都可以绑定域名。使用自己的邮箱域名,无非就是更换下SMTP的信息,差别不大。

说完SMTP,再来聊聊第三方的邮件发送服务吧。比较知名的有MailgunSendGridSendCloudAmazon SES阿里云的邮件推送服务等。这些服务的操作大概都是这样的,先把邮箱域名的MX记录解析到他们的服务器(服务商都会说明怎么加记录的),然后使用API或者SMTP来发送,一般用的都是API或者其对应的SDK,方便灵活,SMTP可能更多的是为了兼容老的代码吧,改改配置就行的。发送量小的随便用,量大的话交点钱。

我比较倾向于使用第三方的服务,拿SDK调调API就行,跟使用别的开源库的流程差不多。我的博客(http://fookwood.com)的评论通知服务,用的就是Mailgun,你要是评论了,我就会收到邮件通知,Mailgun额度是每月免费发1w封。

协议与端口

上面我们说了,SMTP的端口是25,协议是明文的,也就说和HTTP协议一样,它容易被黑客嗅探到。大概在20多年前,出了个SMTPS,它利用465端口先建立TLS连接,再发送邮件文本,类似HTTPS,提高安全性。一年后SMTPS和465端口就废弃了(465端口挪作他用),替代它的是STARTTLS协议,利用587端口,客户端连上587端口之后,先获知服务器是否支持加密链接,支持的话就建立TLS连接,然后在其上跑SMTP协议。这个协议“升级”的过程类似于WebSocket。

然后由于历史原因,兼容性原因,465端口一直在很多客户端和服务器上使用。邮件服务提供商也是如此,所以。。。记得看帮助文档,优先用587,再不行用465,是在没辙用25。

Spring Boot是怎么支持的

既然知道原理了,我们就说说如何用代码通过SMTP发邮件。

JavaMail是一套邮件相关的API,是Jakarta EE的一部分。Spring框架对邮件也进行了个简单的抽象,定义了MailSenderMailMessage两个抽象接口,脑补一下大概可以得出他的使用方式应该是mailSender.send(new MailMessage());这种。这两个接口可以有多种实现,不过目前只有一种,那就是封装了JavaMail的实现,对应的类分别是JavaMailSenderMimeMailMessage

JavaMailSender有个实现类JavaMailSenderImpl,new一个他的对象,设置好服务器地址、端口、用户名和密码(授权码),就能发邮件咯。有了Spring Boot之后,创建对象的操作不需要你来搞,你只需要在application.properties中配置相关信息,Spring Boot会帮你生成好对象并放到容器中。为此你需要先引入Mail Stater:

这样JavaMail和Spring框架的Mail支持,也就是上面提到的那些类都被引入到了项目中。然后配置下,我举两个例子,分别是Gmail和网易邮箱的配置:

Gmail配置

网易邮箱配置

上面的两张图中,分别使用了587端口和465端口,也就是分别使用了STARTTLS和TLS/SSL。以spring.mail.properties开头的属性都传递给了JavaMail,Gmail的配置中开启了STARTTLS的支持,并且强制要求使用,如果服务器不支持STARTTLS,将会发生异常。网易的配置中开启了TLS的支持,也就是传输邮件需要建立在加密连接上。

我在看Spring源码的时候发现,如果需要使用用户名密码验证的话,需要将mail.smtp.auth打开,以便进行身份验证。然而实际上,JavaMail会判断如果用户名和密码都提供了,会自动进行身份验证,上面两个图中注释掉的属性可有可无。相关代码在SMTPTransport中,有兴趣的可以看看。

属性都配置好了之后,就可以直接在代码中引用JavaMailSender对象了:

把邮件发出去

如果你的邮件内容足够简单,可以使用SimpleMailMessage来设置发件人、收件人、抄送人、密送人、标题和内容等等。

有的时候吧,这些个字段不太够。比如说,你设置收件人的昵称,上图中的to是个邮箱的数组,显然没办法满足需求。你需要更底层的JavaMail中的MimeMessage

MimeMessage对象通过JavaMailSender来创建,大概是因为MimeMessage对象操作起来有点复杂,Spring框架提供了MimeMessageHelper 来方便地设置各种内容,包括昵称,附件和HTML文本什么的。看了看源码,这些个类03年04年就加上了,迭代了这么十几年,应该没什么坑了吧。

其实邮件发出去挺简单的,耗时间的应该是邮件模版吧,我还没搞过,听说有兼容性坑,哪天遇到了再总结一下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springboot邮件发送 端口587/465不同配置 的相关文章

随机推荐

  • Qt对话框

    Qt的对话框分为两种 模态对话框和非模态对话框 模态对话框 模态对话框 不可以对其其他窗口进行操作 比如像下面这种 出现后无法再操作其他窗口 比如像下面这种 创建后就无法在操作写代码的窗口 创建对话框要将 include
  • 【Unity&C#&随机数】随机数

    一个简单的随机数获得 0或1 使用了这样的代码 想要获得0或者1 if Input anyKeyDown float i 1 if i 1 i Random Range 0 Rang i i lt 0 5 0 1 Debug Log Cou
  • C语言经典100例题(18)--题目:求s=a+aa+aaa+aaaa+aa...a的值

    目录 题目 问题分析 代码 测试结果 题目 求s a aa aaa aaaa aa a的值 其中a是一个数字 例如2 22 222 2222 22222 此时共有5个数相加 几个数相加有键盘控制 问题分析 加数之间的规律 a a 0 10
  • Python实现归并排序

    Python实现归并排序 一 归并排序简介 归并排序 Merge Sort 是建立在归并操作上的一种效率很高的排序算法 比较占用内存 该算法是分治法 Divide and Conquer 的一个典型应用 归并排序将两个或两个以上 一般是两个
  • 华为OD机试 Python 【响应报文时间】

    题目 假设你正在接收网络报文 并且需要在一定时间内对它们作出响应 每次当你收到一个报文时 它会有一个 最大响应时间 来告诉你最晚需要在什么时候回应 但是 如果在等待回应期间又收到了新的报文 你可能需要更新你的响应时间 最大响应时间 是这样计
  • 关于uthash 的初步源码阅读

    背景 在偶然的mqtt mosquitto 中的源码中查看的关于topic的处理 知道了哈希表这种的数据结构 最近花了一点时间将这个部分的源码看了一部分 不知道后面还有没有时间继续查看所以就写一篇文档作为笔记吧 uthash 使用 utha
  • 数据ETL面临的问题----数据缺失

    数据缺失的类型有 完全随机缺失 Missing Completely at Random MCAR 数据的缺失与不完全变量以及完全变量都是无关的 随机缺失 Missing at Random MAR 数据的缺失不是完全随机的 数据的缺失只依
  • C++【认知系列】实时获取鼠标坐标

    实时获取鼠标的坐标值 include
  • 配置描述文件mobileconfig的生成及注意事项

    1 mobileconfig描述配置文件的下载 我们要控制ios上的移动设备 那么我们就需要下载mobileconfig描述配置文件 一般我们可以一个设备对应一个设备ID 即我们后面会看到的请求参数 deviceId 例如 PUT Path
  • DHorse v1.3.2 发布,基于 k8s 的发布平台

    版本说明 新增特性 构建版本 部署应用时的线程池可配置化 优化特性 构建版本跳过单元测试 解决问题 解决Vue应用详情页面报错的问题 解决Linux环境下脚本运行失败的问题 解决下载Maven安装文件失败的问题 升级说明 下载v1 3 2安
  • WSL无法访问网络的解决办法

    今天在用WSL的时候突然网络抽风 域名解析出了问题 apt update都用不了 网上查了很多方法 什么vEthernet的IP啊 ifconfigip啊 ip route add default啥的 都不管用 最后还是看了一下 etc r
  • 论文总结——因果发现与推断

    文章目录 背景 非时序因果模型 因果充分性假设 两个变量之间的因果关系 基于约束的方法 结构方程模型 Structural Equation Model SEM 时序因果模型 待解决的问题 参考 背景 很多科学都需要通过观测一组变量或者对其
  • Idea部署OpenCV3.4.14开发环境

    Idea配置OpenCV开发环境 一 开发环境 idea 2018 3 3 opencv 3 4 14 jdk 1 8 0 191 二 下载OpenCV3 4 14 下载地址 https opencv org releases 三 把下载的
  • 解决Keil调试模式下无法设置断点的问题

    问题描述 使用Keil打开工程文件 进入调试模式后 只有main c文件里面可以设置断点 其余文件都不可以设置断点 可能的原因及解决方案 原因1 工程路径包含中文 解决方案1 更换为全英文路径 原因2 工程没有全部Rebuild 解决方案2
  • 单目摄像头光学图像测距_单目测距算法

    单目测距算法 相似三角形 用相似三角形计算物体或者目标到相机的距离 将使用相似三角形来计算相机到一个已知的物体或者目标的距离 假设有一个宽度为 W 的目标或者物体 然后将这个目标放在距离的相机为 D 的位置 用相机对物体进行拍照并且测量物体
  • 报错:No Session found for current thread

    No Session found for current thread 没有找到当前线程的会话 这个问题我是在整合Spring时出现的 问题很好解决 在Hibernate的配置文件hibernate cfg xml中加入这 样一条配置就好
  • “反AI斗士”马斯克宣布成立xAI :目标是了解宇宙真实本质

    北京时间7月13日凌晨 马斯克在Twitter上宣布 xAI正式成立 去了解现实 马斯克表示 推出xAI的原因是想要 了解宇宙的真实本质 Ghat GPT横空出世已有半年 国内外 百模大战 愈演愈烈 AI大模型的现状与发展 你怎么看 方向一
  • 剑指Offer(牛客网)-数据流中的中位数

    题目来源 https www nowcoder com practice 9be0172896bd43948f8a32fb954e1be1 tpId 13 tqId 11216 tPage 4 rp 4 ru ta coding inter
  • 内网DNS域名解析 dnsmasq搭建

    此片文章为DNS内网解析部署文档 简单实用 解决企业内部web服务IP地址访问问题 企业内部如果不启用域名DNS服务 服务器就只能通过IP进行访问了 除了传统的bind解决方案 推荐一个新的DNS解决方案 dnsmasq dnsmasq 用
  • springboot邮件发送 端口587/465不同配置

    Spring Boot教程 26 如何发送邮件 知乎 大体上来说 发送的方式有两种 一种是使用SMTP协议 连上SMTP服务器发送邮件 一种是使用第三方的邮件发送服务 调调API就行 我们先来说说前者 SMTP是 简单邮件传输协议 的简称