如何将Internet mime消息的所有内容复制到Notes中的正文项



我需要将Internet邮件的整个正文内容复制到一个新的Notes文档中。

Object internetMsgBody = internetMsg.getContent();
MIMEEntity notesBodyItem = notesDocument.createMIMEEntity("Body");
Stream mimeStream = dominoSession.createStream();
...?...
notesBodyItem.setContentFromBytes(mimeStream, msgContentType, 
MIMEEntity.ENC_NONE);

internetMsgBody可以是String、MimeMultiPart或InputStream(根据文档)。我知道如何处理String:),但对于其他Object类型,我需要一些帮助。不需要任何MIME或Parts内容类型处理。

谢谢!

在Notes中,多部分MIME消息表示为一组同名项(通常为Body),每个项都是TYPE_MIME。将MIMEEntity实例想象为与这些项中的单个项相对应。换句话说,MIMEEntity表示单个MIME部分。

因此,如果您的输入是一个多部分MIME消息,您可能需要将消息解析为各个部分,并为每个部分创建一个MIMEEntity。不幸的是,Java后端类不包括MIME解析器。当然,您的问题指出internetMsg.getContent()可能返回MimeMultipart。如果是这样的话,听起来MIME已经为您解析了。

无论哪种方式——无论您的输入是多个部分的流还是MimeMultipart——我建议您查看XPages扩展库中的MimeMessageParser.java。它使用mime4j来解析输入流。如果流中有多个部分,则使用MIMEEntity将每个部分作为单独的项写入。虽然mime4j的使用听起来并不相关,但您可能会在该代码中找到一些有用的提示。它实现了一个非常相似的用例。

谢谢Dave,你帮我找到了缺失的部分。到目前为止,我的解决方案是创建一个父Domino MIMEEntity,它将所有MIME部件作为子部件。

代码摘录:

MimeMultipart mimeMultiparts = (MimeMultipart) message.getContent();
int partCount = mimeMultiparts.getCount();
MIMEEntity dominoParentItem = mailDocument.createMIMEEntity("Body");
Stream dominoStream = dbGetSession().createStream();    
for (int counter = 0; counter < partCount; counter++) {
MimeBodyPart mimeBodyPart = (MimeBodyPart) mimeMultiparts.getBodyPart(counter);
MIMEEntity dominoChildItem = dominoParentItem.createChildEntity();
InputStream input = mimeBodyPart.getRawInputStream();
byte[]    buffer      = new byte[4096];
int       lengthTotal = 0;
int       length      = 0;
while (true) {
length = input.read(buffer);
if (length < 1)
break;
lengthTotal += length;
dominoStream.write(buffer);
}
String encodingType   = mimeBodyPart.getEncoding();
int dominoEncoding    = MIMEEntity.ENC_NONE;
if (encodingType != null) {
if (encodingType.toLowerCase().contains("base64"))
dominoEncoding = MIMEEntity.ENC_BASE64;
if (encodingType.toLowerCase().contains("7bit"))
dominoEncoding = MIMEEntity.ENC_IDENTITY_7BIT;
if (encodingType.toLowerCase().contains("8bit"))
dominoEncoding = MIMEEntity.ENC_IDENTITY_8BIT;
if (encodingType.toLowerCase().contains("binary"))
dominoEncoding = MIMEEntity.ENC_IDENTITY_BINARY;
if (encodingType.toLowerCase().contains("quoted-printable"))
dominoEncoding = MIMEEntity.ENC_QUOTED_PRINTABLE;
if (dominoEncoding == MIMEEntity.ENC_NONE)
dominoEncoding = MIMEEntity.ENC_EXTENSION;
}
dominoChildItem.setContentFromBytes(dominoStream, mimeBodyPart.getContentType(), dominoEncoding);

只是为了跟进这个问题:

我想出了一个更简单、更优雅的解决方案。有一个writeTo()方法可以流式输出所有的多部分数据。然后,这可以再次流式传输到Domino流中,Domino流填充MIMEEntry主体项。

case "javax.mail.internet.MimeMultipart": {
// Create input stream with content of MIME data
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
message.writeTo(outputStream);
ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
outputStream.close();
// Create Domino stream and fill it with the MIME data
Stream dominoStream = dbGetSession().createStream();
byte[] buffer = new byte[4096];
int lengthTotal = 0;
int length      = 0;
while (true) {
length = inputStream.read(buffer);
if (length < 1)
break;
lengthTotal += length;
dominoStream.write(buffer);
}
inputStream.close();
// Create Domino MIME "Body" item with content of MIME data
MIMEEntity dominoMIMEItem = mailDocument.createMIMEEntity("Body");
dominoMIMEItem.setContentFromBytes(dominoStream, "", MIMEEntity.ENC_NONE);
}

最新更新