本文非本人编写,转载自:http://www.cnblogs.com/youngerliu/archive/2013/05/27/3101488.html

今天遇到用LumiSoft.Net这个组件收取邮件中含有类似于=?utf-8?B?5rWL6K+V6YKu5Lu2?= ,=?gbk?Q?=C6=BD=B0=B2=D6=A4=C8=AF*=C3=BF=D6=DC=B1=A8?=这两种格式的乱码,随后Google了下,原因是邮件本身的编码,跟传输过程采用的编码不一致,=?utf-8?B?5rWL6K+V6YKu5Lu2?= 这个表示邮件编码是utf-8,传输采用base64编码格式,第二个Q表示传输格式为Quote-Printable。
对于这种格式的字符,Google大神帮我搜到了相关的处理代码,然后综合项目,整理出来了,留个记号。

 /// <summary>
/// 乱码解析
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
private string GetMailSubject(string input)
{
try
{
string regex = @"=\?(?<encode>.*?)\?(?<type>[B|Q])\?(?<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;
string type = mc.Groups["type"].Value;
Encoding encod = null;
if (!string.IsNullOrEmpty(encode))
{
if ((encode.ToLower().Contains("gbk") || encode.ToLower().Contains("utf8") || encode.ToLower().Contains("utf-8")) && type == "Q")
{
if (encode.ToLower().Contains("utf-8"))
{
encod = Encoding.UTF8;
}
else if (encode.ToLower().Contains("gbk"))
{
encod = Encoding.GetEncoding("gb2312");
}
input = input.Replace(mc.Value, QuotedPrintable.Decode(mc.Groups["body"].Value, encod));
}
else
{
if (encode.ToLower().Contains("euccn") || encode.ToLower().Contains("euc-cn"))
{
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);
}
} }
if (mcs.Count > )
{
FileLogHelper.WriteInfo(string.Format("原邮件标题:[{0}]\r\n解析后标题:[{1}]", input, input));
}
return input;
}
catch (Exception)
{
return input;
}
}

针对两种不同类型的字符做了处理,这里调用了一个Quote-Printable编码解码类,代码如下:

 using System;
using System.Collections;
using System.Text;
namespace Wind.MailRobot.BLL
{
public class QuotedPrintable
{
private const byte EQUALS = ;
private const byte CR = ;
private const byte LF = ;
private const byte SPACE = ;
private const byte TAB = ; /// <summary>
/// Encodes a string to QuotedPrintable
/// </summary>
/// <param name="_ToEncode">String to encode</param>
/// <returns>QuotedPrintable encoded string</returns>
public static string Encode(string _ToEncode, Encoding encoding)
{
StringBuilder Encoded = new StringBuilder();
string hex = string.Empty;
byte[] bytes = encoding.GetBytes(_ToEncode);
int count = ; for (int i = ; i < bytes.Length; i++)
{
//these characters must be encoded
if ((bytes[i] < || bytes[i] > || bytes[i] == EQUALS) && bytes[i] != CR && bytes[i] != LF && bytes[i] != SPACE)
{
if (bytes[i].ToString("X").Length < )
{
hex = "" + bytes[i].ToString("X");
Encoded.Append("=" + hex);
}
else
{
hex = bytes[i].ToString("X");
Encoded.Append("=" + hex);
}
}
else
{
//check if index out of range
if ((i + ) < bytes.Length)
{
//if TAB is at the end of the line - encode it!
if ((bytes[i] == TAB && bytes[i + ] == LF) || (bytes[i] == TAB && bytes[i + ] == CR))
{
Encoded.Append("=0" + bytes[i].ToString("X"));
}
//if SPACE is at the end of the line - encode it!
else if ((bytes[i] == SPACE && bytes[i + ] == LF) || (bytes[i] == SPACE && bytes[i + ] == CR))
{
Encoded.Append("=" + bytes[i].ToString("X"));
}
else
{
Encoded.Append(System.Convert.ToChar(bytes[i]));
}
}
else
{
Encoded.Append(System.Convert.ToChar(bytes[i]));
}
}
if (count == )
{
Encoded.Append("=\r\n"); //insert soft-linebreak
count = ;
}
count++;
} return Encoded.ToString();
} /// <summary>
/// Decodes a QuotedPrintable encoded string
/// </summary>
/// <param name="_ToDecode">The encoded string to decode</param>
/// <returns>Decoded string</returns>
public static string Decode(string _ToDecode, Encoding encoding)
{
try
{
//remove soft-linebreaks first
_ToDecode = _ToDecode.Replace("=\r\n", "");
char[] chars = _ToDecode.ToCharArray();
byte[] bytes = new byte[chars.Length];
int bytesCount = ;
for (int i = ; i < chars.Length; i++)
{
// if encoded character found decode it
if (chars[i] == '=')
{
bytes[bytesCount++] = System.Convert.ToByte(int.Parse(chars[i + ].ToString() + chars[i + ].ToString(), System.Globalization.NumberStyles.HexNumber));
i += ;
}
else
{
bytes[bytesCount++] = System.Convert.ToByte(chars[i]);
}
}
return encoding.GetString(bytes, , bytesCount);
}
catch (Exception)
{ return _ToDecode;
}
}
}
}

LumiSoft.Net邮件接收乱码问题解决的更多相关文章

  1. 用phpmailer发邮件 中文乱码问题解决

    加入如下代码解决. $mail->CharSet = "GB2312"; //utf-8; $mail->Encoding = "base64"; ...

  2. openerp 7.0邮件接收中文附件乱码问题解决办法

    openerp 7.0邮件接收中文附件乱码问题解决办法: 修改文件\addons\mail\mail_thread.py #1064 line插入代码: h=email.Header.Header(n ...

  3. 基于Lumisoft.NET组件的POP3邮件接收和删除操作(转载)

    Lumisoft.NET组件是一个非常强大的邮件发送.邮件接收等功能的开源组件,一般用它来处理邮件的相关操作,是非常合适的.之前也写过一些该组件的随笔文章,不过主要是利用来发送邮件居多,最近由于项目需 ...

  4. 基于Lumisoft.NET组件的POP3邮件接收和删除操作

    From: http://www.cnblogs.com/wuhuacong/archive/2013/05/06/3063093.html Lumisoft.NET组件是一个非常强大的邮件发送.邮件 ...

  5. ASP+Access UTF-8 网页乱码问题解决办法

    用ACCESS数据库和ASP做网站时用UTF-8编码有时会出现乱码,再者网页出错或者刷新页面后就是乱码,如果数据库取值乱码在开头加上<%@LANGUAGE="VBSCRIPT" ...

  6. 【转】asp.net Cookie值中文乱码问题解决方法

    来源:脚本之家.百度空间.网易博客 http://www.jb51.net/article/34055.htm http://hi.baidu.com/honfei http://tianminqia ...

  7. C#邮件接收系统核心代码(接收POP3邮件IMAP邮件)

    /* * Created by SharpDevelop. * User: Administrator * Date: 2013/11/18 * Time: 20:55 * * To change t ...

  8. JAVAWEB开发下常见中文乱码问题解决

    JAVA环境下处理中文乱码问题一直是很多人困扰的问题,像URL传参乱码,写进数据库乱码,服务写中文文字图片乱码处理及导出PDF乱码. 1:安装中文支持 yum groupinstall "f ...

  9. WingIDE中文乱码问题解决方法

    WingIDE中文乱码问题解决方法 安装完WingIDE后,首次运行python脚本时,若脚本中含有UTF-8中文,在Debug I/O输出框中,全部变成了乱码. 这时其实我们设置下WingIDE的编 ...

随机推荐

  1. 在stm32上移植wpa_supplicant(二)

    第一层调用的移植和裁剪. wpa_supplicant_init 照论文的指示,删除wpa_params和wpa_global相关的东西.初始化流程也相当简单,driver初始化,eap_regist ...

  2. hdu 1573 x问题(中国剩余定理)HDU 2007-1 Programming Contest

    只是套模板而已(模板其实也不懂). 留着以后好好学的时候再改吧. 题意—— X = a[i] MOD b[i]; 已知a[i],b[i],求在[1, n]中存在多少x满足条件. 输入—— 第一行一个整 ...

  3. MyBatis一对多双向关联——MyBatis学习笔记之七

    处理has-one关系需要用到association元素,而处理has many关系则需要用到collection元素.例如本例中,假设一 名教师可同时指导多名学生,下面就来介绍如何使用collect ...

  4. duilib relativepos属性导致控件错误的bug修复

    转载请说明出处,谢谢~~ 我在仿酷狗音乐播放器的开发日志系列里,曾经提到了这个bug,文章地址为:http://blog.csdn.net/zhuhongshu/article/details/381 ...

  5. (一)使用Blender导出GameMaker支持的模型脚本

    源于YOYO论坛帖子:http://gmc.yoyogames.com/index.php?showtopic=603723 既然想做3D,那就先从模型的导入开始,具体的源文件,可以在“(二)使用等高 ...

  6. 写i2c_client驱动的两种方式

    http://www.cnblogs.com/simonshi/archive/2011/02/24/1963426.html

  7. exists与in的使用与区别

    1.in的使用举例 select * from tableA where id in (select id from tableB) 2.exists的使用举例 select * from table ...

  8. 一个鼠标键盘控制两台甚至多台主机的方法--Synergy

    在多台主机,不同系统中操作.避免了更换键鼠的麻烦.即使下面图中的功能. 鼠标同时在三台或者多台主机之间进行移动,而且是无缝滑动,鼠标直接从左滑倒右,而且支持,这台电脑复制,另一台黏贴.非常的方便实用. ...

  9. BestCoder Round #85

    sum Accepts: 640 Submissions: 1744 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/13107 ...

  10. mac 添加安卓设备的支持

    1. 把android设备插到mac电脑上 2. 首先可以看一下之前在该mac电脑上有没有添加过这个 , 命令 : adb devices      如果显示出,下面字样,说明之前添加过了,下面就可以 ...