我正在使用 MIME4J 从电子邮件堆栈转储中读取 MIME 事件。我正在尝试将 START_MESSAGE 和 END_MESSAGE 标头定义的给定消息事件作为一个完整事件读取,因为我最终会将进程移动到分布式文件系统,并且需要计划文件拆分边界遍历。
对于 mime4j 中基于事件的解析,需要一个 ContentHandler 接口,解析器从它调用方法,这需要将处理程序设置为它。我已经尝试了来自另一个 SO 答案的示例处理程序,它扩展了 mime4j 打包的 SimpleContentHandler,但实际上只解析标题。
我正在尝试构建我的自定义 ContentHandler 类来收集完整的消息作为一个事件。然后我需要将事件放在一个临时对象中,这样我就可以解析标题、它们的字段以及字段的内容。最终目标是将这种行为适应 MapReduce,因此有必要应对电子邮件的一部分位于一个文件拆分中而另一部分位于不同文件拆分中的可能性。
对于我的自定义 ContentHandler,我已经做到了:
public class CustomContentHandler extends AbstractContentHandler {}
对于一个主要的,我正在使用:
public class Reader
{
public static void main( String[] args ) throws FileNotFoundException, IOException,
MimeException
{
QaContentHandler handler = new CustomContentHandler();
MimeConfig config = new MimeConfig();
MimeStreamParser parser = new MimeStreamParser(config);
InputStream stream = new FileInputStream("/home/javadev1/lib/INBOX");
parser.setContentHandler(handler);
try
{
do
{
parser.parse(stream);
}
while (stream.read() != -1);
}
finally
{
stream.close();
}
}
}
因此,任何有关如何在处理程序中构建信息的帮助都会非常有帮助。我尝试设置一个新的 MessageImpl,然后使用构建器将解析的流复制到其中,我还尝试从流的解析中构建一个 newMessage,然后在读取 END_MESSAGE 标头时打印消息,但是它打印空值。
我可能也遇到了一个概念盲点。如果是这样的话,我可以接受指出。谢谢!