有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我在看javamailfaqs,我在看这个片段,应该是用来提取邮件正文的:

    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) 个答案

  1. # 1 楼答案

    基本上有许多多部分类型,它们都需要唯一地处理:

    混合亚型

    “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”格式只能看到花哨的版本, 而其他用户只能看到丰富版或纯文本版, 取决于他们系统的能力

  2. # 2 楼答案

    对于最后一个附件类型为text/*的多部分/混合消息,您的代码将无法“工作”(无论这对您意味着什么)。是的,附件可以是text/*