备用Java客户端库到JavaMail?

时间:2014-02-24 16:11:06

标签: java javamail 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解码流正在尝试解码附件,但是开始在部件的标题处读取base64块:异常中的“am; name = 9”似乎是标题中的部分定义文件的名称(确实以“9”开始)。

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

我试图在邮件代码中找到一个钩子来获取InputStream来过滤掉标题的一些方法,但这似乎是不可能的。

那么,是否存在另一个不使用Java邮件的IMAP客户端实现?或者有谁知道我如何在原始流和Base64解码器之间获得?

1 个答案:

答案 0 :(得分:1)

您可能不知道的另一种选择是Apache JAMES。 JAMES不允许轮询IMAP或POP3电子邮件帐户,而是允许您实施自己的 Mailet Mailet是HTTP Servlet的SMTP等价物。

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

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

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

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

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