【问题标题】:Java Email message Parser?Java电子邮件消息解析器?
【发布时间】:2011-03-27 13:22:54
【问题描述】:

是否有人熟悉有助于解析以下电子邮件字段(日期、主题、发件人、发件人)的 Java 库?

Message-ID: <19815303.1075861029555.JavaMail.ss@kk>
Date: Wed, 6 Mar 2010 12:32:20 -0800 (PST)
From: someone@someotherplace.com
To: someone@someplace.com
Subject: some subject
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
X-From: one, some <some.one@someotherplace.com>
X-To: one
X-cc: 
X-bcc: 
X-Folder: Bob\Inbox
X-Origin: Bob-R
X-FileName: rbob (Non-Privileged).pst


some message

【问题讨论】:

    标签: java parsing email email-parsing


    【解决方案1】:

    JavaMail 是一个 oracle 库,在 javax.mail 包中提供邮件服务和邮件相关服务(如解析常规和 MIME 消息)。此外,Apache 有一个用于邮件处理的Commons Email 库。

    在 JavaMail api 中,解析包含电子邮件消息(可能是也可能不是明确的 MIME)的字符串的简单方法如下

    String content = ...
    Session s = Session.getInstance(new Properties());
    InputStream is = new ByteArrayInputStream(content.getBytes());
    MimeMessage message = new MimeMessage(s, is);
    

    可以像这样解析标题

    message.getAllHeaderLines();
    for (Enumeration<Header> e = message.getAllHeaders(); e.hasMoreElements();) {
        Header h = e.nextElement();
        h.getName();
        h.getValue();
    }
    

    【讨论】:

    • 但是如何解析“发件人:”标头,并将名称和电子邮件地址分开
    • @HendyIrawan Message 类上有一个 getFrom() 方法。它返回一个 Address[] 类型,如果您正在处理实际的电子邮件消息,该数组的成员通常可以转换为 InternetAddress 类型。此类具有获取 RFC822 兼容地址的名称和电子邮件部分的方法。
    • 这很好用!但是,我如何阅读包含多封电子邮件的电子邮件线程?我尝试了上面的方法,但它只读取第一封电子邮件。另外,我怎样才能只提取邮件正文?
    • 您需要解析每条消息并创建自己的内存结构来表示对话线程。线程通常可以通过查看给定消息的“In-Reply-To:”标头来重建,该标头将包含 Message-ID:作为响应的电子邮件的标头。
    • 对于其余部分,我建议您尝试做一些实验,如果遇到困难,您可以返回并找到更相关的问题和答案,或者提出您自己的问题。
    【解决方案2】:

    我建议你使用email-mime-parser

    以下示例代码为您提供所需的所有相关信息:

    ContentHandler contentHandler = new CustomContentHandler();
    
    MimeConfig mime4jParserConfig = new MimeConfig();
    BodyDescriptorBuilder bodyDescriptorBuilder = new DefaultBodyDescriptorBuilder();
    MimeStreamParser mime4jParser = new MimeStreamParser(mime4jParserConfig,DecodeMonitor.SILENT,bodyDescriptorBuilder);
    mime4jParser.setContentDecoding(true);
    mime4jParser.setContentHandler(contentHandler);
    
    InputStream mailIn = 'Provide email mime stream here';
    mime4jParser.parse(mailIn);
    
    Email email = ((CustomContentHandler) contentHandler).getEmail();
    
    List<Attachment> attachments =  email.getAttachments();
    
    Attachment calendar = email.getCalendarBody();
    Attachment htmlBody = email.getHTMLEmailBody();
    Attachment plainText = email.getPlainTextEmailBody();
    
    String to = email.getToEmailHeaderValue();
    String cc = email.getCCEmailHeaderValue();
    String from = email.getFromEmailHeaderValue();
    

    【讨论】:

    • 这是基于 Mime4j 的
    • 是的,它基于 Mime4j
    【解决方案3】:

    我在使用 JavaMail 时遇到了问题(它无法解析一些它应该解析的电子邮件)。

    我使用Mime4J 获得了更好的结果。

    【讨论】:

    • - 您是否注意到任何特定应用程序或平台生成的 mime 消息都失败了?
    • @AdamGent。您必须设置很多system properties 才能使JavaMail 的mime 解析器更加“放松”。否则它以“严格模式”运行。
    猜你喜欢
    • 1970-01-01
    • 2011-06-04
    • 2021-02-06
    • 2011-01-06
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多