如何将Internet哑剧消息的所有内容复制到Notes中的正文中?

时间:2019-01-20 11:54:36

标签: java email lotus-domino mime

我需要将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内容类型处理。

谢谢!

3 个答案:

答案 0 :(得分:1)

在Notes中,多部分MIME消息表示为一组具有相同名称(通常为Body)的项目,每个项目均为TYPE_MIME。将MIMEEntity实例视为与这些项目中的一个相对应。换句话说,MIMEEntity代表单个MIME部分。

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

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

答案 1 :(得分:1)

感谢戴夫,您指出了我所缺的部分。我的解决方案(到目前为止)是创建一个父Domino 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);

答案 2 :(得分:0)

只需跟进此问题:

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

GetQueuedCompletionStatus