//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);