Как скопировать все содержимое интернет-сообщения MIME в элемент тела в Notes? - PullRequest
0 голосов
/ 20 января 2019

Мне нужно скопировать все содержимое тела почты Интернета в новый документ 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 :), но для других типов объектов мне нужна помощь.Нет необходимости в обработке типов содержимого MIME или Parts.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Спасибо, Дейв, ты указал мне на недостающую часть. Мое решение (до сих пор) состоит в том, чтобы создать родительский 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);

0 голосов
/ 27 января 2019

Просто чтобы решить эту проблему:

Я нашел гораздо более простое и элегантное решение.Существует метод writeTo (), который выводит все составные данные.Затем его можно снова передать потоку 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);
}
0 голосов
/ 21 января 2019

В Notes сообщение MIME, состоящее из нескольких частей, представлено в виде набора элементов с одинаковым именем (обычно Body), каждый из которых равен TYPE_MIME.Думайте об экземпляре MIMEEntity как соответствующем одному из этих пунктов.Другими словами, MIMEEntity представляет отдельную часть MIME.

Так что, если ваш ввод является сообщением MIME, состоящим из нескольких частей, вам, возможно, придется проанализировать сообщение на отдельные части и создать MIMEEntity для каждой,К сожалению, внутренние классы Java не включают анализатор MIME.Конечно, ваш вопрос гласит, что internetMsg.getContent() может вернуть MimeMultipart.Если это так, похоже, MIME уже проанализирован для вас.

В любом случае - независимо от того, является ли ваш ввод потоком многих частей или MimeMultipart - я предлагаю вам взглянуть на MimeMessageParser.java из библиотеки расширений XPages.Он использует mime4j для анализа входного потока.Если в потоке несколько частей, он использует MIMEEntity для записи каждой части как отдельного элемента.Хотя использование mime4j не имеет значения, вы можете найти некоторые полезные советы в этом коде.Он реализует очень похожий вариант использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...