Search code examples
c#outlookmhtmlmimekit

mimekit outlook show text as attachment


I have a word document and using Aspose.Word to perform a mail merge and save the result to a memory stream as mhtml (part of my code):

Aspose.Words.Document doc = new Aspose.Words.Document(documentDirectory + countryLetterName);
doc.MailMerge.Execute(tempTable2);
MemoryStream outStream = new MemoryStream();
doc.Save(outStream, Aspose.Words.SaveFormat.Mhtml);

Then I use MimeKit (latest version from NuGet) to send my message:

outStream.Position = 0;
MimeMessage messageMimeKit = MimeMessage.Load(outStream);
messageMimeKit.From.Add(new MailboxAddress("<sender name>", "<sender email"));
messageMimeKit.To.Add(new MailboxAddress("<recipient name>", "<recipient email>"));
messageMimeKit.Subject = "my subject";
using (var client = new MailKit.Net.Smtp.SmtpClient())
{
    client.Connect(<smtp server>, <smtp port>, true);
    client.Authenticate("xxxx", "pwd");
    client.Send(messageMimeKit);
    client.Disconnect(true);
}

When opening the received email in my mail web client, I see the text (with image) and the image as attachment.

When opening the received email in Outlook (2016), the mail body is empty and I have two attachments, 1 with the text and 1 with the image.

Looking at the mht contents itself, it looks like:

MIME-Version: 1.0
Content-Type: multipart/related;
    type="text/html";
    boundary="=boundary.Aspose.Words=--"

This is a multi-part message in MIME format.

--=boundary.Aspose.Words=--
Content-Disposition: inline;
    filename="document.html"
Content-Type: text/html;
    charset="utf-8"
Content-Transfer-Encoding: quoted-printable
Content-Location: document.html

<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html; charset=
=3Dutf-8" /><meta http-equiv=3D"Content-Style-Type" content=3D"text/css" />=
<meta name=3D"generator" content=3D"Aspose.Words for .NET 14.1.0.0" /><titl=
e></title></head><body>
*****body removed *****
</body></html>

--=boundary.Aspose.Words=--
Content-Disposition: inline;
    filename="image.001.jpeg"
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-Location: image.001.jpeg

****image content remove****

--=boundary.Aspose.Words=----

Is there some formatting or so I have to do to get this correctly shown in Outlook? Or is it caused by the "3D"-keywords found, like content=3D"xxxx", style=3D"xxxx"?

Thanks in advance.

Edward


Solution

  • The =3D bits are the quoted-printable encoding of the = character. Since the headers properly declare the Content-Transfer-Encoding to be quoted-printable, that's not the problem.

    Here are some suggestions on trying to massage the content into something that will work in Outlook (Outlook is very finicky):

    MimeMessage messageMimeKit = MimeMessage.Load(outStream);
    messageMimeKit.From.Add(new MailboxAddress("<sender name>", "<sender email"));
    messageMimeKit.To.Add(new MailboxAddress("<recipient name>", "<recipient email>"));
    messageMimeKit.Subject = "my subject";
    
    var related = (MultipartRelated) messageMimeKit.Body;
    var body = (MimePart) related[0];
    
    // It's possible that the filename on the HTML body is confusing Outlook.
    body.FileName = null;
    
    // It's also possible that the Content-Location is confusing Outlook
    body.ContentLocation = null;