news 2026/7/3 17:44:37

HoRain云--Java发送邮件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HoRain云--Java发送邮件

🎬 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 直连)

老写法mail.smtp.ssl.enable=true

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: true

Service 层

@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 密码用登录密码

535 Login Fail

SMTP 授权码

阿里云/腾讯云服务器 25 端口

连不通 / 超时

换 587 或申请解封 25

中文附件名乱码

收到???.pdf

MimeUtility.encodeText(fileName, "UTF-8", "B")

Gmail

要用 App Password + 允许"低安全应用"已废

OAuth2 或 App Password

企业邮箱(钉钉/企业微信)

要走企业 SMTP 或 API

看企业文档,常要 IP 白名单

生产群发

被当成垃圾邮件

DKIM/SPF 配好,别一秒狂发


🏗️ 生产进阶姿势


要不要顺着往下看Spring Boot + Thymeleaf 模板邮件​ 或者AWS SES / 阿里云 DM 的 Java SDK 发信(不走 SMTP,HTTP 那侧)?跟前面 FastAPI / PHP 那条工具线也能串上。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/3 17:40:32

GPT-5.5 API怎么选?实战教程与10个代码生成Prompt技巧盘点清单

在AI辅助编程领域&#xff0c;如何提升代码生成效率是开发者最核心的痛点。很多研发团队在对比GPT-4o与最新GPT-5.5时&#xff0c;常因Prompt不够精准导致生成的代码产生Bug或逻辑断层。为了降低开发者的调用成本&#xff0c;不少人选择通过AI模型聚合平台&#xff08;如 yingc…

作者头像 李华
网站建设 2026/7/3 17:40:17

SheepGeo2026实测:品牌AI可见性诊断的专业之选

围绕免费的AI可见性检测工具&#xff0c;本文从行业场景、选择标准和落地价值三个维度展开判断。为什么2026年品牌需要关注AI可见性&#xff1f;当用户打开DeepSeek、Kimi或豆包询问“哪款空气净化器适合母婴家庭”时&#xff0c;AI给出的推荐列表&#xff0c;正在取代传统的搜…

作者头像 李华