zoukankan      html  css  js  c++  java
  • LumiSoft.Net邮件接收乱码问题解决

    本文非本人编写,转载自: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大神帮我搜到了相关的处理代码,然后综合项目,整理出来了,留个记号。

     1 /// <summary>
     2     /// 乱码解析
     3     /// </summary>
     4     /// <param name="input"></param>
     5     /// <returns></returns>
     6     private string GetMailSubject(string input)
     7     {
     8         try
     9         {
    10             string regex = @"=?(?<encode>.*?)?(?<type>[B|Q])?(?<body>.*?)?=";
    11             Regex re = new Regex(regex, RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline);
    12             MatchCollection mcs = re.Matches(input);
    13             foreach (Match mc in mcs)
    14             {
    15                 string encode = mc.Groups["encode"].Value;
    16                 string type = mc.Groups["type"].Value;
    17                 Encoding encod = null;
    18                 if (!string.IsNullOrEmpty(encode))
    19                 {
    20                     if ((encode.ToLower().Contains("gbk") || encode.ToLower().Contains("utf8") || encode.ToLower().Contains("utf-8")) && type == "Q")
    21                     {
    22                         if (encode.ToLower().Contains("utf-8"))
    23                         {
    24                             encod = Encoding.UTF8;
    25                         }
    26                         else if (encode.ToLower().Contains("gbk"))
    27                         {
    28                             encod = Encoding.GetEncoding("gb2312");
    29                         }
    30                         input = input.Replace(mc.Value, QuotedPrintable.Decode(mc.Groups["body"].Value, encod));
    31                     }
    32                     else
    33                     {
    34                         if (encode.ToLower().Contains("euccn") || encode.ToLower().Contains("euc-cn"))
    35                         {
    36                             encode = "gb2312";
    37                         }
    38                         else if (encode.ToLower().Contains("utf8"))
    39                         {
    40                             encode = "utf-8";
    41                         }
    42                         string body = mc.Groups["body"].Value;
    43                         byte[] bytes = Convert.FromBase64String(body);
    44                         string result = Encoding.GetEncoding(encode).GetString(bytes);
    45                         input = input.Replace(mc.Value, result);
    46                     }
    47                 }
    48  
    49             }
    50             if (mcs.Count > 0)
    51             {
    52                 FileLogHelper.WriteInfo(string.Format("原邮件标题:[{0}]
    解析后标题:[{1}]", input, input));
    53             }
    54             return input;
    55         }
    56         catch (Exception)
    57         {
    58             return input;
    59         }
    60     }
    View Code

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

      1 using System;
      2 using System.Collections;
      3 using System.Text;
      4 namespace Wind.MailRobot.BLL
      5 {
      6     public class QuotedPrintable
      7     {
      8         private const byte EQUALS = 61;
      9         private const byte CR = 13;
     10         private const byte LF = 10;
     11         private const byte SPACE = 32;
     12         private const byte TAB = 9;
     13  
     14         /// <summary>
     15         /// Encodes a string to QuotedPrintable
     16         /// </summary>
     17         /// <param name="_ToEncode">String to encode</param>
     18         /// <returns>QuotedPrintable encoded string</returns>
     19         public static string Encode(string _ToEncode, Encoding encoding)
     20         {
     21             StringBuilder Encoded = new StringBuilder();
     22             string hex = string.Empty;
     23             byte[] bytes = encoding.GetBytes(_ToEncode);
     24             int count = 0;
     25  
     26             for (int i = 0; i < bytes.Length; i++)
     27             {
     28                 //these characters must be encoded
     29                 if ((bytes[i] < 33 || bytes[i] > 126 || bytes[i] == EQUALS) && bytes[i] != CR && bytes[i] != LF && bytes[i] != SPACE)
     30                 {
     31                     if (bytes[i].ToString("X").Length < 2)
     32                     {
     33                         hex = "0" + bytes[i].ToString("X");
     34                         Encoded.Append("=" + hex);
     35                     }
     36                     else
     37                     {
     38                         hex = bytes[i].ToString("X");
     39                         Encoded.Append("=" + hex);
     40                     }
     41                 }
     42                 else
     43                 {
     44                     //check if index out of range
     45                     if ((i + 1) < bytes.Length)
     46                     {
     47                         //if TAB is at the end of the line - encode it!
     48                         if ((bytes[i] == TAB && bytes[i + 1] == LF) || (bytes[i] == TAB && bytes[i + 1] == CR))
     49                         {
     50                             Encoded.Append("=0" + bytes[i].ToString("X"));
     51                         }
     52                         //if SPACE is at the end of the line - encode it!
     53                         else if ((bytes[i] == SPACE && bytes[i + 1] == LF) || (bytes[i] == SPACE && bytes[i + 1] == CR))
     54                         {
     55                             Encoded.Append("=" + bytes[i].ToString("X"));
     56                         }
     57                         else
     58                         {
     59                             Encoded.Append(System.Convert.ToChar(bytes[i]));
     60                         }
     61                     }
     62                     else
     63                     {
     64                         Encoded.Append(System.Convert.ToChar(bytes[i]));
     65                     }
     66                 }
     67                 if (count == 75)
     68                 {
     69                     Encoded.Append("=
    "); //insert soft-linebreak
     70                     count = 0;
     71                 }
     72                 count++;
     73             }
     74  
     75             return Encoded.ToString();
     76         }
     77  
     78         /// <summary>
     79         /// Decodes a QuotedPrintable encoded string 
     80         /// </summary>
     81         /// <param name="_ToDecode">The encoded string to decode</param>
     82         /// <returns>Decoded string</returns>
     83         public static string Decode(string _ToDecode, Encoding encoding)
     84         {
     85             try
     86             {
     87                 //remove soft-linebreaks first
     88                 _ToDecode = _ToDecode.Replace("=
    ", "");
     89                 char[] chars = _ToDecode.ToCharArray();
     90                 byte[] bytes = new byte[chars.Length];
     91                 int bytesCount = 0;
     92                 for (int i = 0; i < chars.Length; i++)
     93                 {
     94                     // if encoded character found decode it
     95                     if (chars[i] == '=')
     96                     {
     97                         bytes[bytesCount++] = System.Convert.ToByte(int.Parse(chars[i + 1].ToString() + chars[i + 2].ToString(), System.Globalization.NumberStyles.HexNumber));
     98                         i += 2;
     99                     }
    100                     else
    101                     {
    102                         bytes[bytesCount++] = System.Convert.ToByte(chars[i]);
    103                     }
    104                 }
    105                 return encoding.GetString(bytes, 0, bytesCount);
    106             }
    107             catch (Exception)
    108             {
    109  
    110                 return _ToDecode;
    111             }
    112         }
    113     }
    114 }
    View Code
  • 相关阅读:
    ora-01034 ora-27101解决方法(亲测)
    windows C++内存检测
    oracle求特定字符的个数
    ORACLE查看并修改最大连接数
    你必须用角色管理工具安装Microsoft .NET Framework 3.5
    让VC编译的Release版本程序在其他机器上顺利运行
    创建数据库连接
    C++ 判断进程是否存在
    excel
    毕设学习笔记
  • 原文地址:https://www.cnblogs.com/yushang/p/3552994.html
Copyright © 2011-2022 走看看