使用“名称”属性时,SmtpClient发送的附件订单不正确

时间:2012-04-11 11:55:23

标签: c# .net smtpclient

有人可以重新创建此问题吗?在我看来,它似乎是SmtpClient(.NET 4.0)中一个相当严重的错误,但我不敢相信没有人见过这个,谷歌似乎没有显示任何人看到类似的问题。

发送包含1个以上附件的电子邮件并使用“Attachment.Name”属性时,附件的名称将不正确(例如,2个附件将更换其名称)。解决方法(实际上可能是要设置的正确属性)是使用ContentDisposition.FileName。但如果每个人都这样做,我会非常感兴趣。有人可以重新创建这个问题吗?在我看来,它似乎是SmtpClient(.NET 4.0)中一个相当严重的错误,但我不敢相信没有人见过这个,谷歌似乎没有显示任何人看到类似的问题。您需要在c:\ tmp \ emailin \

中创建几个zip文件
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("testfrom@example.com", "testto@example.com")
{
       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);
}

如果您现在查看c:\ tmp \ emailout \中的eml文件,您会看到类似

的内容
X-Sender: testfrom@example.com
X-Receiver: testto@example.com
MIME-Version: 1.0
From: testfrom@example.com
To: testto@example.com
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登录的错误吗?

1 个答案:

答案 0 :(得分: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";

应该解决你的问题。