🎬 HoRain云小助手:个人主页
🔥 个人专栏: 《Linux 系列教程》《c语言教程》
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
专栏介绍
专栏名称 | 专栏介绍 |
《C语言》 | 本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。 |
《网络协议》 | 本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制! |
《docker容器精解篇》 | 全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。 |
《linux系列》 | 本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。 |
《python 系列》 | 本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。 |
《试题库》 | 本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等) |
目录
⛳️ 推荐
专栏介绍
📧 Java 发送邮件:从 SMTP 到企业级
📦 依赖先就位
纯 Jakarta Mail(Java 17+ 推荐)
Spring Boot(生产首选)
📧 最小可跑:纯 JavaMail(SMTP + 25 或 465/587)
🎨 常见变体(HTML / 附件 / 多收件人)
HTML 邮件
带附件
多收件人 / 抄送 / 密送
🔐 SSL / TLS 端口速查
🌱 Spring Boot 写法(生产真用这个)
application.yml
Service 层
⚠️ 高频踩坑清单
🏗️ 生产进阶姿势
📧 Java 发送邮件:从 SMTP 到企业级
Java 发邮件主线就两条:纯 JavaMail(Jakarta Mail) 和Spring BootJavaMailSender。前者是底层 API,后者是生产里 90% 场景的写法。下面从「能跑」到「不踩坑」铺开。
📦 依赖先就位
纯 Jakarta Mail(Java 17+ 推荐)
<!-- pom.xml --> <dependency> <groupId>com.sun.mail</groupId> <artifactId>jakarta.mail</artifactId> <version>2.0.1</version> </dependency>JDK 11 之前叫javax.mail,Java 11 后 Jakarta EE 改名jakarta.mail,包名从javax.mail.*→jakarta.mail.*,别引错。
Spring Boot(生产首选)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>📧 最小可跑:纯 JavaMail(SMTP + 25 或 465/587)
import jakarta.mail.*; import jakarta.mail.internet.*; import java.util.Properties; public class MailDemo { public static void main(String[] args) throws Exception { Properties props = new Properties(); props.put("mail.smtp.host", "smtp.qq.com"); props.put("mail.smtp.port", "587"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); // 587 走 STARTTLS // 465 用 props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 老写法 Session session = Session.getInstance(props, new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication( "123456@qq.com", // 发件人 "xxxxxx" // ⚠️ QQ/163 这里是【授权码】,不是邮箱密码 ); } }); Message msg = new MimeMessage(session); msg.setFrom(new InternetAddress("123456@qq.com")); msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse("receiver@example.com")); msg.setSubject("测试邮件", "UTF-8"); msg.setText("你好,这是一封 Java 发的邮件", "UTF-8"); Transport.send(msg); System.out.println("发送成功"); } }⚠️ 国内邮箱(QQ/163/126)密码栏填的不是登录密码,是「授权码」——要去邮箱设置 → 开启 POP3/SMTP → 生成授权码,卡在这的人 80%。
🎨 常见变体(HTML / 附件 / 多收件人)
HTML 邮件
msg.setContent("<h1>Hello</h1><p style='color:red'>红色字</p>", "text/html; charset=UTF-8");带附件
MimeMessage msg = new MimeMessage(session); msg.setFrom(…); msg.setSubject("带附件", "UTF-8"); // 正文 MimeBodyPart textPart = new MimeBodyPart(); textPart.setText("见附件", "UTF-8"); // 附件 MimeBodyPart attachPart = new MimeBodyPart(); attachPart.attachFile("report.pdf"); attachPart.setFileName(MimeUtility.encodeText("报表.pdf", "UTF-8", "B")); // 中文文件名防乱码 Multipart mp = new MimeMultipart(); mp.addBodyPart(textPart); mp.addBodyPart(attachPart); msg.setContent(mp);多收件人 / 抄送 / 密送
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse("a@x.com,b@x.com")); msg.setRecipient(Message.RecipientType.CC, new InternetAddress("cc@x.com")); msg.setRecipient(Message.RecipientType.BCC, new InternetAddress("bcc@x.com"));🔐 SSL / TLS 端口速查
端口 | 协议 | 备注 |
|---|---|---|
25 | SMTP(明文,很多云厂商封) | 老默认,现基本不用 |
587 | STARTTLS | 推荐,明文→协商加密 |
465 | SMTPS(SSL/TLS 直连) | 老写法 |
QQ 邮箱两路都通:587(STARTTLS) / 465(SSL),163 同理。
🌱 Spring Boot 写法(生产真用这个)
application.yml
spring: mail: host: smtp.qq.com port: 587 username: 123456@qq.com password: 授权码 # 不是邮箱密码 properties: mail: smtp: auth: true starttls: enable: trueService 层
@Service public class MailService { @Autowired private JavaMailSender mailSender; public void send(String to, String subject, String body) { SimpleMailMessage msg = new SimpleMailMessage(); msg.setFrom("123456@qq.com"); msg.setTo(to); msg.setSubject(subject); msg.setText(body); mailSender.send(msg); } // 带附件 public void sendWithAttach(String to, String pdfPath) throws MessagingException { MimeMessage msg = mailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(msg, true, "UTF-8"); helper.setFrom("123456@qq.com"); helper.setTo(to); helper.setSubject("报表"); helper.setText("请查收附件"); helper.addAttachment("报表.pdf", new File(pdfPath)); mailSender.send(msg); } }Spring 把
Authenticator、Session 构建全包了,配置里username/password一把梭,比纯 JavaMail 短一半。
⚠️ 高频踩坑清单
坑 | 现象 | 解法 |
|---|---|---|
QQ/163 密码用登录密码 |
| 换SMTP 授权码 |
阿里云/腾讯云服务器 25 端口 | 连不通 / 超时 | 换 587 或申请解封 25 |
中文附件名乱码 | 收到 |
|
Gmail | 要用 App Password + 允许"低安全应用"已废 | OAuth2 或 App Password |
企业邮箱(钉钉/企业微信) | 要走企业 SMTP 或 API | 看企业文档,常要 IP 白名单 |
生产群发 | 被当成垃圾邮件 | DKIM/SPF 配好,别一秒狂发 |
🏗️ 生产进阶姿势
模板邮件:FreeMarker / Thymeleaf 渲染 HTML,再塞进
helper.setText(html, true)异步发:
@Async或 MQ,别让主线程卡 SMTP云厂商 SMTP 替代:AWS SES / 阿里云 DM / SendGrid → HTTP API,不走 SMTP,量大稳
失败重试:MQ + 死信,比 while-retry 稳
要不要顺着往下看Spring Boot + Thymeleaf 模板邮件 或者AWS SES / 阿里云 DM 的 Java SDK 发信(不走 SMTP,HTTP 那侧)?跟前面 FastAPI / PHP 那条工具线也能串上。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