基于Lumisoft.NET组件开发碰到乱码等一些问题的解决
在Lumisoft.NET组件获取POP3邮件的时候,发现大多数邮件都能正常获取,不过对于一些特殊的邮件,好像总是会出现转换错误,或者出现乱码及部分乱码现象,有些在标题里面或者邮件接收人地址,而有些则在内容里面,为了更好整理相关的问题,写了本文,希望对大家使用该组件有一定的帮助作用。
1、 日期转换出错问题。
错误信息:[2013-05-04 10:49:03] 转换邮件的Date出错:账号wuhuacong@163.com 邮件标题:ICP???????????????????????wuhuacong)
LumiSoft.Net.ParseException: Header field 'Date' parsing failed.
在 LumiSoft.Net.Mail.Mail_Message.get_Date()
在 WHC.PlugInService.Pop3Helper.Receive() 位置 ......\Pop3Helper.cs:行号 160
错误原因:由于邮件格式的日期内容格式不同,导致无法正常解析。如一般的格式为下面
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组件无法解析,需要跟踪到他的邮件日期处理的代码,然后进行修改才可以实现正常的邮件日期解析了。
官方的代码如下所示。
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)));}}}}
需要增加对普通日期格式的修改,修改后的代码如下所示
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{//尝试转换正常的日期 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、由于意外的数据包格式,握手失败
错误信息:[2013-05-04 10:13:54] System.IO.IOException: 由于意外的数据包格式,握手失败。
在 LumiSoft.Net.TCP.TCP_Client.Connect(String host, Int32 port, Boolean ssl)
在 WHC.PlugInService.SmtpHelper.Send() 位置 ........\SmtpHelper.cs:行号 123
在 WHC.PlugInService.SendMailService.DataThreadHandle(MailSendConfigInfo info) 位置 ...............\SendMailService.cs:行号 66
错误原因:由于POP3的配置端口不正确导致,一般的端口必须严格按照正常的来填写。
邮件SMTP和POP3常用配置说明:
邮箱 |
Smtp服务器 |
Smtp端口 |
POP3服务器 |
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、邮件标题乱码问题
错误信息:标题出现类似=?utf-8?B?5rWL6K+V6YKu5Lu2?=
错误原因:这个是因为编码的问题,其中=?utf-8?B是表示该段字符为UTF-8的格式,后面的是base64格式的内容。除了utf-8,还可以出现gb2312或者ibm-euccn等格式。为了转换上面的编码问题,我写了一个转码函数,如下所示。
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;}
如可以通过代码吧标题进行转码解析
info.Title = DecodeString(mime_header.Subject);
转码后,标题和相关的内容都可以正常显示了。
除了上面的转码操作,还有一种更好的方法,能够使得邮件相关信息正常显示。
因为通过分析了解到,由于Lumisoft的Mail_Message.ParseFromByte函数默认只是以UTF8转换字节,一旦字节为GB2312格式,就会发生转换乱码问题,因此先经过Default编码转换,然后再以UTF8获取字节,即可正常转换邮件头部。
byte[] utf8Bytes = Encoding.UTF8.GetBytes(message.HeaderToString()); Mail_Message mime_header = Mail_Message.ParseFromByte(utf8Bytes);
这样获取到的标题,以及邮件头部等信息,都是正常的了。
转载于:https://www.cnblogs.com/wuhuacong/archive/2013/05/06/3063166.html
基于Lumisoft.NET组件开发碰到乱码等一些问题的解决相关推荐
- 基于Lumisoft.NET组件的POP3邮件接收和删除操作
Lumisoft.NET组件是一个非常强大的邮件发送.邮件接收等功能的开源组件,一般用它来处理邮件的相关操作,是非常合适的.之前也写过一些该组件的随笔文章,不过主要是利用来发送邮件居多,最近由于项目需 ...
- 基于Teamplate Workflow组件的工组流开发概述
简要整理了基于Teamplate Workflow组件进行工作流开发的步骤.<?xml:namespace prefix = o ns = "urn:schemas-microsoft ...
- 基于Vue.js的后台管理系统组件开发
什么是Vue Vue.js 是一套构建用户界面的渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,它不仅易于上手,还便于与第三方库或既有项目整合. ...
- c# 无法加载oraops.dll_Robotstudio软件二次开发:基于C#语言的Smart组件开发基础
Robotstudio软件除了支持Add-Ins插件的二次开发以外,还支持Smart组件的二次开发.开发语言同样是基于.NET框架的C#语言或VB语言.Smart组件是Robotstudio软件中实现 ...
- Vue 3 组件开发:搭建基于SpreadJS的表格编辑系统(环境搭建)
Vue是一套用于构建用户界面的渐进式框架,与其它大型 JS 框架不同,Vue 被设计为可以自底向上逐层应用,更易上手,还便于与第三方库或既有项目整合,因此,Vue完全能够为复杂的单页应用提供驱动. 2 ...
- vue结合饿了么_饿了么基于Vue2.0的通用组件开发之路(分享会记录)
Element:一套通用组件库的开发之路 Element 是由饿了么UED设计.饿了么大前端开发的一套基于 Vue 2.0 的桌面端组件库.今天我们要分享的就是开发 Element 的一些心得. 官网 ...
- 基于GBT28181:SIP协议组件开发-----------第三篇SIP注册流程分析实现
原创文章,引用请保证原文完整性,尊重作者劳动,原文地址http://www.cnblogs.com/qq1269122125/p/3941172.html,qq:1269122125. 上两章节简要的 ...
- 基于GBT28181:SIP协议组件开发-----------第四篇SIP注册流程eXosip2实现(一)
原创文章,引用请保证原文完整性,尊重作者劳动,原文地址http://www.cnblogs.com/qq1269122125/p/3945294.html. 上章节讲解了利用自主开发的组件SIP组件l ...
- 面向对象编程、面向服务架构、基于组件开发三种编程模式的区别和适用领域
面向对象编程(Object-Oreinted Programming) 是一种编程范式.指在设计程序时大量运用类实例对象的方式.OOP一旦在项目中被运用,就成了时刻要考虑的东西. 面向服务架构(Ser ...
最新文章
- 劝大家逃离互联网!某前互联网员工自述:从互联网到传统行业,工资多,不加班,有户口,能买房!...
- html js 添加数据类型,js数据类型判断和转换
- Sybase时间日期函数
- 电脑上装蓝牙_指甲盖变触控板,隔空就能操控手机和电脑!
- gitlab使用_使用 Docker 部署 Gitlab
- wince6.0编译命令分析
- 2010——满地遍是网页防篡改和WAF
- java乘法代码_java九九乘法表代码
- 上海航芯 | 智能网联汽车终端T-BOX应用方案
- 【chrome】谷歌chrome浏览器离线安装包的获取及使用技巧
- orbslam2初始化流程
- vue 点击按钮改变颜色
- 数据智能,慧眼识“真”——个推大数据风控产品亮相
- 使用yaml文件指定 kata 安全容器配置相关参数
- 对计算机系相关人物进行访谈,瑶湖计算机系副主任姚华访谈录
- LED电性能IV扫描测试方案
- pip被卸载了,如何再重新安装
- CNN用于句子分类时的超参数分析
- Revit复制轴网和标高
- 解决No tf data. Actual error: Fixed Frame [world] does not exist错误