[转]OpenSMTP中附件乱码的解决方法

2012年11月26日

此方法,已测试,可以发中文附件。

 

在.Net1.1的时代,一般是使用OpenSMTP来发送邮件的,到了.Net 2.0,自带了SMTPClient类,一般用自带的SmtpClient来发送信件。

但.Net 2.0自带的SMTPClient有点问题,在SMTP登录时,将用户名直接跟在Auth Login后面(AUTH LOGIN USERNAME),有些SMTP服务器不支持这种认证,比如,21cn.com, tom.com的邮件服务器,使用.net 2.0自带的SMTPClient,即使用户名密码正确,也无法发送成功。

所以,某些情况下,还是需要使用OpenSMTP来发送邮件,OpenSMTP的不足是不支持SSL,所以给Gmail发信时,我一般采用SMTPClient,而给其它邮局发信时,我一般采用OpenSMTP

OpenSMTP的另外一个缺点就是,发送中文名的附件时,附名名乱码,出现这种情况的原因,是OpenSMTP未对附件的文件名进行合适的BASE64编码,以下是OpenSMTP的Attachment.cs里的ToMime函数的代码:

sb.Append(“Content-Type: ” + mimeType + “;\r\n”);
sb.Append(” name=\”” + MailEncoder.ConvertToQP(name,null) + “\”\r\n”);
sb.Append(“Content-Transfer-Encoding: ” + encoding + “\r\n”);
sb.Append(“Content-Disposition: attachment;\r\n”);
sb.Append(” filename=\”” + MailEncoder.ConvertToQP(name,null) + “\”\r\n\r\n”);

网上也有一些解决方法,不过大多是制标不制本,以下给出一种较合理的方案:

//Fixed by Admin.net(a)163.com
//Chinese Windows:Encoding.Default=GB2312

byte[] bFName = System.Text.Encoding.Default.GetBytes(name.ToCharArray());
string sFName = System.Convert.ToBase64String(bFName);
String fname = “=?” + System.Text.Encoding.Default.BodyName + “?B?” + sFName + “?=”;

//Fixed by Admin.net(a)163.com
sb.Append(“Content-Type: ” + mimeType + “;\r\n”);
sb.Append(” name=\”” + fname + “\”\r\n”);
sb.Append(“Content-Transfer-Encoding: ” + encoding + “\r\n”);
sb.Append(“Content-Disposition: attachment;\r\n”);
sb.Append(” filename=\”” + fname + “\”\r\n\r\n”);

此方法适用于简体中文的Windows,也适用于其它所有的非英文Windows.

已编译好的OpenSmtp:

OpenSmtp 下载

声明: 本文采用 BY-NC-SA 协议进行授权. 转载请注明转自: [转]OpenSMTP中附件乱码的解决方法
本文的评论功能被关闭了.