如何将 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);
}