在Java中发送电子邮件主要依赖Jakarta Mail
(原JavaMail API)实现,以下是详细步骤和完整代码示例,涵盖文本邮件、HTML邮件及附件发送:
准备工作
-
添加依赖(Maven项目):
<dependency> <groupId>com.sun.mail</groupId> <artifactId>jakarta.mail</artifactId> <version>2.0.1</version> </dependency>
-
获取SMTP服务:
- 使用QQ邮箱、163邮箱或企业邮箱(需开启SMTP服务)
- 以QQ邮箱为例:登录后进入“设置” → “账户” → 开启“POP3/SMTP服务”,获取授权码(非登录密码)。
发送文本邮件
import jakarta.mail.*; import jakarta.mail.internet.*; import java.util.Properties; public class EmailSender { public static void main(String[] args) { // 1. 配置SMTP服务器参数 Properties props = new Properties(); props.put("mail.smtp.host", "smtp.qq.com"); // QQ邮箱SMTP服务器 props.put("mail.smtp.port", "587"); // TLS端口 props.put("mail.smtp.auth", "true"); // 需要认证 props.put("mail.smtp.starttls.enable", "true"); // 启用TLS加密 // 2. 创建Session对象(传入邮箱账号和授权码) Session session = Session.getInstance(props, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("your_email@qq.com", "your_auth_code"); } }); try { // 3. 构建邮件内容 Message message = new MimeMessage(session); message.setFrom(new InternetAddress("your_email@qq.com")); // 发件人 message.setRecipient(Message.RecipientType.TO, new InternetAddress("recipient@example.com")); // 收件人 message.setSubject("Java邮件测试"); // 主题 message.setText("这是一封通过Java发送的文本邮件。"); // 正文 // 4. 发送邮件 Transport.send(message); System.out.println("邮件发送成功!"); } catch (MessagingException e) { e.printStackTrace(); } } }
发送HTML邮件与附件
// ...(Session配置同上,省略重复代码) try { Message message = new MimeMessage(session); message.setFrom(new InternetAddress("your_email@qq.com")); message.setRecipient(Message.RecipientType.TO, new InternetAddress("recipient@example.com")); message.setSubject("带附件的HTML邮件"); // 创建多部分消息(正文+附件) Multipart multipart = new MimeMultipart(); // 1. 添加HTML正文 MimeBodyPart htmlPart = new MimeBodyPart(); String htmlContent = "<h1 style='color:blue;'>Java邮件测试</h1><p>这是一封<strong>HTML格式</strong>的邮件!</p>"; htmlPart.setContent(htmlContent, "text/html; charset=utf-8"); multipart.addBodyPart(htmlPart); // 2. 添加附件 MimeBodyPart attachmentPart = new MimeBodyPart(); attachmentPart.attachFile(new File("C:/test_document.pdf")); // 附件路径 attachmentPart.setFileName("报告.pdf"); // 设置附件显示名称 multipart.addBodyPart(attachmentPart); // 绑定内容到邮件 message.setContent(multipart); Transport.send(message); System.out.println("HTML邮件发送成功!"); } catch (Exception e) { e.printStackTrace(); }
关键配置说明
参数 | 示例值 | 作用 |
---|---|---|
mail.smtp.host |
smtp.qq.com |
QQ邮箱SMTP服务器地址 |
mail.smtp.port |
587 或 465 |
TLS端口(587) / SSL端口(465) |
mail.smtp.auth |
true |
必须开启认证 |
mail.smtp.starttls.enable |
true |
启用TLS加密传输 |
常见问题解决
-
认证失败:
- 检查邮箱账号和授权码(非登录密码)
- 开启SMTP服务(如QQ邮箱需生成授权码)
-
连接超时:
props.put("mail.smtp.connectiontimeout", "5000"); // 5秒连接超时 props.put("mail.smtp.timeout", "10000"); // 10秒操作超时
-
端口被屏蔽:
- 尝试切换端口:
587
(TLS) 或465
(SSL) - 企业邮箱需联系管理员确认端口
- 尝试切换端口:
安全建议
- 避免硬编码密码:
将授权码存储在环境变量或加密配置文件中
- 强制加密:
- 始终启用
mail.smtp.starttls.enable=true
或mail.smtp.ssl.enable=true
- 始终启用
- 验证证书(生产环境):
props.put("mail.smtp.ssl.checkserveridentity", true); // 验证服务器证书
引用说明
- Jakarta Mail官方文档:Eclipse Jakarta Mail Project
- QQ邮箱SMTP设置指南:帮助中心
- JavaMail API历史迁移说明:Oracle移交公告
本文代码基于Jakarta Mail 2.0.1编写,适用于JDK 8+,实际使用时请替换邮箱账号、授权码及SMTP服务器地址,企业邮箱配置请参考服务商提供的文档。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/22779.html