如何发送HTML电子邮件

66

我需要通过电子邮件发送HTML文件,但不作为附件。

Message simpleMessage = new MimeMessage(mailSession);
try {
   fromAddress = new InternetAddress(from);
   toAddress = new InternetAddress(to);

} catch (AddressException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
}

try {
    simpleMessage.setFrom(fromAddress);
    simpleMessage.setRecipient(RecipientType.TO, toAddress);

    simpleMessage.setSubject(subject);
    simpleMessage.setText(text);

    Transport.send(simpleMessage);
} catch (MessagingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

我想发送存储在另一个文件中的HTML内容,而不是作为附件,目前只能发送纯文本邮件。

2个回答

123

不要将你的 MimeMessage 向上转型为 Message

MimeMessage simpleMessage = new MimeMessage(mailSession);

然后,当你想设置消息正文时,调用以下方法之一:

simpleMessage.setText(text, "utf-8", "html");

或者调用

simpleMessage.setContent(text, "text/html; charset=utf-8");
如果您希望使用除utf-8以外的字符集,请在相应位置进行替换。
JavaMail有一个额外的、无用的抽象层,它经常让您手握像MultipartMessageAddress这样的类,它们的功能都比真正的子类(MimeMultipartMimeMessageInternetAddress)少得多,而实际上正在被构造...

我正在使用代码 simpleMessage.setContent(text, "text/html; charset=utf-8"); 来设置内容,但是在这样做时,我在内容中的每个问号 = 都会被转换为 =3D,这会阻止 HTML 属性正确设置,有什么想法吗? - mohamnag
1
@mohamnag 你可能会注意到,生成的邮件头部会包含“Content-Transfer-Encoding: quoted-printable”。(因为你在 HTML 正文中包含了非 ASCII 文本,而邮件不允许非 ASCII 内容。)收件人需要使用 transfer-decode 将邮件内容转换回 = 符号,而不是 =3D。建议收件人端使用 MimeMessage.getInputStream 替代 MimeMessage.getContentStream - dkarp
@dkrap谢谢你提到这个问题,我忽略了传输编码,导致生成的HTML无法正确显示。 - mohamnag

0

这是我的sendEmail Java程序。使用Message类对象的setContent方法非常好。

message.setSubject(message_sub);
message.setContent(message_text, "text/html; charset=utf-8");

sendEmail.java

package employee;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import java.io.UnsupportedEncodingException;
import java.util.Properties;

public class SendEmail {

    public static void sendEmail(String message_text, String send_to,String message_sub ) throws UnsupportedEncodingException {

        
        final String username = "hello@xyz.com";
        final String password = "password";

        Properties prop = new Properties();
        prop.put("mail.smtp.host", "us2.smtp.mailhostbox.com"); //replace your host address.
        prop.put("mail.smtp.port", "587");
        prop.put("mail.smtp.auth", "true");
        prop.put("mail.smtp.starttls.enable", "true"); //TLS
        
        Session session = Session.getInstance(prop,
                new javax.mail.Authenticator() {
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(username, password);
                    }
                });

        try {

            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress("sender@xyz.com", "Name from which mail has to be sent"));
            message.setRecipients(
                    Message.RecipientType.TO,
                    InternetAddress.parse(send_to)
            );
            message.setSubject(message_sub);
            message.setContent(message_text, "text/html; charset=utf-8");
            
          

            Transport.send(message);

            System.out.println("Done");

        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接