You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:40:50