Jirka Pénzeš Blog – Neznáma krajina, kde i sáňkovat do kopce jde zlehka
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.
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.
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.
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?
Nyní jsem studentem Informačních technologií na Univerzitě Pardubice. Dlouhodobě se věnuji programování na platformě .NET, zejména ASP.NET a jazyk C#.NET. V současnosti je mým velkým zájmem technologie LINQ a WPF, objektově orientované programování a počítačová grafika. Dále se věnuji i jazyku JAVA a architektuře aplikací.
Dušan Janošík
Srpen 31st, 2011 at 16.53
Zkusím k tomu něco napsat. Název přípony se v MIME ukládá do hlavičky ContentType. Takhle nějak to vypadá pokud název neobsahuje diakritiku:
Content-Type: application/pdf; name=“/escrzyaia.pdf“
Pokud název souboru obsahuje diakritiku, je nutné ho zakódovat s pomocí Base64. V případě ěščřžýáí.pdf je to v pořádku a název se zobrazí správně.
V případě druhé přílohy se z nějakého důvodu Base64 aplikuje dvakrát. Tj. po dekódování obsahu hlavičky získáš řetězec, který zobrazuje gmail. Ten je nutné znovu dekódovat, abys získal název souboru.
Gmail se v tomto ohledu chová správně a chyba je nepochybně na straně SmtpClienta. Myslím, že nebude možné to jednoduše obejít / opravit.
Hzywzjpx
Únor 16th, 2012 at 8.50
comment2, buy levitra online, 8))),
Immulsolfpels
Únor 19th, 2012 at 15.41
adobe acrobat 7 o professional helvetica neue bold http://vjmufrk.hostingsociety.com/acrobat-pdf-files.html acrobat pdf files