Java 将带有附件的电子邮件中的内容类型从text/plain转换为text/html
我正在尝试显示从服务器获取的电子邮件。在让您知道我的问题之前,请查看我的代码:Java 将带有附件的电子邮件中的内容类型从text/plain转换为text/html,java,jakarta-mail,content-type,mime,email-attachments,Java,Jakarta Mail,Content Type,Mime,Email Attachments,我正在尝试显示从服务器获取的电子邮件。在让您知道我的问题之前,请查看我的代码: public FileMailExtended getSingleMessage(Integer fileMailId) throws MailSystemException, IOException, MessagingException, BOServiceException { FileMail email = retrieve(fileMailId.intValue());
public FileMailExtended getSingleMessage(Integer fileMailId) throws MailSystemException, IOException,
MessagingException, BOServiceException {
FileMail email = retrieve(fileMailId.intValue());
MailerScopeDef scope = email.getType();
boolean outbound = email.getDirection() == EmailConstants.DIRECTION_SENT;
Long uId = Long.valueOf(email.getUId());
String folder = null;
if (outbound) {
folder = ConfigurationService.getSentFolder(scope);
} else {
folder = ConfigurationService.getReadFolder(scope);
}
FileMailConfig fileMailConfig = getFileMailConfig(folder);
long uidValidity = 0;
if (fileMailConfig != null) {
uidValidity = fileMailConfig.getVersionId();
}
ImapFolderManager ifm;
if (outbound) {
ifm = ((ImapSender) ConfigurationService.getMailSender(scope)).getImapFolderMger();
} else {
ifm = ConfigurationService.getImapFolderManagerReader(scope);
}
FileMailExtended emailExtended = new FileMailExtended();
mapFileMailToFileMailExtended(email, emailExtended);
try {
IMAPMessage message = (IMAPMessage) ifm.getMessage(uId, uidValidity);
if (message == null) {
LOGGER.error("Could not read message with uId:" + uId + " from the server.");
return null;
}
InternetAddress intAdress = (InternetAddress) message.getSender();
String unicodeString = intAdress.toUnicodeString().replace("\"", "");
emailExtended.setFrom(unicodeString);
emailExtended.setTo(appendAddresses(message.getRecipients(RecipientType.TO)));
emailExtended.setCc(appendAddresses(message.getRecipients(RecipientType.CC)));
emailExtended.setCci(appendAddresses(message.getRecipients(RecipientType.BCC)));
emailExtended.setSubject(message.getSubject());
String content = "";
if (message.getContent() instanceof String) {
content += (String) message.getContent();
} else if (message.getContent() instanceof Multipart) {
Multipart multipart = (Multipart) message.getContent();
StringBuffer buf = new StringBuffer();
for (int x = 0; x < multipart.getCount(); x++) {
BodyPart bodyPart = multipart.getBodyPart(x);
if (bodyPart == null || bodyPart.getContentType() == null) {
continue;
}
if (bodyPart.isMimeType(TEXT_HTML)) {
buf.append((String) bodyPart.getContent());
} else if (bodyPart.getContent() instanceof Multipart) {
Multipart multipart2 = (Multipart) bodyPart.getContent();
for (int xx = 0; xx < multipart2.getCount(); xx++) {
BodyPart bodyPart2 = multipart2.getBodyPart(xx);
if (bodyPart2 != null && bodyPart2.isMimeType("text/html") {
buf.append((String) bodyPart2.getContent());
}
}
}
}
content = buf.toString();
}
emailExtended.setContent(content);
if (message.getContent() instanceof Multipart) {
Multipart multipart = (Multipart) message.getContent();
for (int i = 0; i < multipart.getCount(); i++) {
BodyPart bodyPart = multipart.getBodyPart(i);
if (!Part.ATTACHMENT.equalsIgnoreCase(bodyPart.getDisposition())) {
// dealing with attachments only
continue;
}
emailExtended.addAttachmentNames(bodyPart.getFileName());
}
}
} finally {
closeFolderManager(ifm);
}
return emailExtended;
}
当电子邮件没有任何附件时,此代码可以正常工作。我得到了电子邮件内容,格式为html,因此无需努力就能阅读。
我的问题是,一旦电子邮件包含附件文件,就不会显示任何内容。
我发现这是因为内容类型,在发送带有附件的邮件时是text/plain,而在发送简单邮件时是text/html。
所以我改变了我的条件,考虑到内容类型,但结果显示的是…嗯…只是原始文本。
我甚至计划使用代码bodyPart2.setHeaderContent-type,text/html;,将内容类型强制为text/html,但结果却是一个例外。
有没有线索说明为什么带有附件的电子邮件的内容类型必须是文本/纯文本?我已经在谷歌上搜索过了,但没有重要的答案。
我怎样才能改变它?
非常感谢。内容是文本/纯文本还是文本/html与邮件是否包含附件无关 在某些情况下,消息将具有包含文本/纯文本和文本/html部分的多部分/可选内容。在这种情况下,您可以选择text/html部分。也许会有帮助
如果消息只有文本/纯文本部分,则由您自行设置格式并以您认为最好的方式显示。我使用提出的解决方案解决了问题,请尝试:
public static String ConvertTextPlanToHTML(String s) {
StringBuilder builder = new StringBuilder();
boolean previousWasASpace = false;
for( char c : s.toCharArray() ) {
if( c == ' ' ) {
if( previousWasASpace ) {
builder.append(" ");
previousWasASpace = false;
continue;
}
previousWasASpace = true;
} else {
previousWasASpace = false;
}
switch(c) {
case '<': builder.append("<"); break;
case '>': builder.append(">"); break;
case '&': builder.append("&"); break;
case '"': builder.append("""); break;
case '\n': builder.append("<br>"); break;
// We need Tab support here, because we print StackTraces as HTML
case '\t': builder.append(" "); break;
default:
if( c < 128 ) {
builder.append(c);
} else {
builder.append("&#").append((int)c).append(";");
}
}
}
return builder.toString();
}