以前做过,有点忘记了!
好你是=? 秋?=中间的是有用的信息,
而用前几位也只是不是具体的内容,
是用来判断编码格试的,
=?gb2312?B?这几位去掉,再把 ?=这个去掉,
=? 和?= 有点像xml中的< />这个意思,而gb2312?B?存是为了确定编码格试,

解决方案 »

  1.   

    在做POP3是吧。
    我做了一个POP3收邮件的类,自己觉得还挺好用的,可以联系联系,QQ 25738191。下面是我的解码部分的代码,专门用来在POP3中解码,收发人姓名、主题、正文、附件名等等都能正确解码,QP编码也没问题;没有编码的也能自动判断;它会用解码后的文字替换掉未解码的部分。
    根据情况调用其中的公有方法就OK,做过POP3的应该很容易明白的。举个例子吧,比如楼主得到的这个 subject,就可以这样
    string subject = "=?gb2312?B?zMYg0viyqA==?=";
    subject = MailDecoder.GetString(subject);
    之后 subject 中的结果是 "唐 银波"。再如content是正文,content-transfer-encode是正文传输编码,charset是正文的字符集(做过POP3的很好理解),就可以这样:
    content = MailDecoder.GetString(content, content-transfer-encode, charset);/// <summary>
    /// 提供对邮件信息进行解码静态方法。
    /// </summary>
    internal class MailDecoder
    {    /// <summary>
        /// 解析解码正则式。
        /// </summary>
        private static System.Text.RegularExpressions.Regex AnalysisRegex =
            new System.Text.RegularExpressions.Regex(
            @"\=\?(?<charset>[^\?]+)\?(?<transfer_encode>[^\?]+)\?(?<content>[^\?]+)\?\=",
            System.Text.RegularExpressions.RegexOptions.Compiled);    /// <summary>
        /// 对指定字符串进行解码。
        /// </summary>
        /// <param name="codes">待解码的字符串</param>
        /// <returns>解码后的字符串</returns>
        public static string GetString(string codes)
        {
            System.Text.RegularExpressions.Match m = AnalysisRegex.Match(codes);
            if (m.Success)
                codes = codes.Replace(m.Value,
                    this.GetString(m.Groups["content"].Value,
                    m.Groups["transfer_encode"].Value,
                    m.Groups["charset"].Value));
            return codes;
        }    /// <summary>
        /// 以指定的传输编码对字符串进行解码。
        /// </summary>
        /// <param name="codes">待解码的字符串</param>
        /// <param name="transferEncode">指定传输编码</param>
        /// <returns>解码后的字符串</returns>
        /// <res>若指定的传输编码未知,则引发 MailException 异常。</res>
        public static string GetString(string codes, string transferEncode)
        {
            return this.GetString(codes, transferEncode, System.Text.Encoding.Default);
        }    /// <summary>
        /// 以指定的传输编码对字符串进行解码。
        /// </summary>
        /// <param name="codes">待解码的字符串</param>
        /// <param name="transferEncode">指定传输编码</param>
        /// <param name="charset">指定解码后字符的字符集</param>
        /// <returns>解码后的字符串</returns>
        /// <res>若指定的传输编码未知,则引发 MailException 异常。</res>
        public static string GetString(string codes, string transferEncode, string charset)
        {
            if (charset == null)
                return this.GetString(codes, transferEncode, System.Text.Encoding.Default);
            return this.GetString(codes, transferEncode, System.Text.Encoding.GetEncoding(charset));
        }    /// <summary>
        /// 以指定的传输编码对字符串进行解码。
        /// </summary>
        /// <param name="codes">待解码的字符串</param>
        /// <param name="transferEncode">指定传输编码</param>
        /// <param name="contentEncoding">指定解码后字符的编码方式</param>
        /// <returns>解码后的字符串</returns>
        /// <res>若指定的传输编码未知,则引发 MailException 异常。</res>
        private static string GetString(string codes, string transferEncode, System.Text.Encoding contentEncoding)
        {
            return contentEncoding.GetString(this.GetBytes(codes, transferEncode));
        }    /// <summary>
        /// 以指定的传输编码对字符串进行解码。
        /// </summary>
        /// <param name="codes">待解码的字符串</param>
        /// <param name="transferEncode">指定传输编码</param>
        /// <returns>解码后的字节数组</returns>
        /// <res>若指定的传输编码未知,则引发 MailException 异常。</res>
        public static byte[] GetBytes(string codes, string transferEncode)
        {
            switch(transferEncode.ToLower())
            {
                case "base64" :
                case "b" :
                    return DecodeBase64(codes);
                case "quoted-printable" :
                case "q" :
                    return DecodeQuotedPrintable(codes);
                default :
                    throw new MailException("未知编码方式:" + transferEncode);
            }
        }    /// <summary>
        /// 对 Base64 编码进行解码。
        /// </summary>
        /// <param name="codes">待解码的 Base64 字符串</param>
        /// <returns>解码后的字节数组</returns>
        private static byte[] DecodeBase64(string codes)
        {
            return Convert.FromBase64String(codes);
        }    /// <summary>
        /// 对 Quoted-Printable 编码进行解码。
        /// </summary>
        /// <param name="codes">待解码的 Quoted-Printable 字符串</param>
        /// <returns>解码后的字节数组</returns>
        private static byte[] DecodeQuotedPrintable(string codes)
        {
            System.Collections.ArrayList byteArray = new System.Collections.ArrayList();        int i = 0;
            while (i < codes.Length)
            {
                // 编码部分,解码输出
                if (codes[i] == '=')
                {
                    // 跳过换行
                    if (codes[++i] == '\n')
                    {
                        i++;
                        continue;
                    }
                    // 转换输出
                    else
                    {
                        byte b = Convert.ToByte(codes.Substring(i, 2), 16);
                        byteArray.Add(b);
                        i += 2;
                    }
                }
                // 未编码部分,直接输出
                else
                {
                    byteArray.Add(codes[i++]);
                }
            }        return (byte[]) byteArray.ToArray(typeof(byte));
        }}