java - 用 Java 解析 MIME 发送方 (RFC 822)

标签 java mime jakarta-mail rfc822 mime4j

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

"John Doe" <<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a4cecbcccac0cbc1e4c3c9c5cdc88ac7cbc9" rel="noreferrer noopener nofollow">[email protected]</a>>
<<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d1bbbeb9bfb5beb491b6bcb0b8bdffb2bebc" rel="noreferrer noopener nofollow">[email protected]</a>>

我试图弄清楚如何在上面的示例中提取字符串“[email protected]”,尽管我还需要“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 等实用程序,应该可以从那里提取地址的“[email protected]”部分,但我还没有在 javax 或 mime4j 中找到负责此操作的类还没有。

最佳答案

我认为您需要 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\" <<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e78d888f89838882a7808a868e8bc984888a" rel="noreferrer noopener nofollow">[email protected]</a>>";
        InternetAddress addr = new InternetAddress(fullemail);
        System.out.println(addr.getPersonal()); // John Doe
        System.out.println(addr.getAddress());  // <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="6c060304020803092c0b010d0500420f0301" rel="noreferrer noopener nofollow">[email protected]</a>
   }
}

关于java - 用 Java 解析 MIME 发送方 (RFC 822),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16778988/

相关文章:

NGINX - 无法设置内容类型 header

java - 关于缺少 javax/mail/mail/1.4/activation.jar 的 Maven 编译错误。怎么修?

java - Java冒泡排序遇到问题

java - 如何最好地指定用于 Netty 的 Protobuf(最好使用内置的 protobuf 支持)

java - 没有类型为 "myOwnType"的合格 bean - 像 String 这样的原始 bean 可以工作

java - 从java中的套接字读取多个xml文档

php - 在 Javascript 中发送动态生成的图像作为 PHP 中的图像标题

email - 是否在76之后是RFC 2045所定义的MIME节的行长限制?

java - 改变 multipart/XXX 内容类型而不改变底层部分

java - 最后捕获或返回实例或空引用