我遇到了一个非常奇怪的问题。基本上发生的事情是我使用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解码器之间获得?
答案 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服务器而你不必在需要定期清理的收件箱中保存邮件。