#region 获取邮件正文 和 附件
            /// <summary> 
            /// 获取文字主体 
            /// </summary> 
            /// <param name="p_Mail"></param> 
            /// <returns></returns> 
            public void GetMailText(string p_Mail)
            {
                string _ConvertType = GetTextType(p_Mail, "\r\nContent-Type: ", ";");
                if (_ConvertType.Length == 0)
                {
                    _ConvertType = GetTextType(p_Mail, "\r\nContent-Type: ", "\r");
                }
                int _StarIndex = -1;
                int _EndIndex = -1;
                string _ReturnText = "";
                string _Transfer = "";
                string _Boundary = "";
                string _EncodingName = GetTextType(p_Mail, "charset=\"", "\"").Replace("\"", "");
                System.Text.Encoding _Encoding = System.Text.Encoding.Default;
                if (_EncodingName != "") _Encoding = System.Text.Encoding.GetEncoding(_EncodingName);
                switch (_ConvertType)
                {
                    case "text/html;":
                        _Transfer = GetTextType(p_Mail, "\r\nContent-Transfer-Encoding: ", "\r\n").Trim();
                        _StarIndex = p_Mail.IndexOf("\r\n\r\n");
                        if (_StarIndex != -1) _ReturnText = p_Mail.Substring(_StarIndex, p_Mail.Length - _StarIndex);
                        switch (_Transfer)
                        {
                            case "8bit":                                break;
                            case "quoted-printable":
                                _ReturnText = DecodeQuotedPrintable(_ReturnText, _Encoding);
                                break;
                            case "base64":
                                _ReturnText = DecodeBase64(_ReturnText, _Encoding);
                                break;
                        }
                        MailTable.Rows.Add(new object[] { "text/html", _ReturnText });
                        break;
                    case "text/plain;":
                        _Transfer = GetTextType(p_Mail, "\r\nContent-Transfer-Encoding: ", "\r\n").Trim();
                        _StarIndex = p_Mail.IndexOf("\r\n\r\n");
                        if (_StarIndex != -1) _ReturnText = p_Mail.Substring(_StarIndex, p_Mail.Length - _StarIndex);
                        switch (_Transfer)
                        {
                            case "8bit":                                break;
                            case "quoted-printable":
                                _ReturnText = DecodeQuotedPrintable(_ReturnText, _Encoding);
                                break;
                            case "base64":
                                _ReturnText = DecodeBase64(_ReturnText, _Encoding);
                                break;
                        }
                        MailTable.Rows.Add(new object[] { "text/plain", _ReturnText });
                        break;
                    case "multipart/alternative;":
                        _Boundary = GetTextType(p_Mail, "boundary=\"", "\"").Replace("\"", "");
                        _StarIndex = p_Mail.IndexOf("--" + _Boundary + "\r\n");
                        if (_StarIndex == -1) return;
                        while (true)
                        {
                            _EndIndex = p_Mail.IndexOf("--" + _Boundary, _StarIndex + _Boundary.Length);
                            if (_EndIndex == -1) break;
                            GetMailText(p_Mail.Substring(_StarIndex, _EndIndex - _StarIndex));
                            _StarIndex = _EndIndex;
                        }
                        break;
                    case "multipart/mixed;":
                        _Boundary = GetTextType(p_Mail, "boundary=\"", "\"").Replace("\"", "");
                        _StarIndex = p_Mail.IndexOf("--" + _Boundary + "\r\n");
                        if (_StarIndex == -1) return;
                        while (true)
                        {
                            _EndIndex = p_Mail.IndexOf("--" + _Boundary, _StarIndex + _Boundary.Length);
                            if (_EndIndex == -1) break;
                            GetMailText(p_Mail.Substring(_StarIndex, _EndIndex - _StarIndex));
                            _StarIndex = _EndIndex;
                        }
                        break;
                    default:
                        if (_ConvertType.IndexOf("application/") == 0)
                        {
                            _StarIndex = p_Mail.IndexOf("\r\n\r\n");
                            if (_StarIndex != -1) _ReturnText = p_Mail.Substring(_StarIndex, p_Mail.Length - _StarIndex);
                            _Transfer = GetTextType(p_Mail, "\r\nContent-Transfer-Encoding: ", "\r\n").Trim();
                            string _Name = GetTextType(p_Mail, "filename=\"", "\"").Replace("\"", "");
                            _Name = GetReadText(_Name);
                            byte[] _FileBytes = new byte[0];
                            switch (_Transfer)
                            {
                                case "base64":
                                    _FileBytes = Convert.FromBase64String(_ReturnText);
                                    break;
                            }
                            MailTable.Rows.Add(new object[] { "application/octet-stream", _FileBytes, _Name });                        }
                        break;
                }
            }     

