Java Mail如何同时发送HTML内容与附件?
当然可以同时发送HTML内容和附件!
完全没问题的,Java邮件API原生就支持同时发送HTML正文和附件,核心是要把邮件内容组织成**多部分(Multipart)**消息,把HTML正文和附件分别作为独立的内容块添加进去就行。
核心原理
邮件的Content-Type需要设置为multipart/mixed(这是最常用的混合内容类型,支持正文+附件),然后把HTML正文和附件各自封装成MimeBodyPart,再统一加到MimeMultipart容器里,最后把这个容器设为邮件的内容。
补全你的代码示例
我把你提供的代码补全并调整,实现同时发送HTML和附件的功能:
import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.util.ByteArrayDataSource; import java.io.IOException; public static void sendAttachment(final String to, final String cc, final String subject, final String htmlText, final byte[] attachment, final String fileName) { if (null == to || null == htmlText) { return; } try { Properties props = getProperties(); // 这里如果需要认证,要添加Authenticator(根据你的getProperties()配置调整) Session session = Session.getInstance(props, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { // 替换为你的发件人账户信息 return new PasswordAuthentication("your-sender-email@domain.com", "your-password-or-app-specific-token"); } }); MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress("your-sender-email@domain.com")); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); // 处理抄送 if (cc != null && !cc.trim().isEmpty()) { message.setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc)); } message.setSubject(subject); // 创建多部分内容容器 MimeMultipart multipart = new MimeMultipart(); // 1. 添加HTML正文部分 MimeBodyPart htmlBodyPart = new MimeBodyPart(); // 明确指定内容类型为HTML,避免被当作纯文本 htmlBodyPart.setContent(htmlText, "text/html; charset=utf-8"); multipart.addBodyPart(htmlBodyPart); // 2. 添加附件部分(判断附件是否有效) if (attachment != null && attachment.length > 0 && fileName != null) { MimeBodyPart attachmentBodyPart = new MimeBodyPart(); // 用ByteArrayDataSource处理byte[]类型的附件 DataSource dataSource = new ByteArrayDataSource(attachment, "application/octet-stream"); attachmentBodyPart.setDataHandler(new DataHandler(dataSource)); // 设置附件显示的文件名 attachmentBodyPart.setFileName(fileName); multipart.addBodyPart(attachmentBodyPart); } // 将多部分内容设置为邮件的核心内容 message.setContent(multipart); // 发送邮件 Transport.send(message); System.out.println("带HTML和附件的邮件发送成功!"); } catch (MessagingException | IOException e) { e.printStackTrace(); // 这里可以根据业务需求添加异常处理逻辑,比如日志记录、告警等 } }
几个关键注意点
- HTML内容的Content-Type:一定要指定
text/html; charset=utf-8,否则邮件客户端会把HTML代码当作纯文本显示,达不到预期效果。 - 附件的Content-Type:如果知道附件的具体类型(比如PDF是
application/pdf,图片是image/jpeg),可以替换上面的application/octet-stream,这样邮件客户端能更好地识别附件类型。 - 空值校验:要对收件人、HTML内容、附件等做必要的空值判断,避免空指针异常。
- 邮件认证:如果你的邮件服务器需要认证(比如Gmail、Outlook的SMTP服务),一定要在Session里添加
Authenticator实现,或者在Properties里配置对应的用户名密码参数。
内容的提问来源于stack exchange,提问作者Aravind S
相关产品推荐
相关产品推荐

