java - JavaMail 的替代 Java 客户端库?

标签 java jakarta-mail imap

我遇到了一个非常奇怪的问题。基本上发生的事情是我使用 java 邮件通过 IMAP 扫描邮箱,检查每封电子邮件,查找附件,然后阅读我感兴趣的附件。代码有效......除了某些 Windows 7 机器,但它适用于大多数 W7 机器。

奇怪的是异常(见下文)。

com.sun.mail.util.DecodingException: BASE64Decoder: Error in encoded stream: found valid base64 character after a padding character (=), the 10 most recent characters were: "am; name=9"
        at com.sun.mail.util.BASE64DecoderStream.decode(BASE64DecoderStream.java
:305)
        at com.sun.mail.util.BASE64DecoderStream.read(BASE64DecoderStream.java:1
44)
        at java.io.FilterInputStream.read(Unknown Source)

似乎 base64 解码流正在尝试解码附件,但开始读取该部分 header 处的 base64 block :异常中的“am; name=9”似乎是 header 中的部分文件名(确实以“9”开头)已定义。

从应用程序的日志中复制:“找到附件 90TXSJ.zip”

我试图在邮件代码中找到一个 Hook ,以便我可以使用 InputStream 以某种方式过滤掉 header ,但这似乎是不可能的。

那么,是否还有另一种不使用 Java 邮件的 IMAP 客户端实现?或者有人知道如何在原始流和 Base64 解码器之间切换吗?

最佳答案

您可能不知道的替代方法是 Apache JAMES . JAMES 允许您实现自己的 Mailet,而不是轮询 IMAP 或 POP3 电子邮件帐户。 Mailet是等同于 HTTP Servlet 的 SMTP。

大约十年前,我参与了一个项目,该项目需要集成到公司基础架构中并将电子邮件内容自动发布到可搜索的数据库(选择加入,以便更容易遵守报告要求)。我们最初尝试沿用 JavaMail 路径,但很快就遇到了可伸缩性、安全约束和稳健性方面的问题。

安装 Apache JAMES 并不太难,我们可以轻松地动态部署更新到我们的 mailet。在我们的例子中,我们将传入的电子邮件重新打包到我们自己的 POJO 中,并通过 java 消息队列对其进行序列化。我们能够很好地分配队列中的实际处理负载。

Mailet 使用您定义的匹配器来确定您是否要处理传入消息。匹配器使用提供的邮件对象做出决定。如果匹配器批准该消息,它将发送到您的 mailet 进行处理。

Mail 对象包含对标准 javax.mail.internet.MimeMessage 的访问权限,后者又具有用于解码消息的 getInputStream()getRawInputStream () 获取发送到服务器的消息。我们使用这些是因为我们必须提取附件、对它们进行病毒扫描,然后将它们上传到与正确消息相关联的可搜索数据库。

我认为您会发现这种方法更加自由,因为 JAMES 是一个 SMTP 服务器,您不必将邮件保存在需要定期清理的收件箱中。

关于java - JavaMail 的替代 Java 客户端库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21992901/

相关文章:

java - 语法或语义问题?

python - imap_tools - 在 python 中下载附件

IMAP 空闲超时

java - 在没有 WEB-INF 文件夹的实用程序 jar 中放置 i18n 文件的位置

java - 我是否需要测试接口(interface)的每个实现来测试接口(interface)?

java - JBoss EAP 6.2 : Exchange auth-method of war-file

java - 如何更正无效协议(protocol) : null sending mail using javax. 邮件

java - 带有 javax.mail 和 CentOS 的邮件服务器

java - 删除 Java Mail 中已删除的电子邮件

php - 使用 imap 通过 php 打开电子邮件给我这个错误 Message : imap_open() [function. imap-open] : Couldn't open stream {imap. gmail.com:993/imap/ssl}INBOX