使用JMAIL NET 组件 收取邮件 时 编码出现问题的解决方案
Jmail接收到的邮件,如果标题的编码方式是UTF-8的话,直接从Base64解码出来的话中文会出现乱码(英文正常),这就导致用Jmail组件收发邮件时有些邮箱的正常,有些邮箱乱码,不够完善。
例如:
QQ邮箱:
Subject: =?gbk?B?1rG907T4uL28/reiy80=?=
U-Mail邮箱
Subject: =?utf-8?B?5oiR5b6X57uZ5oiR?=
正是因为前几天帮同学弄Jmail收邮件的时候碰到此类问题,所以从网上收集了一些这方面的一些资源,希望能让大家少走点弯路!
Jmail的subject共分3段,=?和?=是结束和结尾标记
第一段:utf-8,原来页面的编码方式
第二段:B是指邮件的编码方式B就是base64
第三段:5oiR5b6X57uZ5oiR标题的内容,但是经过Base64编码了
所以出现了QQ邮箱收邮件正常,而收取U-Mail中的邮件时标题乱码的现象,本质就是U-mail用到的是UTF-8编码
看到了本质要解决Jmail收件标题乱码就很简单了。只要获取subject第3个问号和第4个问号间的内容进行base64解码即可。
#region base64解码
public static string base64GbkDecode(string data)
{
string decode = "";
byte[] bytes = Convert.FromBase64String(data);
try
{
decode = Encoding.GetEncoding("gb2312").GetString(bytes);
}
catch (Exception ex1)
{
//return "Error in base64Encode" + ex1.Message;
}
return decode;
}
public static string base64Utf8Decode(string data)
{
string result = "";
try
{
System.Text.UTF8Encoding encoder = new System.Text.UTF8Encoding();
System.Text.Decoder utf8Decode = encoder.GetDecoder();
byte[] todecode_byte = Convert.FromBase64String(data);
int charCount = utf8Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length);
char[] decoded_char = new char[charCount];
utf8Decode.GetChars(todecode_byte, 0, todecode_byte.Length, decoded_char, 0);
result = new String(decoded_char);
}
catch (Exception e)
{
//return "Error in base64Encode" + e.Message;
}
return result;
}
//base64解码
public static string DecodeStr(string allstr, string code)
{
//形如=?...?=是结束开始的标志
//=?utf-8?B?5rWL6K+V5o6l5pS25pys6YKu5Lu26L+Z5piv5Li76aKY?=
//=?gbk?B?suLK1L3TytXN4rK/08q8/tXiuPbKx9b3zOU=?=
//返回的字符串
string str = "";
if (code == "gbk")
{
str = base64GbkDecode(allstr);
}
else if (code == "utf-8")
{
str = base64Utf8Decode(allstr);
}
return str;
}
#endregion
调用方法
public List<Entity.tb_Mail> getMail(string PopServer, int PopPort, string User, string Pass, bool UseSSL,int type)
{
List<Entity.tb_Mail> lst = new List<Entity.tb_Mail>();
using (Pop3Client client = new Pop3Client(PopServer, PopPort, UseSSL, User, Pass))
{
//连接POP3服务器并验证用户身份
client.Authenticate();
//验证成功,启动接收过程
client.Stat();
//枚举所有未读邮件
foreach (Pop3ListItem item in client.List())
{
Entity.tb_Mail tmpTbMail = new Entity.tb_Mail();
MailMessageEx message = client.RetrMailMessageEx(item);
//保存新邮件到数据库
if (!isHaveMail(message.MessageNumber.ToString()))
{
///因为Access数据库的字符限制 而且加上邮件的解码
///保存数据库里的只保存邮件的ID 以此判断服务器上的新邮件数量
bool bb = saveMail(message.MessageNumber);
//tmpTbMail.mail_Body = message.Body.ToString();
tmpTbMail.mail_existId = message.MessageNumber.ToString();
tmpTbMail.mail_title = DecodeStr(message.Subject.ToString().Split('?')[3], "utf-8")
tmpTbMail.mail_Body = message.Body.ToString();
tmpTbMail.mail_getAddress = message.MessageNumber.ToString();
lst.Add(tmpTbMail);
}
else
{
if (type == 0)
{
//tmpTbMail.mail_Body = message.Body.ToString();
tmpTbMail.mail_existId = message.MessageNumber.ToString();
tmpTbMail.mail_title = message.Subject.ToString();
tmpTbMail.mail_Body = message.Body.ToString();
tmpTbMail.mail_getAddress = message.MessageNumber.ToString();
lst.Add(tmpTbMail);
}
}
}
//向POP3服务器发送空信息,表示客户端在线
client.Noop();
//重置POP3服务器上的邮件状态
client.Rset();
//断开与POP3服务器的连接
client.Quit();
}
return lst;
}
编辑器加载中...
浙公网安备 33010602011771号