在 Spring Boot 应用中使用JavaMailSender发送邮件时存在 "发送端" 的概念,这是由邮件传输的基本原理和 SMTP 协议的工作方式决定的。下面详细解释原因和相关概念:
邮件发送遵循客户端 - 服务器模型,需要:
- 发件人客户端:撰写邮件的应用程序(如 Outlook、Gmail 客户端)或代码(如 JavaMailSender)。
- 发送服务器(SMTP 服务器):负责将邮件传输到收件人的邮件服务器。
- 接收服务器(POP3/IMAP 服务器):收件人用来收取邮件的服务器。
即使是通过代码发送邮件,也必须通过一个SMTP 服务器中转,这个 SMTP 服务器就是 "发送端" 的核心组件。
JavaMailSender是 Spring 对 JavaMail API 的封装,其工作流程为:
- 创建邮件内容:在代码中构建邮件(如主题、正文、附件)。
- 连接 SMTP 服务器:
JavaMailSender根据配置(如spring.mail.host)连接到指定的 SMTP 服务器。
- 身份验证:使用配置的用户名和密码(如
spring.mail.username)登录 SMTP 服务器。
- 传输邮件:SMTP 服务器接收邮件后,负责将其路由到收件人的邮件服务器。
这里的SMTP 服务器就是 "发送端" 的具体实现,它代表您的应用程序将邮件发送到互联网。
邮件系统设计要求必须通过可信的 SMTP 服务器发送邮件,原因如下:
- 反垃圾邮件机制:互联网服务提供商(ISP)会过滤来自未知 IP 的邮件,只有通过注册的 SMTP 服务器发送的邮件才可能被接收。
- 身份验证:SMTP 服务器需要验证发件人身份(用户名 / 密码),防止伪造。
- 协议兼容性:SMTP 服务器处理底层协议细节(如 ESMTP 扩展、TLS 加密),简化客户端代码。
- 公共邮件服务提供商:
- Outlook/Hotmail:
smtp.office365.com
- Gmail:
smtp.gmail.com
- QQ 邮箱:
smtp.qq.com
- 企业内部邮件服务器:公司自建的 Exchange Server 或 Postfix 服务器。
- 第三方邮件服务:SendGrid、Mailgun、AWS SES 等。
在application.properties中指定 SMTP 服务器配置:
spring.mail.host=smtp.office365.com # Outlook的SMTP服务器地址
spring.mail.port=587 # TLS端口
spring.mail.username=your_email@outlook.com # 发件人邮箱
spring.mail.password=your_password # 邮箱密码或应用专用密码
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
- 发送端(SMTP 服务器):负责传输邮件的服务器,由您配置。
- 发件人邮箱:邮件中显示的 "From" 地址(如
sender@example.com),通常需要与 SMTP 服务器的认证邮箱一致,否则可能被标记为垃圾邮件。