带有重音符号的MailMessage附件文件名
我正在尝试发送带有附加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()
抛出exception,抱怨文件名中的é
:
var attachment = new Attachment( new MemoryStream(excelFileContents), new System.Net.Mime.ContentType("application/vnd.ms-excel")); attachment.ContentDisposition.FileName = "échec.xls";
我一直在敲打这个太久了。 任何灯都热烈欢迎!
我终于找到了一个有效的答案。
除了Marcel Roma的post外,内容为德语。 我将他的代码放入我的应用程序中。 我能够发出带有重音的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 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); }
您需要使用Quoted-Printable格式作为附件名称:
- C#:用于解码Quoted-Printable编码的类?
- http://www.codeproject.com/KB/security/TextCoDec.aspx