Autor Thema: Eingebettete Bilder werden beim Bearbeiten in Anhänge umgewandelt  (Gelesen 1579 mal)

Offline TobiasZ

  • Frischling
  • *
  • Beiträge: 1
Hallo zusammen,

ich versuche momentan, über die COM API in C# eine Notes 9.0.1 Installation (die verfügbare Trial Version) dazu zu bewegen, dass eine E-Mail mit HTML Inhalt und eingebetteten Bildern erstellt und in Notes dann überprüft und verschickt werden kann.
Das Erstellen funktioniert mittlerweile ganz gut (Code dafür ist Unten) und auch das Überprüfen funktioniert, indem ich die zum Dokument gehörende NotesURL aufrufe.
Sobald ich allerdings versuche, das Dokument zu bearbeiten werden alle eingebetteten Bilder aus der Nachricht gelöscht und in die Anhänge verschoben.
Hat jemand ne Idee was ich falsch mache bzw. ob es dafür einen Workaround gibt?

Edit: Ich hätte schwören können, dass ich die Option für eingebettete Bilder ausprobiert habe und sie anfangs auch deaktiviert war.
Hab sie jetzt aber nochmal ausprobiert und siehe da, es funktioniert ...

Code zum Erstellen der Mail:
Code
//MIME Struktur
//body: multipart/mixed
//      --multipart/related
//      ----multipart/alternative
//      ------text/plain
//      ------text/HTML
//      ----<Eingebettete Anhänge>
//      --<Sonstige Anhänge>


NotesDocument document = _database.CreateDocument();
bool convertMime = _session.ConvertMime;
_session.ConvertMime = false;

NotesMIMEEntity body = document.CreateMIMEEntity();

message.HasEmbeddedImages = false;

//CreateMIMEChild ruft CreateChildEntity und CreateHeader/SetHeaderVal für jedes übergebene Tupel auf
NotesMIMEEntity content = CreateMIMEChild(body, Tuple.Create("Content-Type", "multipart/related"));
NotesMIMEEntity text = CreateMIMEChild(content, Tuple.Create("Content-Type", "multipart/alternative"));

//Plaintext
NotesMIMEEntity plainText = CreateMIMEChild(text);

NotesStream plainStream = _session.CreateStream();
plainStream.WriteText(ConvertHtmlToTextBody(message.Body));
plainText.SetContentFromText(plainStream, "text/plain;charset=UTF-8", MIME_ENCODING.ENC_NONE);

//HTML
NotesMIMEEntity htmlText = CreateMIMEChild(text);
NotesStream htmlStream = _session.CreateStream();
RegisterComObjectForDisposal(htmlStream);

//Verweise auf eingebettete Anhänge bei denen "cid:" fehlt korrigieren
foreach (IAttachment attachment in message.Attachments)
{
  string fileName = Path.GetFileName(attachment.FullFileName);
  if(message.Body.Contains(string.Format("\"{0}\"", fileName)))
    message.Body = message.Body.Replace(string.Format("\"{0}\"", fileName), string.Format("\"cid:{0}\"", fileName));
}

htmlStream.WriteText(message.Body);
htmlText.SetContentFromText(htmlStream, "text/HTML;charset=UTF-8", MIME_ENCODING.ENC_NONE);

//Eingebettete Anhänge
foreach (IAttachment attachment in message.Attachments)
{
  string fileName = Path.GetFileName(attachment.FullFileName);

  bool isEmbeddedFile = message.Body.Contains(string.Format("\"cid:{0}\"", fileName));

  if(!isEmbeddedFile)
    continue;

  message.HasEmbeddedImages = true;

  NotesStream fileStream = _session.CreateStream();
  if(fileStream.Open(attachment.FullFileName) && fileStream.Bytes > 0)
  {
    RegisterComObjectForDisposal(fileStream);

    NotesMIMEEntity attachment = CreateMIMEChild(content,
                                                      Tuple.Create("Content-Disposition", string.Format("inline; filename={0}", WebUtility.UrlEncode(fileName))),
                                                      Tuple.Create("Content-ID", string.Format("<{0}>", WebUtility.UrlEncode(fileName))));

    string contentType = MimeTypesMap.GetMimeType(fileName);
    attachment.SetContentFromBytes(fileStream, contentType, MIME_ENCODING.ENC_NONE);
    attachment.EncodeContent(MIME_ENCODING.ENC_BASE64);
    fileStream.Close();
  }
}

//Restliche Anhänge
foreach (IAttachment attachment in message.Attachments)
{
  string fileName = Path.GetFileName(attachment.FullFileName);

  bool isEmbeddedFile = message.Body.Contains(string.Format("\"cid:{0}\"", fileName));

  if(isEmbeddedFile)
    continue;

  NotesStream fileStream = _session.CreateStream();
  if(fileStream.Open(attachment.FullFileName) && fileStream.Bytes > 0)
  {
    RegisterComObjectForDisposal(fileStream);

    NotesMIMEEntity attachment = CreateMIMEChild(body,
                                                      Tuple.Create("Content-Disposition", string.Format("attachment; filename={0}", WebUtility.UrlEncode(fileName))),
                                                      Tuple.Create("Content-ID", string.Format("<{0}>", WebUtility.UrlEncode(fileName))));

    string contentType = MimeTypesMap.GetMimeType(fileName);
    attachment.SetContentFromBytes(fileStream, contentType, MIME_ENCODING.ENC_IDENTITY_BINARY);
  }
}

document.CloseMIMEEntities(true);

_session.ConvertMime = convertMime;
document.Save(true, false);
« Letzte Änderung: 14.11.18 - 13:47:18 von TobiasZ »

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz