问题描述
- 关于邮件发送,附件名乱码问题。
-
我在写基于lumisoft 邮件发送时遇见个很头疼的问题--附件名为汉字,且长度过长就不能被其他邮件系统正常解析。
首先我在将附件写入邮件body时使用:
multipartMixed.BodyParts.Add(MIME_Message.CreateAttachment(stream, attachments[attach]));
发现有的邮件系统不能正确解析中文名,但是部分可以。我认为可能是编码问题。然后做了一下修改。
MIME_Entity attachment = new MIME_Entity();
attachment = MIME_Message.CreateAttachment(stream, attachments[attach]);
attachment.ContentDisposition.Param_FileName = AttachmentNameStr(attachments[attach]);
attachment.ContentType.Param_Name = AttachmentNameStr(attachments[attach]);
multipartMixed.BodyParts.Add(attachment);
private string AttachmentNameStr(string fn)
{
string Charset = "gb2312";
if (Encoding.Default.GetByteCount(fn) > fn.Length)
{
return "=?" + Charset.ToUpper() + "?B?" + Base64Encode(fn) + "?=";
}
else
{
return fn;
}
}
private string Base64Encode(string str)
{
byte[] barray;
barray = Encoding.Default.GetBytes(str);
return Convert.ToBase64String(barray);
}修改后,基本上邮件系统能够正常解析邮件的附件名称 但是名称过长 例如“KTL-悬赏园豆越多您的问题会越受关注-LKT-764 认真清晰的提问-2015Apr21”
所有邮件都不能解析到名称。
我又看了看其他邮件发过来的附件名称的解码
?gb2312?Q?KTL-=CA=DA=C8=A8=C9=CC=C6=B7=C9=EA=C7=EB=CA=E9-LKT-764_=C4=DA=D2=C2=CA=D5=C4=C9=B0=FC-2015Apr21.xls?=
我想可能是编码的问题。我又换了编码方式
private string AttachmentNameStr(string fn)
{
string Charset = "gb2312";
if (Encoding.Default.GetByteCount(fn) > fn.Length)
{
return "=?" + Charset.ToUpper() + "?Q?" + DecodeQuotedPrintable(fn) + "?=";
}
else
{
return fn;
}
}#region 将字符串编码为QuotedPrintable字符串
private string DecodeQuotedPrintable(string str)
{
string Result = "";
byte[] vBuffer = Encoding.Default.GetBytes(str);
foreach (byte vByte in vBuffer)
// 可见字符并非"="(#61)
if ((vByte >= 33 && vByte <= 60) || (vByte >= 62 && vByte <= 126))
Result += (char)vByte;
else Result += "=" + vByte.ToString("X2");
return Result;
}
#endregion结果名称还是没有。。。
求指点。。。。
解决方案
你的 Encoding.Default 又不是 gb2312 编码!
用什么编码就得用对应编码的 Encoding 来 GetBytes() 啊。
解决方案二:
楼主,我也碰到和你一样的问题,不是编码的问题,是dll组件本身的问题,我已经解决了,也是困扰了很久,网上各种搜说找不到答案,然后之后想到了可以修改一个dll文件,于是我就下载了lumisoft.net的源文件,找到相关的地方进行附件文件名处理更新,然后编译,生成dll就ok了,不过首先得选择好.net 的版本,要和你现在客户端的版本一致,我选择的都是.net 4.0版本,然后测试,ok~~,再也不用担心附件名乱码问题了,偶也! 楼主有需要我可以给你发这个重新编译过的dll,因为自己找了半天没找到答案,所以想帮帮和我一样被这个问题困惑的人