一般来说,带附件并且有图片的html的mime邮件形如以下的格式:
multipart/mixed
multipart/related
multipart/alternative
但JavaMail的FAQ没有详细解释如何发送这种多重嵌套multipart的mime邮件。关键是设置content-type为"message/rfc822",见下面示例代码的黑体部分。
public void createMail() {
......
//这里只示例生成Multipart的代码,其他代码请参考JavaMail的相关文档
Multipart mmp = null;
mmp = getHtmlPart(plaintext, html);
mmp = getRelatedPart(mmp, image);
mmp = getMixedPart(mmp, attachment);
......
}
private Multipart getHtmlPart(String plaintext, String html) throws MessagingException {
MimeMultipart mmp_alt = new MimeMultipart("alternative");
MimeBodyPart mbp_text = new MimeBodyPart();
mbp_text.setContent(plaintext, "text/plain;charset=UTF-8");
mmp_alt.addBodyPart(mbp_text);
MimeBodyPart mbp_html = new MimeBodyPart();
mbp_html.setContent(html, "text/html;charset=UTF-8");
mmp_alt.addBodyPart(mbp_html);
return mmp_alt;
}
private Multipart getRelatedPart(Multipart aPart, String imagesPath) throws MessagingException, UnsupportedEncodingException {
MimeMultipart mmp = new MimeMultipart("related");
MimeBodyPart mbp = new MimeBodyPart();
mbp.setContent(aPart, "message/rfc822");
mmp.addBodyPart(mbp);
String[] imageFiles = imagesPath.split(",");
if (imageFiles.length != 0) {
for (String file : imageFiles) {
MimeBodyPart mbp_file = new MimeBodyPart();
FileDataSource fds = new FileDataSource(file);
mbp_file.setDataHandler(new DataHandler(fds));
mbp_file.setFileName(MimeUtility.encodeText(fds.getName(), "gbk", "B"));
File f = new File(file);
mbp_file.setContentID("<" + f.getName() + ">");
mmp.addBodyPart(mbp_file);
}
}
return mmp;
}
private Multipart getMixedPart(Multipart aPart, String attachPath) throws MessagingException, IOException {
MimeMultipart mmp = new MimeMultipart("mixed");
MimeBodyPart mbp = new MimeBodyPart();
mbp.setContent(aPart, "message/rfc822");
mmp.addBodyPart(mbp);
String[] files = attachPath.split(",");
if (files.length != 0) {
for (String file : files) {
MimeBodyPart mbp_file = new MimeBodyPart();
mbp_file.attachFile(file);
mbp_file.setHeader("Content-Transfer-Encoding", "base64");
mmp.addBodyPart(mbp_file);
}
}
return mmp;
}