如何将 Internet mime 消息的所有内容复制到 Notes 中的正文项?
Posted
技术标签:
【中文标题】如何将 Internet mime 消息的所有内容复制到 Notes 中的正文项?【英文标题】:How to copy all the content of an Internet mime message to a body item in Notes? 【发布时间】:2019-06-14 00:39:38 【问题描述】:我需要将 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 内容类型处理。
谢谢!
【问题讨论】:
也许 Session.setConvertMIME(true) 可能会有所帮助ibm.com/support/knowledgecenter/en/SSVRGU_9.0.1/basic/… 【参考方案1】:在 Notes 中,多部分 MIME 消息表示为一组具有相同名称(通常为 Body
)的项目,每个项目都是 TYPE_MIME
。将MIMEEntity
实例视为对应于这些项目中的一个。换句话说,MIMEEntity
表示单个 MIME 部分。
因此,如果您的输入是多部分 MIME 消息,您可能必须将消息解析为单独的部分,并为每个部分创建一个 MIMEEntity
。不幸的是,Java 后端类不包括 MIME 解析器。当然,您的问题表明internetMsg.getContent()
可能返回MimeMultipart
。如果是这种情况,听起来 MIME 已经为您解析好了。
无论哪种方式——无论您的输入是多部分的流还是MimeMultipart
——我建议您查看XPages 扩展库中的MimeMessageParser.java。它使用 mime4j 解析输入流。如果流中有多个部分,它使用MIMEEntity
将每个部分写为一个单独的项目。尽管 mime4j 的使用听起来并不相关,但您可能会在该代码中找到一些有用的提示。它实现了一个非常相似的用例。
【讨论】:
【参考方案2】:谢谢戴夫,你指出了我缺少的部分。我的解决方案(到目前为止)是创建一个父 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);
【讨论】:
【参考方案3】:只是为了跟进这个问题:
我想出了一个更简单、更优雅的解决方案。有一个 writeTo() 方法可以输出所有多部分数据。然后可以再次将其流式传输到填充 MIMEEntry 主体项的 Domino 流。
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);
【讨论】:
以上是关于如何将 Internet mime 消息的所有内容复制到 Notes 中的正文项?的主要内容,如果未能解决你的问题,请参考以下文章
在 javax.mail api 中为 mime 多部分/相关消息的内容类型设置“开始”属性
如何在 C# 中将非 mime 消息转换为 mime 邮件消息