在 Java 中解析 MIME 发件人 (RFC 822)

Posted

技术标签:

【中文标题】在 Java 中解析 MIME 发件人 (RFC 822)【英文标题】:Parse MIME sender in Java (RFC 822) 【发布时间】:2013-05-22 15:40:47 【问题描述】:

MIME 消息发件人以如下格式显示:

"John Doe" <johndoe@gmail.com>
<johndoe@gmail.com>

我试图弄清楚如何在上述示例中提取字符串“johndoe@gmail.com”,尽管我还需要“johndoe”和“gmail.com”部分(根据 RFC,我很漂亮确保在@ 上拆分是这里所需的全部)。显然,对我自己的解析器进行正则表达式是一种(不是很好)的选择。

使用javax.mail.internet.MimeMessage 似乎可以做到这一点。所有的构造函数都需要一个我没有的Folder(嗯,我有点做,它存在于 IMAP 层中),例如

MimeMessage(Folder folder, InputStream is, int msgnum) 

这让我觉得我用错了这个类。尽管如此,如果我以这种方式解析,我确实可以访问 getFrom() 方法,该方法返回一个 Address 数组,它本身不提供给我使用的方法。

使用 mime4j 很容易做到这一点:

case T_FIELD: // field means header
    if(token.getName() == "from") 
        // get raw string as above - unparsed

所以使用 mime4j 或使用 java、javax 等实用程序应该可以从那里提取地址的“a@b.com”部分,但我还没有在 javax 或 mime4j 中找到负责的类还没有。

【问题讨论】:

【参考方案1】:

我认为您需要 javax.mail 中的 InternetAddress 类: http://docs.oracle.com/javaee/6/api/javax/mail/internet/InternetAddress.html#getAddress()

最小工作示例:

import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;

public class JavaMailExample 

    public static void main(String[] args) throws AddressException 
        String fullemail = "\"John Doe\" <johndoe@gmail.com>";
        InternetAddress addr = new InternetAddress(fullemail);
        System.out.println(addr.getPersonal()); // John Doe
        System.out.println(addr.getAddress());  // johndoe@gmail.com
   

【讨论】:

是的,谢谢,从这里得到。为了使这是一个很好的答案,尽管您应该包括如何使用它-我投票赞成,因为这对我有帮助,但它接近仅链接的答案。

以上是关于在 Java 中解析 MIME 发件人 (RFC 822)的主要内容,如果未能解决你的问题,请参考以下文章

重新发送 MIME 电子邮件中的标头

什么是mime类型

使用编码字的 MIME 标头中的换行符是不是合法?

将MIME电子邮件解析为多个部分

如何在 php 中解析 .eml 文件?

从 PHP 发送 MIME 电子邮件时,Exim 会覆盖“发件人”标头