在带有附件的电子邮件中将内容类型从 text/plain 转换为 text/html

Posted

技术标签:

【中文标题】在带有附件的电子邮件中将内容类型从 text/plain 转换为 text/html【英文标题】:Convert content-type from text/plain to text/html in an email with attachment 【发布时间】:2014-08-18 18:58:55 【问题描述】:

我正在尝试显示从服务器获取的电子邮件。在让您知道我的问题之前,请查看我的代码:

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”是简单邮件。 因此,我更改了条件以考虑该内容类型,但显示的结果 is..uh..just raw text。 我什至计划使用代码 bodyPart2.setHeader("Content-Type", "text/html"); 将内容类型强制为 "text/html" ,但最终出现异常。 任何线索为什么带有附件的电子邮件的内容类型必须是“text/plain”?我已经用谷歌搜索过了,但没有重要的答案。 怎么改? 非常感谢。

【问题讨论】:

【参考方案1】:

内容是text/plain还是text/html与邮件有无附件无关。

在某些情况下,消息将具有包含 text/plain 和 text/html 部分的多部分/替代内容。在这种情况下,您可以选择 text/html 部分。 This example code in the JavaMail FAQ 可能会有所帮助。

如果消息只有文本/纯文本部分,则由您自行设置格式并以您认为最好的方式显示。

【讨论】:

【参考方案2】:

我用Daniel提出的方案解决了,试试看:

 public static String ConvertTextPlanToHTML(String s) 
            StringBuilder builder = new StringBuilder();
            boolean previousWasASpace = false;
            for( char c : s.toCharArray() ) 
                if( c == ' ' ) 
                    if( previousWasASpace ) 
                        builder.append("&nbsp;");
                        previousWasASpace = false;
                        continue;
                    
                    previousWasASpace = true;
                 else 
                    previousWasASpace = false;
                
                switch(c) 
                    case '<': builder.append("&lt;"); break;
                    case '>': builder.append("&gt;"); break;
                    case '&': builder.append("&amp;"); break;
                    case '"': builder.append("&quot;"); break;
                    case '\n': builder.append("<br>"); break;
                    // We need Tab support here, because we print StackTraces as HTML
                    case '\t': builder.append("&nbsp; &nbsp; &nbsp;"); break;  
                    default:
                        if( c < 128 ) 
                            builder.append(c);
                         else 
                            builder.append("&#").append((int)c).append(";");
                            
                
            
            return builder.toString();
        

【讨论】:

以上是关于在带有附件的电子邮件中将内容类型从 text/plain 转换为 text/html的主要内容,如果未能解决你的问题,请参考以下文章

带有附件问题的 PHP Pear Mime 邮件

在java中将电子邮件作为附件发送

如何通过亚马逊发送带有自定义文件扩展名附件的电子邮件?

从 C# 发送带有附件的电子邮件,附件在 Thunderbird 中作为第 1.2 部分到达

smtp 发送电子邮件,为啥一个附件可以有两个 Content-Type?

当wireshark抓取到带有附件为乱码的邮件,为看到完整邮件内容