Lehce naváži a doplním nedávný článek o třídě SmtpClient. Třidu používám často a vždy jsem s ní byl spokojen. Nyní jsem ale narazil na malý problém. Možná je to známý problém a má triviální řešení. Já ale tento oříšek zatím nerozlouskl. Samozřejmě pominuli fakt, že třídu lze nahradit jinou knihovnou.


Problém

V čem přesně tkví můj problém? Jde mi o přílohy. Třída MailMessage obsahuje kolekci Attachments, do které lze vkládat objekty Attachment, které v podstatě symbolizují soubory. Klasická příloha. Pokud nějaký soubor do této kolekce přidáte a poté zprávu odešlete – příloha dorazí v pořádku. Kde je tedy můj problém? Zjistil jsem, že pakliže má soubor název delší, jak 32 znaků a obsahuje alespoň jeden český znak – neodešle se v pořádku a příloha se stane rázem nepoužitelná.
Pro ukázku jsem připravil následující zdrojový:

static void Main(string[] args)
{
    Console.WriteLine("SmtpClient - demo");
    using (MailMessage message = new MailMessage())
    {

        Console.WriteLine("Vytvářím zprávu");
        message.From = new MailAddress("jirkapenzes@gmail.com");
        message.To.Add(new MailAddress("jirkapenzes@gmail.com"));
        message.Subject = "SmtpDemo";
        message.Body = "Demo";
        message.IsBodyHtml = false;

        message.Attachments.Add(new Attachment("C:/ěščřžýáí.pdf"));
        Console.WriteLine("Připojení přílohy: {0}\n Počet znaků: {1}", message.Attachments[0].Name, message.Attachments[0].Name.Length);
        message.Attachments.Add(new Attachment("C:/ěščřžýáí012345678901234567890123456789.pdf"));
        Console.WriteLine("Připojení přílohy: {0}\n Počet znaků: {1}", message.Attachments[1].Name, message.Attachments[1].Name.Length);

        Console.WriteLine("Vytvářím SmtpClienta");
        SmtpClient client = new SmtpClient("smtp.gmail.com", 587);
        client.DeliveryMethod = SmtpDeliveryMethod.Network;
        client.EnableSsl = true;
        client.UseDefaultCredentials = false;
        client.Credentials = new NetworkCredential("jirkapenzes@gmail.com", "nejvictajneheslo");

        Console.WriteLine("Odesílám zprávu ...");
        try
        {
            client.Send(message);
            Console.WriteLine("Zpráva odeslána");
        }
        catch (Exception e)
        {
            Console.WriteLine("Error: {0}", e.Message);
        }
    }
    Console.WriteLine("Konec");
    Console.ReadKey();
}

V podstatě se pouze vytvoří zpráva, připojí se k ní dvě přílohy a následně se pomocí SmtpClienta odešle. Všechno proběhne v pořádku a mail se odešle. K příloze připojuji dva naprosto stejné soubory – pouze jsem je odlišil názvem.

image

Pakliže se nyní podívat do emailové schránky, kam jste mail odeslali, zjistíte, že jeden ze souborů má zvláštní název. Nelze otevřít. Nelze identifikovat.

image

Nad tímto oříškem si teď lámu hlavu a nevím, zda se jedná o vlastnost či chybu. Zkoušel jsem různé zásahy do kódování, měnit všemožné vlastnosti přílohy, ale stále jsem se nedostal k řádně fungujícímu výsledku. Zmiňovaných 32 znaků s kombinací s českými znaky je pouze můj subjektivní pocit, že by to nejspíš mohlo mít vliv na tuto chybu. Možná je zakopán pes jinde. Netuším. Nesetkal se někdo se stejným problémem?