解决方案 »

  1.   

           /// <summary> 
                /// 获取类型(正则) 
                /// </summary> 
                /// <param name="p_Mail">原始文字</param> 
                /// <param name="p_TypeText">前文字</param> 
                /// <param name="p_End">结束文字</param> 
                /// <returns>符合(的)记录</returns> 
                public string GetTextType(string p_Mail, string p_TypeText, string p_End)
                {
                    System.Text.RegularExpressions.Regex _Regex = new System.Text.RegularExpressions.Regex(@"(?<=" + p_TypeText + ").*?(" + p_End + ")+");
                    System.Text.RegularExpressions.MatchCollection _Collection = _Regex.Matches(p_Mail);
                    if (_Collection.Count == 0) return "";
                    return _Collection[0].Value;
                }            /// <summary> 
                /// QuotedPrintable编码接码 
                /// </summary> 
                /// <param name="p_Text">原始文字</param> 
                /// <param name="p_Encoding">编码方式</param> 
                /// <returns>接码后信息</returns> 
                public string DecodeQuotedPrintable(string p_Text, System.Text.Encoding p_Encoding)
                {
                    System.IO.MemoryStream _Stream = new System.IO.MemoryStream();
                    char[] _CharValue = p_Text.ToCharArray();
                    for (int i = 0; i != _CharValue.Length; i++)
                    {
                        switch (_CharValue[i])
                        {
                            case '=':
                                if (_CharValue[i + 1] == '\r' || _CharValue[i + 1] == '\n')
                                {
                                    i += 2;
                                }
                                else
                                {
                                    try
                                    {
                                        _Stream.WriteByte(Convert.ToByte(_CharValue[i + 1].ToString() + _CharValue[i + 2].ToString(), 16));
                                        i += 2;
                                    }
                                    catch
                                    {
                                        _Stream.WriteByte(Convert.ToByte(_CharValue[i]));
                                    }
                                }
                                break;
                            default:
                                _Stream.WriteByte(Convert.ToByte(_CharValue[i]));
                                break;
                        }
                    }
                    return p_Encoding.GetString(_Stream.ToArray());
                }            /// <summary> 
                /// 解码BASE64 
                /// </summary> 
                /// <param name="p_Text"></param> 
                /// <param name="p_Encoding"></param> 
                /// <returns></returns> 
                public string DecodeBase64(string p_Text, System.Text.Encoding p_Encoding)
                {
                    if (p_Text.Trim().Length == 0) return "";
                    byte[] _ValueBytes = Convert.FromBase64String(p_Text);
                    return p_Encoding.GetString(_ValueBytes);
                }
                #endregion
            }        /// <summary> 
            /// 连接事件 
            /// </summary> 
            /// <param name="ar"></param> 
            private void OnConnectRequest(IAsyncResult ar)
            {
                POP3Client _Client = (POP3Client)ar.AsyncState;
                byte[] _ReadBytes = new byte[0];
                _Client.Client.Client.BeginReceive(_ReadBytes, 0, 0, SocketFlags.None, new AsyncCallback(OnWrite), _Client);
            }        /// <summary> 
            /// 连接事件 
            /// </summary> 
            /// <param name="ar"></param> 
            private void OnSend(IAsyncResult ar)
            {
                POP3Client _Client = (POP3Client)ar.AsyncState;
                byte[] _ReadBytes = new byte[0];
                _Client.Client.Client.BeginReceive(_ReadBytes, 0, 0, SocketFlags.None, new AsyncCallback(OnWrite), _Client);
            }        /// <summary> 
            /// 连接事件 
            /// </summary> 
            /// <param name="ar"></param> 
            private void OnWrite(IAsyncResult ar)
            {
                POP3Client _Client = (POP3Client)ar.AsyncState;
                byte[] _WriteBytes = new byte[_Client.Client.Client.ReceiveBufferSize];
                _Client.Client.Client.Receive(_WriteBytes);
                if (_Client.ReadEnd) _WriteBytes = ReadEnd(_WriteBytes, _Client);
                byte[] _SendBytes = _Client.GetSendBytes(_WriteBytes);
                if (_SendBytes.Length == 0) return;
                _Client.Client.Client.BeginSend(_SendBytes, 0, _SendBytes.Length, SocketFlags.None, new AsyncCallback(OnSend), _Client);
            }        /// <summary> 
            /// 获取知道获取到. 否则一直获取数据 
            /// </summary> 
            /// <param name="p_Value"></param> 
            /// <returns></returns> 
            private byte[] ReadEnd(byte[] p_Value, POP3Client p_Client)
            {
                if (System.Text.Encoding.ASCII.GetString(p_Value).IndexOf("\r\n.\r\n") != -1) return p_Value;
                MemoryStream _Stream = new MemoryStream();
                _Stream.Write(p_Value, 0, p_Value.Length);
                while (true)
                {
                    byte[] _WriteBytes = new byte[p_Client.Client.ReceiveBufferSize];
                    p_Client.Client.Client.Receive(_WriteBytes);
                    _Stream.Write(_WriteBytes, 0, _WriteBytes.Length);
                    System.Threading.Thread.Sleep(100);
                    if (System.Text.Encoding.ASCII.GetString(_WriteBytes).IndexOf("\r\n.\r\n") != -1) return _Stream.ToArray();
                }
            }    }
    }
      

  2.   

    我斷點調
    在這個位置:
    NetStrm.Write(szData, 0, szData.Length);
                    szTemp = RdStrm.ReadLine();出現異常:-ERR Unknown message
    這個是什麽錯呢?
      

  3.   

    引用 5 楼 wwfgu00ing 的回复:
    自己先断点调试下吧
    我斷點調
    在這個位置:
    NetStrm.Write(szData, 0, szData.Length);
      szTemp = RdStrm.ReadLine();出現異常:-ERR Unknown message
    這個是什麽錯呢?
      

  4.   

    上面的问题已解决,但只能抓取126的!
    像GMmail和QQ的都不行
    哪位高手指点一下吧!