Порядок вложения, отправленный SmtpClient, неверен при использовании свойства «Имя»

Кто-нибудь может воссоздать эту проблему? Мне кажется, что это довольно серьезная ошибка в SmtpClient (.NET 4.0), но я не могу поверить, что никто не видел этого раньше, и Google, кажется, не показывает, что кто-то видел подобную проблему.

При отправке электронного письма с более чем 1 вложением и использовании свойства «Attachment.Name» вложения будут иметь неправильные имена (например, имена 2 вложений будут заменены местами). Обходной путь (и на самом деле, вероятно, правильное свойство для установки) заключается в использовании ContentDisposition.FileName. Но мне было бы очень интересно, если бы это происходило у всех. Кто-нибудь может воссоздать эту проблему? Мне кажется, что это довольно серьезная ошибка в SmtpClient (.NET 4.0), но я не могу поверить, что никто не видел этого раньше, и Google, кажется, не показывает, что кто-то видел подобную проблему. Вам нужно будет создать пару zip-файлов в c:\tmp\emailin\

var zipCt = new ContentType { MediaType = MediaTypeNames.Application.Zip };

var attachmentA = new Attachment(@"c:\tmp\emailin\a.zip", zipCt);
attachmentA.ContentDisposition.FileName = "a.zip";
attachmentA.Name = "a.zip";

var attachmentB = new Attachment(@"c:\tmp\emailin\b.zip", zipCt);
attachmentB.ContentDisposition.FileName = "b.zip";
attachmentB.Name = "b.zip";

var msg = new MailMessage("[email protected]", "[email protected]")
{
       Body = "body",
       Subject = "subject"
};
msg.Attachments.Add(attachmentA);
msg.Attachments.Add(attachmentB);

using (var smtp = new SmtpClient())
{
     smtp.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
     smtp.PickupDirectoryLocation = @"c:\tmp\emailout\";
     smtp.Send(msg);
}

Если вы теперь посмотрите на файл eml в c:\tmp\emailout\, вы увидите что-то вроде

X-Sender: [email protected]
X-Receiver: [email protected]
MIME-Version: 1.0
From: [email protected]
To: [email protected]
Date: 11 Apr 2012 12:36:48 +0100
Subject: subject
Content-Type: multipart/mixed; boundary=--boundary_0_1b7bb1ee-ba28-4258-b662-554adb7ff81a


----boundary_0_1b7bb1ee-ba28-4258-b662-554adb7ff81a
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: quoted-printable

body
----boundary_0_1b7bb1ee-ba28-4258-b662-554adb7ff81a
Content-Type: application/zip; name=b.zip
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=a.zip

UEsDBAoAAAAAAG5ki0AAAAAAAAAAAAAAAAAFAAAAYS50eHRQSwECPwAKAAAAAABu
ZItAAAAAAAAAAAAAAAAABQAkAAAAAAAAACAAAAAAAAAAYS50eHQKACAAAAAAAAEA
GADa2JQw1xfNAdrYlDDXF80B2tiUMNcXzQFQSwUGAAAAAAEAAQBXAAAAIwAAAAAA
----boundary_0_1b7bb1ee-ba28-4258-b662-554adb7ff81a
Content-Type: application/zip; name=a.zip
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=b.zip

UEsDBAoAAAAAAHZki0AAAAAAAAAAAAAAAAAFAAAAYi50eHRQSwECPwAKAAAAAAB2
ZItAAAAAAAAAAAAAAAAABQAkAAAAAAAAACAAAAAAAAAAYi50eHQKACAAAAAAAAEA
GAD67/k51xfNAfrv+TnXF80B2tiUMNcXzQFQSwUGAAAAAAEAAQBXAAAAIwAAAAAA
----boundary_0_1b7bb1ee-ba28-4258-b662-554adb7ff81a--

Обратите внимание, что имена файлов Content-Type: и Content-Disposition: не совпадают для каждого вложения.

Я делаю что-то неправильно? Является ли это ошибкой, которую я должен регистрировать в MS?


person Martyn    schedule 11.04.2012    source источник


Ответы (1)


Это связано с тем, что для каждого вложения требуется новый экземпляр ContentType.

var zipCt = new ContentType { MediaType = MediaTypeNames.Application.Zip };
var zipCt2 = new ContentType { MediaType = MediaTypeNames.Application.Zip };

var attachmentA = new Attachment(@"c:\tmp\emailin\a.zip", zipCt);
attachmentA.ContentDisposition.FileName = "a.zip";
attachmentA.Name = "a.zip";

var attachmentB = new Attachment(@"c:\tmp\emailin\b.zip", zipCt2);
attachmentB.ContentDisposition.FileName = "b.zip";
attachmentB.Name = "b.zip";

Должно исправить вашу проблему.

person Paul Pierce    schedule 11.04.2012
comment
Спасибо. Это решило проблему. Глупая ошибка! - person Martyn; 11.04.2012