我正在尝试发送带有附加Excel文件名的
HTML电子邮件.这一切都运行良好,直到我发送其附件名称包含重音字母的消息:-(我尝试过的每一种解决方法都失败了.
原始代码:
var attachment = new Attachment( new MemoryStream(excelFileContents),"simplefilename.xls");
这个工作正常.
但是,如果我用“échec.xls”替换“simplefilename.xls”,附件就会被填充(名称和内容).
我试过这些,但无济于事:
var attachment = new Attachment( new MemoryStream(excelFileContents),new System.Net.Mime.ContentType("application/vnd.ms-excel")); attachment.Name = "échec.xls";
最后一个更糟糕:SmtpClient.Send()抛出异常,抱怨文件名中的é:
var attachment = new Attachment( new MemoryStream(excelFileContents),new System.Net.Mime.ContentType("application/vnd.ms-excel")); attachment.ContentDisposition.FileName = "échec.xls";
我一直在敲打这个问题太久了.任何灯都热烈欢迎!
解决方法
我终于找到了一个有效的答案.
除了Marcel Roma的帖子外,内容为德语.我将他的代码放入我的应用程序中.我能够发出带有重音的pdf,我们看到了附件而不是垃圾.
所以这里是:
public class AttachmentHelper { public static System.Net.Mail.Attachment CreateAttachment(string attachmentFile,string displayName,TransferEncoding transferEncoding) { System.Net.Mail.Attachment attachment = new System.Net.Mail.Attachment(attachmentFile); attachment.TransferEncoding = transferEncoding; string tranferEncodingMarker = String.Empty; string encodingMarker = String.Empty; int maxChunkLength = 0; switch (transferEncoding) { case TransferEncoding.Base64: tranferEncodingMarker = "B"; encodingMarker = "UTF-8"; maxChunkLength = 30; break; case TransferEncoding.QuotedPrintable: tranferEncodingMarker = "Q"; encodingMarker = "ISO-8859-1"; maxChunkLength = 76; break; default: throw (new ArgumentException(String.Format("The specified TransferEncoding is not supported: {0}",transferEncoding,"transferEncoding"))); } attachment.NameEncoding = Encoding.GetEncoding(encodingMarker); string encodingtoken = String.Format("=?{0}?{1}?",encodingMarker,tranferEncodingMarker); string softbreak = "?="; string encodedAttachmentName = encodingtoken; if (attachment.TransferEncoding == TransferEncoding.QuotedPrintable) encodedAttachmentName = HttpUtility.UrlEncode(displayName,Encoding.Default).Replace("+"," ").Replace("%","="); else encodedAttachmentName = System.Convert.ToBase64String(Encoding.UTF8.GetBytes(displayName)); encodedAttachmentName = SplitEncodedAttachmentName(encodingtoken,softbreak,maxChunkLength,encodedAttachmentName); attachment.Name = encodedAttachmentName; return attachment; } private static string SplitEncodedAttachmentName(string encodingtoken,string softbreak,int maxChunkLength,string encoded) { int splitLength = maxChunkLength - encodingtoken.Length - (softbreak.Length * 2); var parts = SplitByLength(encoded,splitLength); string encodedAttachmentName = encodingtoken; foreach (var part in parts) encodedAttachmentName += part + softbreak + encodingtoken; encodedAttachmentName = encodedAttachmentName.Remove(encodedAttachmentName.Length - encodingtoken.Length,encodingtoken.Length); return encodedAttachmentName; } private static IEnumerable<string> SplitByLength(string stringToSplit,int length) { while (stringToSplit.Length > length) { yield return stringToSplit.Substring(0,length); stringToSplit = stringToSplit.Substring(length); } if (stringToSplit.Length > 0) yield return stringToSplit; } }
以下列方式使用它:
static void Main(string[] args) { string smtpServer = String.Empty; string userName = String.Empty; string password = String.Empty; string attachmentFilePath = String.Empty; string displayName = String.Empty; System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient(smtpServer); client.Credentials = new System.Net.NetworkCredential(userName,password); var msg = new System.Net.Mail.MailMessage(fromAddress,toAddress,"Subject","Body"); System.Net.Mail.Attachment attachment = AttachmentHelper.CreateAttachment(attachmentFilePath,displayName,TransferEncoding.Base64); msg.Attachments.Add(attachment); client.Send(msg); }