上一篇
java如何发送html邮件
- 前端开发
- 2025-07-24
- 3378
Java发送HTML邮件需配置
Session,创建
MimeMessage,设置内容类型为
text/html; charset=utf-8,并通过
Transport.send()发送,注意编码统一防止乱码
在Java中发送HTML邮件通常需要借助JavaMail API或Spring框架提供的封装工具,以下是详细的实现步骤和技术要点:
基础环境配置
| 步骤 | 操作说明 | 关键代码片段 |
|---|---|---|
| 添加依赖 | 使用Maven或Gradle引入JavaMail库(需包含javax.mail和activation包)。 |
Maven: <dependency><group>com.sun.mail</group><artifact>javax.mail</artifact><version>1.6.2</version></dependency> |
Gradle: implementation 'com.sun.mail:javax.mail:1.6.2' |
||
| 配置邮件会话 | 通过Session对象设置SMTP服务器参数(如主机、端口、认证方式)。 |
Properties props = new Properties();props.put("mail.smtp.host", "smtp.example.com");props.put("mail.smtp.port", "465");props.put("mail.smtp.auth", "true");props.put("mail.smtp.ssl.enable", "true"); |
HTML邮件核心实现
创建邮件消息对象
使用MimeMessage构建邮件,并通过Multipart
// 创建会话(含认证)
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("your_email@example.com", "password");
}
});
// 构建MimeMessage
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("your_email@example.com")); // 发件人
message.addRecipients(Message.RecipientType.TO, Arrays.asList("to1@example.com", "to2@example.com")); // 多收件人
message.setSubject("HTML邮件测试", "UTF-8"); // 支持中文主题
设置HTML内容体
需将HTML内容作为MimeBodyPart,并配置Content-Type为text/html:

// 创建HTML内容部件 MimeBodyPart htmlPart = new MimeBodyPart(); String htmlContent = "<h1>标题</h1><p>这是HTML正文</p>"; htmlPart.setContent(htmlContent, "text/html; charset=UTF-8"); // 组合消息体 Multipart multipart = new MimeMultipart(); multipart.addBodyPart(htmlPart); message.setContent(multipart);
添加附件(可选)
支持添加文件或图片附件,需处理MIME类型和编码:
// 添加文件附件
MimeBodyPart attachment = new MimeBodyPart();
attachment.attachFile(new File("path/to/file.pdf"));
multipart.addBodyPart(attachment);
// 添加内嵌图片(需Base64编码)
MimeBodyPart imagePart = new MimeBodyPart();
imagePart.setContent("<img src='cid:image1'/>", "text/html");
imagePart.addHeader("Content-ID", "image1");
multipart.addBodyPart(imagePart);
发送邮件
通过Transport提交消息:

Transport.send(message); // 发送邮件
Spring Boot简化实现
若使用Spring框架,可通过JavaMailSender简化操作:
@Autowired
private JavaMailSender mailSender;
public void sendHtmlEmail(String to) {
MimeMessage msg = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(msg, true, "UTF-8");
helper.setFrom("your_email@example.com");
helper.setTo(to);
helper.setSubject("HTML邮件");
helper.setText("<html><body>内容</body></html>", true); // 第二个参数标记HTML
mailSender.send(msg);
}
常见问题与解决方案
| 问题 | 解决方案 |
|---|---|
| 中文乱码 | 设置UTF-8编码,并在MimeMessage中指定charset=UTF-8 |
| 附件显示为下载而非渲染 | 内嵌图片需通过Content-ID绑定,外部图片建议用绝对URL |
| 邮件被识别为垃圾邮件 | 避免使用敏感词,正确设置From域名与SPF记录,可添加X-Priority头优化优先级 |
FAQs
Q1:如何解决HTML邮件中的图片显示问题?
A1:内嵌图片需通过<img src='cid:唯一ID'>引用,并将图片作为MimeBodyPart添加到邮件中,同时设置Content-ID头与之对应。

DataHandler handler = new DataHandler(imageSource, "image/png");
imagePart.setDataHandler(handler);
imagePart.setHeader("Content-ID", "image1");
Q2:发送大附件时出现连接超时怎么办?
A2:需检查SMTP服务器的附件大小限制(如QQ邮箱普通用户限50MB),必要时启用压缩或分割文件,可调整mail.smtp.timeout参数延长超时时间:
mail.smtp.timeout=10000
