为什么要在javamail中迭代多部分电子邮件中的部分?

时间:2017-03-06 21:54:00

标签: java javamail

我正在查看javamail faqs,我正在查看应该提取电子邮件正文的代码段:

    private boolean textIsHtml = false;

    /**
     * Return the primary text content of the message.
     */
    private String getText(Part p) throws
                MessagingException, IOException {
        if (p.isMimeType("text/*")) {
            String s = (String)p.getContent();
            textIsHtml = p.isMimeType("text/html");
            return s;
        }

        if (p.isMimeType("multipart/alternative")) {
            // prefer html text over plain text
            Multipart mp = (Multipart)p.getContent();
            String text = null;
            for (int i = 0; i < mp.getCount(); i++) {
                Part bp = mp.getBodyPart(i);
                if (bp.isMimeType("text/plain")) {
                    if (text == null)
                        text = getText(bp);
                    continue;
                } else if (bp.isMimeType("text/html")) {
                    String s = getText(bp);
                    if (s != null)
                        return s;
                } else {
                    return getText(bp);
                }
            }
            return text;
        } else if (p.isMimeType("multipart/*")) {
            Multipart mp = (Multipart)p.getContent();
            for (int i = 0; i < mp.getCount(); i++) {
                String s = getText(mp.getBodyPart(i));
                if (s != null)
                    return s;
            }
        }

        return null;
    }

现在代码可以重构为以下版本,基本上代码行数较少:

    private static String getText(Part message) {
        String text = null;

        try {
            if (message.isMimeType("text/*")) {
                text = (String) message.getContent();
            }

            if (message.isMimeType("multipart/alternative") || message.isMimeType("multipart/*")) {
                Multipart multiPart = (Multipart) message.getContent();
                Part bodyPart       = multiPart.getBodyPart(multiPart.getCount() - 1);
                text                = getText(bodyPart);
            }
        } catch (Exception e) {
            logger.error(e.getMessage());
        }

        return text;
    }

我的问题是,为什么旧​​代码循环遍历multipart/alternativemultipart/*消息的各个部分?我在这里错过了什么吗?

更新

刚刚看到Jon的评论,我还有一个问题,是否有任何情况我的代码版本会破坏?

2 个答案:

答案 0 :(得分:1)

基本上有很多Multipart类型,它们都需要独特处理:

混合子类型

“multipart”的“混合”子类型适用于身体    零件是独立的,需要按特定顺序捆绑。    实现无法识别的任何“多部分”子类型    必须被视为属于“混合”的子类型。

替代子类型

“multipart / alternative”类型在语法上与    “multipart / mixed”,但语义不同。特别是,    每个身体部位都是相同的“替代”版本    信息。

系统应该认识到各个部分的内容是可以互换的。系统应根据本地环境和参考选择“最佳”类型,在某些情况下甚至通过用户交互。与“multipart / mixed”一样,身体部位的顺序也很重要。在这种情况下,替代方案的出现顺序是对原始内容的忠诚度增加。

通常,最佳选择是收件人系统本地环境支持的类型的最后部分。

例如,可以使用“Multipart / alternative”来发送消息    以一种花哨的文本格式,以便于显示    任何地方:

 From: Nathaniel Borenstein <nsb@bellcore.com>
 To: Ned Freed <ned@innosoft.com>
 Date: Mon, 22 Mar 1993 09:41:09 -0800 (PST)
 Subject: Formatted text mail
 MIME-Version: 1.0
 Content-Type: multipart/alternative; boundary=boundary42

 --boundary42
 Content-Type: text/plain; charset=us-ascii

   ... plain text version of message goes here ...

 --boundary42
 Content-Type: text/enriched

   ... RFC 1896 text/enriched version of same message
       goes here ...

 --boundary42
 Content-Type: application/x-whatever

   ... fanciest version of same message goes here ...

 --boundary42--

在此示例中,邮件系统理解的用户    “application / x-whatever”格式只能看到花哨的版本,    而其他用户只会看到丰富的纯文本版本,    取决于他们系统的功能。

答案 1 :(得分:0)

使用multipart / mixed消息,您的代码将不会“工作”(对您而言意味着什么),其中最后一个附件的类型为text / *。是的,附件可以是text /*.