深入Lumisoft.NET組件開(kāi)發(fā)碰到亂碼等問(wèn)題的解決方法
在Lumisoft.NET組件獲取POP3郵件的時(shí)候,發(fā)現(xiàn)大多數(shù)郵件都能正常獲取,不過(guò)對(duì)于一些特殊的郵件,好像總是會(huì)出現(xiàn)轉(zhuǎn)換錯(cuò)誤,或者出現(xiàn)亂碼及部分亂碼現(xiàn)象,有些在標(biāo)題里面或者郵件接收人地址,而有些則在內(nèi)容里面,為了更好整理相關(guān)的問(wèn)題,寫(xiě)了本文,希望對(duì)大家使用該組件有一定的幫助作用。
1、 日期轉(zhuǎn)換出錯(cuò)問(wèn)題。
錯(cuò)誤信息:[2013-05-04 10:49:03] 轉(zhuǎn)換郵件的Date出錯(cuò):賬號(hào)wuhuacong@163.com 郵件標(biāo)題:ICP???????????????????????wuhuacong)
LumiSoft.Net.ParseException: Header field 'Date' parsing failed.
在 LumiSoft.Net.Mail.Mail_Message.get_Date()
在 WHC.PlugInService.Pop3Helper.Receive() 位置 ......\Pop3Helper.cs:行號(hào) 160
錯(cuò)誤原因:由于郵件格式的日期內(nèi)容格式不同,導(dǎo)致無(wú)法正常解析。如一般的格式為下面
Message-ID: <d74841c5887b4df692ebdb7ec7802054@4782e72954a24cc89535840ea2e5da5b>
Date: Fri, 26 Apr 2013 08:56:52 GMT
Mime-Version: 1.0
From: "wuhuacong2013@163.com" <wuhuacong2013@163.com>
To: "wuhuacong@96900.com.cn" <wuhuacong@96900.com.cn>
有些郵件日期格式是2013-05-06 19:01:44,則Lumisoft組件無(wú)法解析,需要跟蹤到他的郵件日期處理的代碼,然后進(jìn)行修改才可以實(shí)現(xiàn)正常的郵件日期解析了。
官方的代碼如下所示
public DateTime Date
{
get{
if(this.IsDisposed){
throw new ObjectDisposedException(this.GetType().Name);
}
MIME_h h = this.Header.GetFirst("Date");
if(h != null){
try{
return MIME_Utils.ParseRfc2822DateTime(((MIME_h_Unstructured)h).Value);
}
catch{
throw new ParseException("Header field 'Date' parsing failed.");
}
}
else{
return DateTime.MinValue;
}
}
set{
if(this.IsDisposed){
throw new ObjectDisposedException(this.GetType().Name);
}
if(value == DateTime.MinValue){
this.Header.RemoveAll("Date");
}
else{
MIME_h h = this.Header.GetFirst("Date");
if(h == null){
this.Header.Add(new MIME_h_Unstructured("Date",MIME_Utils.DateTimeToRfc2822(value)));
}
else{
this.Header.ReplaceFirst(new MIME_h_Unstructured("Date",MIME_Utils.DateTimeToRfc2822(value)));
}
}
}
}
需要增加對(duì)普通日期格式的修改,修改后的代碼如下所示
public DateTime Date
{
get{
if(this.IsDisposed){
throw new ObjectDisposedException(this.GetType().Name);
}
MIME_h h = this.Header.GetFirst("Date");
if(h != null){
try{
return MIME_Utils.ParseRfc2822DateTime(((MIME_h_Unstructured)h).Value);
}
catch{
//嘗試轉(zhuǎn)換正常的日期
DateTime dt;
string dateString = ((MIME_h_Unstructured)h).Value;
bool success = DateTime.TryParse(dateString, out dt);
if (success)
{
return dt;
}
else
{
throw new ParseException("Header field 'Date' parsing failed.");
}
}
}
else{
return DateTime.MinValue;
}
}
set{
if(this.IsDisposed){
throw new ObjectDisposedException(this.GetType().Name);
}
if(value == DateTime.MinValue){
this.Header.RemoveAll("Date");
}
else{
MIME_h h = this.Header.GetFirst("Date");
if(h == null){
this.Header.Add(new MIME_h_Unstructured("Date",MIME_Utils.DateTimeToRfc2822(value)));
}
else{
this.Header.ReplaceFirst(new MIME_h_Unstructured("Date",MIME_Utils.DateTimeToRfc2822(value)));
}
}
}
}
2、由于意外的數(shù)據(jù)包格式,握手失敗
錯(cuò)誤信息:[2013-05-04 10:13:54] System.IO.IOException: 由于意外的數(shù)據(jù)包格式,握手失敗。
在 LumiSoft.Net.TCP.TCP_Client.Connect(String host, Int32 port, Boolean ssl)
在 WHC.PlugInService.SmtpHelper.Send() 位置 ........\SmtpHelper.cs:行號(hào) 123
在 WHC.PlugInService.SendMailService.DataThreadHandle(MailSendConfigInfo info) 位置 ...............\SendMailService.cs:行號(hào) 66
錯(cuò)誤原因:由于POP3的配置端口不正確導(dǎo)致,一般的端口必須嚴(yán)格按照正常的來(lái)填寫(xiě)。
郵件SMTP和POP3常用配置說(shuō)明: 郵箱 Smtp服務(wù)器 Smtp端口 POP3服務(wù)器 POP3端口 使用SSL Gmail.com smtp.gmail.com 465 pop.gmail.com 995 true QQ.com smtp.qq.com 25 pop.qq.com 110 true 163.com smtp.163.com 25 pop.163.com 110 false Sina.com smtp.sina.com 25 pop.sina.com 110 false 其他 smtp.test.com 25 pop.test.com 110 false
3、郵件標(biāo)題亂碼問(wèn)題
錯(cuò)誤信息:標(biāo)題出現(xiàn)類(lèi)似=?utf-8?B?5rWL6K+V6YKu5Lu2?=
錯(cuò)誤原因:這個(gè)是因?yàn)榫幋a的問(wèn)題,其中=?utf-8?B是表示該段字符為UTF-8的格式,后面的是base64格式的內(nèi)容。除了utf-8,還可以出現(xiàn)gb2312或者ibm-euccn等格式。為了轉(zhuǎn)換上面的編碼問(wèn)題,我寫(xiě)了一個(gè)轉(zhuǎn)碼函數(shù),如下所示。
private string DecodeString(string input)
{
string regex = @"=\?(?<encode>.*?)\?B\?(?<body>.*?)\?=";
Regex re = new Regex(regex, RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline);
MatchCollection mcs = re.Matches(input);
foreach (Match mc in mcs)
{
string encode = mc.Groups["encode"].Value;
if (!string.IsNullOrEmpty(encode))
{
if (encode.ToLower().Contains("euccn") || encode.ToLower().Contains("euc-cn") ||
encode.ToLower().Contains("gbk"))
{
encode = "gb2312";
}
else if (encode.ToLower().Contains("utf8"))
{
encode = "utf-8";
}
string body = mc.Groups["body"].Value;
byte[] bytes = Convert.FromBase64String(body);
string result = Encoding.GetEncoding(encode).GetString(bytes);
input = input.Replace(mc.Value, result);
}
}
return input;
}
如可以通過(guò)代碼吧標(biāo)題進(jìn)行轉(zhuǎn)碼解析
info.Title = DecodeString(mime_header.Subject);
轉(zhuǎn)碼后,標(biāo)題和相關(guān)的內(nèi)容都可以正常顯示了。
除了上面的轉(zhuǎn)碼操作,還有一種更好的方法,能夠使得郵件相關(guān)信息正常顯示。
因?yàn)橥ㄟ^(guò)分析了解到,由于Lumisoft的Mail_Message.ParseFromByte函數(shù)默認(rèn)只是以UTF8轉(zhuǎn)換字節(jié),一旦字節(jié)為GB2312格式,就會(huì)發(fā)生轉(zhuǎn)換亂碼問(wèn)題,因此先經(jīng)過(guò)Default編碼轉(zhuǎn)換,然后再以UTF8獲取字節(jié),即可正常轉(zhuǎn)換郵件頭部。
byte[] utf8Bytes = Encoding.UTF8.GetBytes(message.HeaderToString());
Mail_Message mime_header = Mail_Message.ParseFromByte(utf8Bytes);
這樣獲取到的標(biāo)題,以及郵件頭部等信息,都是正常的了。
相關(guān)文章
把ASP.NET MVC項(xiàng)目部署到本地IIS上的完整步驟
最近會(huì)經(jīng)常修改一些網(wǎng)站前端的內(nèi)容,為了方便跟UI和產(chǎn)品交流,需要將自己修改過(guò)的頁(yè)面及時(shí)發(fā)布到測(cè)試機(jī)或者是本地的IIS上。下面這篇文章主要給大家介紹了關(guān)于如何把ASP.NET MVC項(xiàng)目部署到本地IIS上的相關(guān)資料,需要的朋友可以參考下2018-06-06.NET 6開(kāi)發(fā)TodoList應(yīng)用實(shí)現(xiàn)結(jié)構(gòu)搭建
這篇文章主要介紹了.NET 6開(kāi)發(fā)TodoList應(yīng)用實(shí)現(xiàn)結(jié)構(gòu)搭建,上一篇我們講解了實(shí)現(xiàn)系列背景 ,今天繼續(xù)來(lái)講講.NET 6開(kāi)發(fā)TodoList并且實(shí)現(xiàn)結(jié)構(gòu)搭建,更多詳細(xì)內(nèi)容剛興趣得小伙伴可以來(lái)參考一下下面文章得具體內(nèi)容2021-12-12asp.net 判斷數(shù)組是否存在某個(gè)值的方法
asp.net 判斷數(shù)組是否存在某個(gè)值的兩種方法, 需要的朋友可以參考下。2010-07-07.Net Core中間件之靜態(tài)文件(StaticFiles)示例詳解
這篇文章主要給大家介紹了關(guān)于.Net Core中間件之靜態(tài)文件(StaticFiles)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起看看吧2018-09-09asp.net 合并GridView中某列相同信息的行(單元格)
合并GridView中某列相同信息的行(單元格)2009-11-11