C#学习教程:带有重音的MailMessage附件文件名这一切都很好,直到我发送了一条附件名称包含重音字母的消息:-(我尝试的每个解决方法都失败了。原始代码:varattachment=newAttachment(newMemoryStream(excelFileContents),"simplefilename.xls");这工作正常。但是,如果我将“simplefilename.xls”替换为“échec.xls”,则会填充附件(名称和内容)。我已经尝试过这些,但无济于事:varattachment=newAttachment(newMemoryStream(excelFileContents),newSystem.Net.Mime.ContentType("application/vnd.ms-excel"));attachment.Name="échec.xls";最后一个更惨:SmtpClient.Send()抛出异常,抱怨文件名中的é:varattachment=newAttachment(newMemoryStream(excelFileContents),newSystem.Net.Mime.ContentType("application/vnd.ms-excel"));attachment.ContentDisposition.FileName="échec.xls";我一直在敲这个太久了。热烈欢迎任何光线!我终于找到了一个有效的答案。http://social.msdn.microsoft.com/Forums/en-US/dotnetframeworkde/thread/b6c764f7-4697-4394-b45f-128a24306d55除MarcelRoma的帖子外,内容均为德语。我将他的代码放入我的应用程序中。我能够发出带有重音的pdf,我们看到的是附件而不是垃圾。所以这里是:publicclassAttachmentHelper{publicstaticSystem.Net.Mail.AttachmentCreateAttachment(stringattachmentFile,stringdisplayName,TransferEncodingtransferEncoding){附件.TransferEncoding=transferEncoding;字符串tranferEncodingMarker=String.Empty;字符串编码标记=String.Empty;int最大块长度=0;开关(transferEncoding){caseTransferEncoding.Base64:tranferEncodingMarker="B";encodingMarker="UTF-8";最大块长度=30;休息;案例TransferEncoding.QuotedPrintable:tranferEncodingMarker="Q";encodingMarker="ISO-8859-1";最大块长度=76;休息;默认值:throw(newArgumentException(String.Format("不支持指定的TransferEncoding:{0}",transferEncoding,"transferEncoding")));}attachment.NameEncoding=Encoding.GetEncoding(encodingMarker);stringencodingtoken=String.Format("=?{0}?{1}?",encodingMarker,tranferEncodingMarker);字符串软中断=“?=”;字符串encodedAttachmentName=encodingtoken;如果(attachment.TransferEncoding==TransferEncoding.QuotedPrintable)encodedAttachmentName=HttpUtility.UrlEncode(displayName,Encoding.Default).Replace("+","").Replace("%","=");elseencodedAttachmentName=System.Convert.ToBase64String(Encoding.UTF8.GetBytes(displayName));encodedAttachmentName=SplitEncodedAttachmentName(encodingtoken,softbreak,maxChunkLength,encodedAttachmentName);attachment.Name=encodedAttachmentName;返回附件;}privatestaticstringSplitEncodedAttachmentName(stringencodingtoken,stringsoftbreak,intmaxChunkLength,stringencoded){intsplitLength=maxChunkLength-encodingtoken.Length-(softbreak.Length*2);varparts=SplitByLength(编码,splitLength);字符串encodedAttachmentName=encodingtoken;foreach(varpartinparts)encodedAttachmentName+=part+softbreak+encodingtoken;恩codedAttachmentName=encodedAttachmentName.Remove(encodedAttachmentName.Length-encodingtoken.Length,encodingtoken.Length);返回编码附件名称;}privatestaticIEnumerableSplitByLength(stringstringToSplit,intlength){while(stringToSplit.Length>length){yieldreturnstringToSplit.Substring(0,length);stringToSplit=stringToSplit.Substring(长度);}if(stringToSplit.Length>0)yieldreturnstringToSplit;}}以下列方式使用它:staticvoidMain(string[]args){stringsmtpServer=String.Empty;字符串用户名=String.Empty;字符串密码=String.Empty;字符串attachmentFilePath=String.Empty;字符串显示名称=String.Empty;System.Net.Mail.SmtpClientclient=newSystem.Net.Mail.SmtpClient(smtpServer);client.Credentials=newSystem.Net.NetworkCredential(userName,password);varmsg=newSystem.Net.Mail.MailMessage(fromAddress,toAddress,"主题","正文");System.Net.Mail.Attachment附件=AttachmentHelper.CreateAttachment(附件文件路径,显示名称,TransferEncoding.Base64);msg.Attachments.Add(附件);客户端。发送(消息);}附件名需要使用Quoted-Printable格式:如果想了解更多C#学习教程,请多多关注MailMessage附件文件名分享的全部内容。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。转载请注明出处:
