2012-04-11 3 views
4

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

При отправке электронной почты с более чем 1 вложением и используется свойство «Attachment.Name», вложения будут иметь неправильные имена (например, 2 вложения будут заменены их именами). Работа вокруг (и на самом деле, вероятно, правильное свойство для установки) заключается в использовании ContentDisposition.FileName. Но мне было бы очень интересно, если это произойдет для всех. Может ли кто-нибудь воссоздать эту проблему? Мне кажется, что это довольно серьезная ошибка в SmtpClient (.NET 4.0), но я не могу поверить, что никто этого не видел раньше, и Google, похоже, не показывает, кто видит подобную проблему. Вам нужно создать несколько почтовых файлов в 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?

ответ

3

Это потому, что для каждого приложения требуется новый экземпляр 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"; 

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

+0

Спасибо. Это устранило проблему. Глупая ошибка! – Martyn