如何将 Internet mime 消息的所有内容复制到 Notes 中的正文项?
How to copy all the content of an Internet mime message to a body item in 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(根据文档)。我知道如何处理字符串 :) 但对于其他对象类型,我需要一些帮助。不需要任何 MIME 或部件内容类型处理。
谢谢!
在 Notes 中,多部分 MIME 消息表示为一组同名的项目(通常 Body
),每个项目都是 TYPE_MIME
。将 MIMEEntity
实例视为对应于这些项目中的一个。换句话说,MIMEEntity
表示一个 MIME 部分。
因此,如果您的输入是多部分 MIME 消息,您可能必须将消息解析为单独的部分并为每个部分创建一个 MIMEEntity
。不幸的是,Java 后端 类 不包含 MIME 解析器。当然,您的问题表明 internetMsg.getContent()
可能 return 一个 MimeMultipart
。如果是这样的话,听起来 MIME 已经为您解析过了。
无论哪种方式——无论您的输入是许多部分的流还是 MimeMultipart
——我建议您查看 XPages Extension Library 中的 MimeMessageParser.java。它使用 mime4j 来解析输入流。如果流中有多个部分,它使用 MIMEEntity
将每个部分写为一个单独的项目。尽管 mime4j 的使用听起来无关紧要,但您可能会在该代码中找到一些有用的提示。它实现了一个非常相似的用例。
谢谢戴夫,你指出了我遗漏的部分。我的解决方案(到目前为止)是创建一个父级 Domino MIMEntity,它将所有 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() 方法可以流出所有多部分数据。然后可以将其再次流式传输到填充 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 邮件的整个正文内容复制到新的 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(根据文档)。我知道如何处理字符串 :) 但对于其他对象类型,我需要一些帮助。不需要任何 MIME 或部件内容类型处理。
谢谢!
在 Notes 中,多部分 MIME 消息表示为一组同名的项目(通常 Body
),每个项目都是 TYPE_MIME
。将 MIMEEntity
实例视为对应于这些项目中的一个。换句话说,MIMEEntity
表示一个 MIME 部分。
因此,如果您的输入是多部分 MIME 消息,您可能必须将消息解析为单独的部分并为每个部分创建一个 MIMEEntity
。不幸的是,Java 后端 类 不包含 MIME 解析器。当然,您的问题表明 internetMsg.getContent()
可能 return 一个 MimeMultipart
。如果是这样的话,听起来 MIME 已经为您解析过了。
无论哪种方式——无论您的输入是许多部分的流还是 MimeMultipart
——我建议您查看 XPages Extension Library 中的 MimeMessageParser.java。它使用 mime4j 来解析输入流。如果流中有多个部分,它使用 MIMEEntity
将每个部分写为一个单独的项目。尽管 mime4j 的使用听起来无关紧要,但您可能会在该代码中找到一些有用的提示。它实现了一个非常相似的用例。
谢谢戴夫,你指出了我遗漏的部分。我的解决方案(到目前为止)是创建一个父级 Domino MIMEntity,它将所有 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() 方法可以流出所有多部分数据。然后可以将其再次流式传输到填充 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);
}