【发布时间】:2016-11-16 08:04:58
【问题描述】:
我尝试制作一个 java 邮件发送应用程序,但是当我添加一个 .docx 附件时,Outlook 显示: “无标题附件 xxxx.docx” 我的代码:
MimeMessage message = new MimeMessage(session); // Message
message.setHeader("Content-Type", "text/html; charset=UTF-8");
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO, address);
message.setSubject(subject, "UTF-8");
Multipart multipart = new MimeMultipart(); // body
BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setContent(body, "text/html; charset=utf-8"); //html body text
multipart.addBodyPart(messageBodyPart); // body add html text
if(file != null) {
for (File f : file) {
MimeBodyPart attachPart = new MimeBodyPart();
attachPart.attachFile(f.getAbsolutePath(), MimeTypeUtils.getContentTypeByFileName(f.getName()), "base64");
// attachPart.setFileName(f.getName());
multipart.addBodyPart(attachPart); // body add attachment
}
}
message.setContent(multipart); // message add body content
Transport.send(message);
只有少量的 .docx 文件有问题,但很烦人。 有人可以帮助我吗? 还有“getContentTypeByFileName”:
public class MimeTypeUtils {
private static final Map<String, String> fileExtensionMap;
static {
fileExtensionMap = new HashMap<>();
fileExtensionMap.put("docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document");
}
public static String getContentTypeByFileName(String fileName) {
FileNameMap mimeTypes = URLConnection.getFileNameMap();
String contentType = "";
contentType = mimeTypes.getContentTypeFor(fileName);
if (contentType == null || contentType.isEmpty()) {
String extension = FilenameUtils.getExtension(fileName);
contentType = fileExtensionMap.get(extension);
}
return contentType;
}
}
【问题讨论】:
-
好的。我喜欢这个问题。当文件包含字典或超过 50-59 个字符时,Outlook 显示无标题附件。
-
您使用的是旧版本的 Outlook 吗?它可能无法处理文件名较长时使用的较新的 MIME 编码。您可以将系统属性
mail.mime.encodeparameters设置为false以禁用此类编码。
标签: java outlook jakarta-mail