如何使用 javamail 在 android 应用程序中处理 multipart/alternative?

Posted

技术标签:

【中文标题】如何使用 javamail 在 android 应用程序中处理 multipart/alternative?【英文标题】:how to handle multipart/alternative in android app using javamail? 【发布时间】:2013-06-24 08:42:36 【问题描述】:

我无法解析多部分电子邮件内容。有人可以帮忙吗?

我正在使用 *** 上的帖子中的提示来使用 javamail 接收和解析电子邮件(来自 gmail)。 Adding activation.jar & mail.jar to android App

message getContent API 返回 com.sun.mail.imap.IMAPMessage@423ff878

这意味着它不是由 javamail 数据源处理的。

内容如下:

内容类型:多部分/替代;边界=mimepart_51c2a32167465_82e9b701343f

--mimepart_51c2a32167465_82e9b701343f 内容类型:文本/纯文本;字符集=utf-8 内容传输编码:引用打印 内容处置:内联

...文本...

--mimepart_51c2a32167465_82e9b701343f 内容类型:文本/html;字符集=utf-8 内容传输编码:引用打印 内容处置:内联

http://www.w3.org/1999/xhtml">

--mimepart_51c2a32167465_82e9b701343f--

【问题讨论】:

【参考方案1】:

JavaMail API FAQ 中给出的以下代码可能会有所帮助:

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;
    

(附注:我不确定这个答案现在对你有用,但如果有人遇到同样的问题,我会发布以供将来参考)。

【讨论】:

以上是关于如何使用 javamail 在 android 应用程序中处理 multipart/alternative?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中的图像上添加文本并使用 JavaMail API 通过电子邮件发送

JavaMail发送邮件应添加客户端授权密码而不是登陆密码

Android Java使用JavaMail API发送和接收邮件的代码示例

Android开发之JavaMail发送邮件(用户反馈)

在 JavaMail 中获取 html 电子邮件内容

使用带有 smtp 但没有 SSL 的 JavaMail API 在 android 中发送电子邮件