本文非本人编写,转载自: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. ISAPI在IIS7上的配置

    主要介绍ISAPI的作用.ISAPI在IIS7上的配置.开发ISAPI的基本内容及使用VS 2008配置ISAPI DLL开发项目. 一.ISAPI介绍 缩写词=Internet Server App ...

  2. hdu5073 简单枚举+精度处理

    其实这题还是挺简单的,因为移动k个星球后,这k个星球的权值就可以变为0,所以只有剩下的本来就是连着的才是最优解,也就是说要动也是动两端的,那么就O(N)枚举一遍动哪些就好了. 我是在杭电oj题目重现的 ...

  3. IOS 本地通知UILocalNotification

    //发送通知    UILocalNotification *notification=[[UILocalNotification alloc] init];       if (notificati ...

  4. 设置layoutControl1 中的 控件的 focus

    设置 layoutControl1 中的layoutControl EnableAutoTabOrder 为 false; this.layoutControl1.ActiveControl = th ...

  5. bzoj 1576 [Usaco2009 Jan]安全路经Travel(树链剖分,线段树)

    [题意] 给定一个无向图,找到1-i所有的次短路经,要求与最短路径的最后一条边不重叠. [思路] 首先用dijkstra算法构造以1为根的最短路树. 将一条无向边看作两条有向边,考察一条不在最短路树上 ...

  6. restsharp发送服务端请求回传session

    今天工作遇到这样一个场景,我需要获取一个游戏目录列表,这个列表接口在线上已经存在,但是这个接口需要登录认证后才能获取到,所以实现这个功能我打算分两部来做: 1.首先调登录接口,以写上session 2 ...

  7. Homework-10 the Enhanced Version

    经过一周对于JavaScript HTML语言等相关知识的学习,我终于基本完成了作业的要求,也是实现了我原先计划的第二部,推出了加强版的Homework-10 他由3个HTML组成,JS脚本直接选择嵌 ...

  8. JNI调用测试

    有需求使用JNI调用,籍着这个机会按照<Linux下测试Java的JNI(Java Native Interface)>上进行了下测试. 这篇文章记录得很清楚了,对原理未做深入的分析,希望 ...

  9. Oracle 递归查询

    现实中我们经常需要用到一些递归查询,下面我们来介绍下ORACLE中递归查询的使用. 首先我们先新建一个表来存储以上信息 create table FAMILY ( person_id INTEGER, ...

  10. codeforce 630N Forecast

    N. Forecast time limit per test 0.5 seconds memory limit per test 64 megabytes input standard input ...