我有一个应用程序偶尔会发送一封带有三个附件的电子邮件。
一个附件是用户最初发送到我邮箱的文件,所以我回复的是他们发送给我的同一个文件。我通过 MemoryStream 做到这一点,它工作得很好。
其他两个文件是 .PDF 和 .XLSX 文件。
var excelTemplatePath = GetFilePathToDefaultExcelFile();
if (excelTemplatePath != null)
mailMessage.Attachments.Add(new System.Net.Mail.Attachment(excelTemplatePath));
var pdfPath = GetFilePathToPDFInstructions();
if (pdfPath != null)
mailMessage.Attachments.Add(new System.Net.Mail.Attachment(pdfPath));
这是奇怪的部分。当我在 Visual Studio 中调试应用程序时,它们连接得很好。每次都很完美。
当我运行编译的 .exe 时,无论是从 /BIN/ 还是我选择部署它的任何位置,它都会破坏电子邮件。它不附加任何文件,只是发送一些看起来像是将文件序列化到电子邮件文本正文中的内容:
cHMvYXBwLnhtbFBLAQItABQABgAIAAAAIQAkRr56YQEAAG0DAAAYAAAAAAAAAAAA
AAAAAKblAABjdXN0b21YbWwvaXRlbVByb3BzMy54bWxQSwECLQAUAAYACAAAACEA
te/KYaMAAADVAAAAEwAAAAAAAAAAAAAAAABl5wAAY3VzdG9tWG1sL2l0ZW0xLnht
bFBLAQItABQABgAIAAAAIQB/jqJ4TAEAAOYCAAAYAAAAAAAAAAAAAAAAAGHoAABj
dXN0b21YbWwvaXRlbVByb3BzMS54bWxQSwECLQAUAAYACAAAACEAvYRiI5AAAADb
AAAAEwAAAAAAAAAAAAAAAAAL6gAAY3VzdG9tWG1sL2l0ZW0yLnhtbFBLAQItABQA
BgAIAAAAIQCQ9oX78gAAAE8BAAAYAAAAAAAAAAAAAAAAAPTqAABjdXN0b21YbWwv
aXRlbVByb3BzMi54bWxQSwECLQAUAAYACAAAACEAZaNvWToEAACtDQAAEwAAAAAA
AAAAAAAAAABE7AAAY3VzdG9tWG1sL2l0ZW0zLnhtbFBLAQItABQABgAIAAAAIQDc
SoJLbAEAAJ4CAAARAAAAAAAAAAAAAAAAANfwAABkb2NQcm9wcy9jb3JlLnhtbFBL
BQYAAAAAGwAbADoHAAB68wAAAAA=
----boundary_0_61985b34-0fc6-4f91-99b8-464d8f613491
Content-Type: application/octet-stream; name="Microsoft Office 2003 Compatibility
Installation Instructions.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment
----boundary_0_61985b34-0fc6-4f91-99b8-464d8f613491--
(那个 goobeldy goop 只是电子邮件中所有垃圾邮件的一小部分,但它在整个过程中看起来都是一样的。)
在创建附件时,我尝试使用不同的构造函数,以包含“application/pdf”的 MIME-TYPE 等等。当我这样做时,它将电子邮件正文中的 Content-Type 更改为 application/pdf,但电子邮件仍然包含所有垃圾并且没有附加文件。
为什么它会在 IDE 中运行,而不是在 .EXE 中运行?这对我来说是奇怪的行为。谢谢。
解决方案
具体解决方案是使用 System.Net.Mime 将 TransferEncoding 设置为 QuotedPrintable。
var attachment = new System.Net.Mail.Attachment(filePath);
attachment.TransferEncoding = System.Net.Mime.TransferEncoding.QuotedPrintable;
mailMessage.Attachments.Add(attachment);
我现在对每个附件执行此操作,并根据需要附加文件。