首页 新闻 会员 周边 捐助

关于邮件发送,附件名乱码问题。

0
悬赏园豆:40 [待解决问题]

我在写基于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

 

结果名称还是没有。。。

 

求指点。。。。

 

 

xuliyuan173的主页 xuliyuan173 | 菜鸟二级 | 园豆:249
提问于:2015-05-06 11:28
< >
分享
所有回答(3)
0

attachment .ContentType.Param_Charset = 试试。 

问天何必 | 园豆:3311 (老鸟四级) | 2015-05-06 13:36

貌似不行

 

支持(0) 反对(0) xuliyuan173 | 园豆:249 (菜鸟二级) | 2015-05-06 14:07
0

改成utf-8 试试  

 

下面这个方面可以用,我在用

/// <summary>
/// 发送邮件2
/// </summary>
public void SendMailUseGmail2(string subject, string body)
{

var msg = new MailMessage();
Dictionary<string, string> addresslist = GetAddress("/Mail/MailAddress");

foreach (KeyValuePair<string, string> item in addresslist)
{
msg.To.Add(new MailAddress(item.Value, item.Key, Encoding.UTF8));
}
/*
* msg.CC.Add("c@c.com");可以抄送给多人
*/
msg.From = new MailAddress("这里写邮箱地址", "秘书", Encoding.UTF8);
/* 上面3个参数分别是发件人地址(可以随便写),发件人姓名,编码*/
msg.Subject = subject; //邮件标题
msg.SubjectEncoding = Encoding.UTF8; //邮件标题编码
msg.Body = body; //邮件内容
msg.BodyEncoding = Encoding.UTF8; //邮件内容编码
msg.IsBodyHtml = false; //是否是HTML邮件
msg.Priority = MailPriority.High; //邮件优先级
var client = new SmtpClient();
client.Credentials = new NetworkCredential("邮箱地址", "邮箱密码");
//上述写你的GMail邮箱和密码
client.Host = "mail.petrochina";
client.Port = 25; //使用的端口
client.EnableSsl = true; //经过ssl加密
// object userState = msg;

//client.SendAsync(msg, userState);
//简单一点儿可以
client.Send(msg);
Environment.Exit(0);

}

bin790302901 | 园豆:195 (初学一级) | 2015-05-21 10:14
0

以前遇到过,中文字超过13个。哈哈,我也没解决,围观一下。

| 园豆:780 (小虾三级) | 2015-05-25 14:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册