Máme webový fakturační systém, který jednou za čas naše věrné zákazníky odmění zasláním pěkného mailu s fakturou. Mail je čistě textový (zasílání HTML mailů považuji za příliš perverzní i na můj vkus), faktura je HTML soubor přiložený k mailu. I stávalo se, že některým uživatelům se mail zobrazil podivně, faktura následovala přímo v těle zprávy za úvodním textem, navíc se zmršenou diakritikou.

Bližší vyšetřování ukázalo problém. Pro připojení souboru s attachmentem jsem použil následující naivní volání:

msg.Attachments.Add(new Attachment(htmFileName, "faktura.htm"));

Ukázalo se, že .NET ji přidá do zprávy nějak takto:

----boundary_1_20f302b2-6cfa-4177-a3c3-093955cfcfe7

Content-Type: text/html; name=faktura.htm

Content-Transfer-Encoding: base64

 

77u/PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0

Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5k

Někteří klienti - jako například Microsoft Outlook 2003 v určitém nastavení - pak měly tendenci považovat HTML soubor za část zprávy. Nechci soudit, nakolik v souladu s RFC. Ostatně, MIME je jeden velký maglajz i ve specifikaci, natožpak když dojde na lámání chleba v podobě implementace.

Problémem je chybějící hlavička Content-Disposition, která by klientovi řekla, co s nebohými daty má konkrétně udělat. Mohou být například přímo součástí zprávy (obrázky vložené do HTML zprávy), nebo se může jednat o přílohu.

Předmětnou hlavičku jest doplniti následujícím kódem:

// Create attachment

using (Attachment att = new Attachment(htmFileName, "text/html")) {

    att.ContentDisposition.DispositionType = "attachment";

    att.ContentDisposition.CreationDate = DateTime.Now;

    att.ContentDisposition.FileName = "faktura.htm";

    att.ContentDisposition.Inline = false;

    msg.Attachments.Add(att);

 

    // Send mail

    SmtpClient mx = new SmtpClient();

    mx.Send(msg);

}

Zpráva pak vypadá takto:

----boundary_1_3cb74f16-ff7e-4fbb-b85f-52f903667170

Content-Type: text/html; name=faktura.htm

Content-Transfer-Encoding: base64

Content-Disposition: attachment; filename=faktura.htm;

creation-date="30 Jan 2008 19:57:03 +0100"

 

77u/PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0

Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5k

Předpokládám, že zmiňovaný problém se projeví téměř výhradně u HTML příloh (a možná ještě RTF), protože nic jiného asi klienti nebudou mít tendenci sami otevírat. V každém případě je dobré o něm vědět.