【问题标题】:Email attachment parsing via mime4j通过 mime4j 解析电子邮件附件
【发布时间】:2011-02-10 04:11:50
【问题描述】:

我正在使用一个小型 java smtp 库 (http://code.google.com/p/subethasmtp/),因此我需要在单独的组件(即正文、附件等)中解析传入的电子邮件。

我正在尝试使用 mime4j ,但文档表明 mime4j 只能提供事件通知或令牌通知,而不能提供其他任何信息。为了剥离正文和附件等,我必须在事件处理程序中使用我自己的自定义逻辑。我的观察正确吗?

如果是,那么我如何使用 mime4j 来满足我的要求。请提出建议。

我非常需要一种方法,它可以接收 smtp 数据流,并在 java 中以完全解析的形式返回一组附件引用或流。请帮忙。

提前致谢

阿什·夏尔马

【问题讨论】:

  • 同时,在自我调查中,我发现 amavisd-new 中使用了一个 perl 库 MIME::PARSER。来自 amavisd-new 的邮件列表人员告诉我,可以从 amavisd-new perl 脚本中引用我需要的解码邮件对象,但是我可以从 perl 到 java 中使用它吗?
  • 我遇到了和你一样的问题,在谷歌搜索时发现你的名字到处都是(邮件列表、论坛)。感谢您为我节省了时间!

标签: java perl smtp mime


【解决方案1】:

Mime4j 绝对可以满足您的需求。创建 org.apache.james.mime4j.message.SimpleContentHandler 的子类,并实现 bodyDecoded 方法。然后将此子类传递给 MimeStreamParser 实例。您会看到每个正文或附件都会调用一次 bodyDecoded,它为您提供的流包含已执行 Base64 或 Quoted-Printable 解码的数据。

如果您一般不喜欢基于事件的 API,您可以尝试通过 org.apache.james.mime4j.message.Message 类公开的更像 DOM 的功能。您可以调用 Message.getBody(),然后查看它返回的是否是 Multipart、TextBody、BinaryBody 等的实例。如果是 Multipart,则可以调用 Multipart.getBodyParts 以递归到子部分。

【讨论】:

  • 感谢您的建议,现在我在重新创建从 iphone 发送的邮件时遇到问题,邮件标题有“X-Mailer: iPhone Mail (7D11)”,谁能告诉我我需要什么自定义逻辑对通过 iphone 发送的邮件进行核算。
  • 所有已解决的问题 mime4j 比 java mail api 好得多。
【解决方案2】:

@Ashish 使用 SubEthaSmtp 的另一个选项是执行 SubEtha 邮件列表管理器所做的事情:http://code.google.com/p/subetha/source/browse/trunk/src/org/subethamail/common/SubEthaMessage.java

链接的类扩展了 SMTPMessage 并且有一堆 getPart() 方法。 javax.mail.Part 具有将附件转换为文件所需的大部分功能。

【讨论】:

  • Adam,目前我正在使用 Java 邮件 api 本身来解析电子邮件以将邮件正文和附件剥离到单独的文件中。我正在寻找 mime4j 的原因是 java 邮件 api 有时会失败,并且对于格式错误的 mime 消息(我的经验)没有那么容错性,mime4j 承诺了这一点。因此,作为替代方案,我正在研究 mime4j。我会尽快发布我的详细结果。
  • 亚当,mime4j 绝对是 java 邮件 api 更好的替代品,它为实现提供了干净的接口。我使用 mime4j (0.7) 的测试结果非常好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-14
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
相关资源
最近更新 更多