本文非本人编写,转载自: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. JS 代码编一个倒时器

    有时候在生活中,你需要一个JavaScript倒计时时钟,而不是一个末日装置设备.不管你是否有一次约会,销售.促销.或者游戏,你可以受益于使用原生JavaScript构建一个时钟,而不是拿到一个现成的 ...

  2. 【剑指offer 面试题22】栈的压入、弹出序列

    思路: 不停地压栈,直到栈头元素与弹出序列的首元素相等则出栈,同时弹出序列后移:若不相等则一直保持压栈,直到压入所有元素后弹出序列仍不为空,则说明无法匹配. C++: #include <ios ...

  3. 2.2……测试

    概述 黑盒测试: 是以用户的角度,从输入数据与输出数据的对应关系出发进行测试的.   白盒测试: 又称结构测试.透明盒测试.逻辑驱动测试或基于代码的测试.   单元测试: 又称模块测试,是开发者编写的 ...

  4. linux内核书籍

    1, 关于操作系统理论的最初级的知识.不需要通读并理解<操作系统概念><现代操作系统>等巨著,但总要知道分时(time-shared)和实时(real-time)的区别是什么, ...

  5. ResolverService跨子网的广播问题

    ResolverService在广播请求时,需要借助McastTransport,而McastTransport利用java.net.MulticastSocket进行收发,java.net.Mult ...

  6. protobuf 作为配置文件

    公司每个project代码中,都有一个Config类,作为模块启动的配置.其实现如下 struct Config { int num; char * file_name; int load_from_ ...

  7. HDU 5675 ztr loves math (数学推导)

    ztr loves math 题目链接: http://acm.hust.edu.cn/vjudge/contest/123316#problem/A Description ztr loves re ...

  8. 一、Microsoft Dynamics CRM 4.0 SDK概述

    Chapter 1. Microsoft Dynamics CRM 4.0 SDK Overview(SDK概述) You are probably reading this book because ...

  9. 计算两个日期相隔的天数(jodd)

    public static void main(String[] args) throws ParseException { System.out.println(TimeUtil.dayOfYear ...

  10. transition:all 0.5s linear;进度条动画效果 制作原理

    Html: <span class="progress"><b ><i></i></b><em>50< ...