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.