SmtpClient发送邮件时附件名称乱码
在用户环境发现一个现象,使用System.Net.Mail.SmtpClient发送邮件,当附件名包含中文且长度较长时,最终的邮件里附件名会乱掉,写个简单的测试程序:
var mail = new MailMessage("from@test.com", "to@test.com");
mail.Subject = "测试邮件乱码";
var atta = new Attachment(@"C:\测试邮件中文出现乱码20150115.rar");
mail.Attachments.Add(atta);
var smtp = new SmtpClient();
smtp.Host = "test.com";
smtp.Credentials = new NetworkCredential("from", "test");
smtp.Send(mail);
使用Foxmail接收邮件,然后查看邮件原始信息,发现附件部分的MIME居然是这样的:

这个怪异的name导致了在邮件客户端里显示乱码。换不同的机器测试,有些机器是正常的,说明与软件环境有关。正常的邮件应该是这样的:

研究了一下,发现是.Net Framework的BUG,详见微软网站:http://support.microsoft.com/kb/2402064, 当附件名超过41个utf8 byte时,会错误的进行2次编码导致的。 补丁见 https://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=31723。
如果服务器未升级,可以暂时修改程序来避开这个BUG,主要是手工指定附件的名称:
var mail = new MailMessage("from@test.com", "to@test.com");
mail.Subject = "测试邮件乱码";
string file = @"C:\测试邮件中文出现乱码20150115.rar";
var atta = new Attachment(file);
string name = Path.GetFileName(file);
string base64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(name));
atta.ContentDisposition.FileName = string.Format("=?utf-8?B?{0}?=", base64); //指定附件的filename
atta.Name = "p_w_upload"; //指定MimePart的Name,不包含中文,这样就不会被BUG影响
atta.NameEncoding = Encoding.UTF8;
mail.Attachments.Add(atta);
var smtp = new SmtpClient();
smtp.Host = "test.com";
smtp.Credentials = new NetworkCredential("from", "test");
smtp.Send(mail);
此时收到的邮件是这样的,注意划红线部分:

SmtpClient发送邮件时附件名称乱码的更多相关文章
- Java发送邮件时标题和发件人乱码
最近碰到一个问题,Java发送邮件时,查看邮箱结果,发件人及邮件标题正文全部乱码 通过翻阅资料,原因及解决方法如下: // Set Subject: 头字段 message.setSubject(Mi ...
- 利用System.Net.Mail 的SmtpClient发送邮件
原文:利用System.Net.Mail 的SmtpClient发送邮件 几个月前总结过关于Jmail发送邮件,当时用Jmail发送邮件发送速度有点慢(可能对Jmail了解不是很多).现在改为用微软提 ...
- .Net使用163smtp发送邮件时错误:邮箱不可用. has no permission解决方法
C#实现简单邮件发送代码如下 public static void SendAsync(string emailTo, string subject, string mailBody) { var m ...
- Java实现发送邮件,图片,附件
参照地址 1.JavaMail 介绍 JavaMail 是sun公司(现以被甲骨文收购)为方便Java开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发包,它支持一些常用的邮件协议,如前面 ...
- jsp页面写入中文到mysql时出现了乱码(转)
今天自己在用jsp把中文写入mysql的时候出现乱码,从数据库中读取出来的时候也显示为“??”,感觉应该出现了编码转换过程中的字符信息丢失.然后在mysql中直接执行该命令,发现中文是正常的,所有认为 ...
- 通过freemarker生成一个word,解决生成的word用wps打开有问题的问题,解决出word时中文文件名乱码问题,解决打开出word时打开的word出现问题的问题,出图片,解决动态列表
通过freemarker制作word比较简单 步骤:制作word模板.制作方式是:将模板word保存成为xml----在xml的word模板中添加相应的标记----将xml的word文件的后缀名 ...
- PHPmailer发送邮件时的常见问题及解决办法
来源:http://www.chinastor.com/a/jishu/mailserver/0G392262014.html 使用PHPmailer发送邮件时的常见问题总结: 一,没有定义发送邮箱$ ...
- SpringBoot 发送邮件和附件
作者:yizhiwaz 链接:www.jianshu.com/p/5eb000544dd7 源码:https://github.com/yizhiwazi/springboot-socks 其他文章: ...
- [MacOS] 终端使用ssh时,中文乱码问题处理
终端显示中文问题处理: vim ~/.inputrc 加入以下代码 set meta-flag on set convert-meta off set input-meta on set output ...
随机推荐
- 你真的会用搜索吗?—— google 搜索技巧
鄙人用了那么多年 google ,却只会简单的空格. 虽然空格已经很强大了.google 对此做了非常多的优化,原则是让你只用最基础的输入搭配空格就能达到跟下面介绍的方法几乎一样的效果,但是还有知道一 ...
- adb devices无法连接mumu模拟器
解决方案: 如果你的android环境能够直接访问 adb 的相关指令.只需要把mumu模拟器打开 然后打开cmd -> 输入 adb connect 127.0.0.1:7555 就能直接连上 ...
- 【Unity游戏开发】Android6.0以上的动态权限申请问题
一.引子 最近公司的游戏在做安全性测试,期间也暴露出了不少安全上的问题.虽然我们今天要说的权限申请和安全性相关不大,但是也会影响到游戏的使用体验等,所以本篇博客中马三就想和大家谈谈Android6.0 ...
- 我眼中的 RPC
目录 什么是 RPC ? 什么情况下使用 RPC ? RPC 框架原理 RPC 调用过程 RPC 优点 RPC 缺点 PHP RPC 有哪些? 小结 推荐阅读 什么是 RPC ? RPC 是一种框架或 ...
- Monday
ssm项目 设计模式:上周(观察者模式,策略模式)
- 【ASP.NET Core】AddMvc和AddMvcCore的区别
AddMvcCore() method only adds the core MVC services. AddMvc() method adds all the required MVC servi ...
- iOS----------文字逐个显示
参考文档: https://blog.csdn.net/et295394330/article/details/50529862
- python-初始网络编程
一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...
- 读书笔记_python网络编程3_(1)
0.前言 代码目录: https://github.com/brandon-rhodes/fopnp/tree/m/py3 0.1.网络实验环境:理解客户端与服务器是如何通过网络进行通信的 每台机器通 ...
- RF自动化测试之元素封装
自动化测试均需要遵循由点到面的规则,然而对于UI自动化,点是最容易发生变化的,如果使用硬链接,那么每次元素的修改都必须修改代码,这对于代码功底薄弱的测试工程师来说,是较为困难的,所以自动化测试需要对底 ...