C# 使用TcpClient 获取邮件列
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
公司里网络使用代理... 只测试了公司的POP3服务器
使用方法
POP3 _Popt = new POP3("192.168.0.1", 110);
DataTable _MailTable = _Popt.GetMailTable("zk", "zk");
MailTable 包含了 收件人 发件人 编号 邮件大小 主
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
日期
先贴出来 有时间再改把 马上过年了:) 有什么问题再联系我把
全部代码
view plaincopy to clipboardprint?
using System;
using System.Net.Sockets;
using System.Net;
using System.Security.Cryptography;
using System.IO;
using System.Data;
namespace Zgke.Net
{
///
/// 获取邮件的类
///
public class POP3
{
private string m_Address = "127.0.0.1";
private int m_Port = 110;
public POP3(string p_Address, int p_Port)
{
m_Address = p_Address;
m_Port = p_Port;
}
public DataTable GetMailTable(string p_Name,string p_PassWord)
{
POP3Client _Client = new POP3Client();
_Client.UserName = p_Name;
_Client.PassWord = p_PassWord;
_Client.Client = new TcpClient();
_Client.Client.BeginConnect(m_Address, m_Port, new AsyncCallback(OnConnectRequest), _Client);
while (!_Client.ReturnEnd)
{
System.Windows.Forms.Application.DoEvents();
}
if (_Client.Error.Length != 0) throw new Exception("错误信息!" +
_Client.Error);
return _Client.MailDataTable;
}
private class POP3Client
{
public TcpClient Client;
public string UserName = "";
public string PassWord = "";
public bool ReturnEnd = false;
public DataTable MailDataTable = new DataTable();
public string Error = "";
public POP3Client()
{
MailDataTable.Columns.Add("NUM");
MailDataTable.Columns.Add("Size");
MailDataTable.Columns.Add("Form");
MailDataTable.Columns.Add("To");
MailDataTable.Columns.Add("Subject");
MailDataTable.Columns.Add("Date");
}
private int m_SendMessage = 0;
private int m_TOPIndex = 1;
public bool ReadEnd = false;
///
/// 获取下一个登陆到获取列表需要的命令
///
///
///
public byte[] GetSendBytes(byte[] p_Value)
{
ReadEnd = false;
string _Value =
System.Text.Encoding.ASCII.GetString(p_Value).Replace("\0", "");
if (_Value.IndexOf("+OK") == 0)
{
m_SendMessage++;
switch (m_SendMessage)
{
case 1:
return System.Text.Encoding.ASCII.GetBytes("USER " + UserName + "\r\n");
case 2:
return System.Text.Encoding.ASCII.GetBytes("PASS " + PassWord + "\r\n");
case 3:
ReadEnd = true;
return
System.Text.Encoding.ASCII.GetBytes("LIST\r\n");
case 4:
string[] _List = _Value.Split(new char[] { '\r', '\n',
'.' }, StringSplitOptions.RemoveEmptyEntries);
for (int i = 1; i != _List.Length; i++)
{
string[] _MaliSize = _List[i].Split(' ');
MailDataTable.Rows.Add(new object[] { _MaliSize[0], _MaliSize[1] });
}
if (MailDataTable.Rows.Count == 0)
{
ReturnEnd = true;
return new byte[0];
}
else
{
ReadEnd = true;
m_TOPIndex = 1;
return System.Text.Encoding.ASCII.GetBytes("TOP
1\r\n");
}
case 5:
System.Text.RegularExpressions.Regex _Regex = new System.Text.RegularExpressions.Regex(@"(?<=Date: ).*?(\r\n)+");
System.Text.RegularExpressions.MatchCollection _Collection = _Regex.Matches(_Value);
if (_Collection.Count != 0)
MailDataTable.Rows[m_TOPIndex - 1]["Date"] = GetReadText(_Collection[0].Value);
System.Text.RegularExpressions.Regex _RegexFrom = new System.Text.RegularExpressions.Regex(@"(?<=From: ).*?(\r\n)+");
System.Text.RegularExpressions.MatchCollection _CollectionForm = _RegexFrom.Matches(_Value);
if (_CollectionForm.Count != 0)
MailDataTable.Rows[m_TOPIndex - 1]["Form"] =
GetReadText(_CollectionForm[0].Value);
System.Text.RegularExpressions.Regex _RegexTo = new System.Text.RegularExpressions.Regex(@"(?<=To: ).*?(\r\n)+");
System.Text.RegularExpressions.MatchCollection _CollectionTo = _RegexTo.Matches(_Value);
if (_CollectionTo.Count != 0)
MailDataTable.Rows[m_TOPIndex - 1]["To"] = GetReadText(_CollectionTo[0].Value);
System.Text.RegularExpressions.Regex _RegexSubject = new System.Text.RegularExpressions.Regex(@"(?<=Subject: ).*?(\r\n)+");
System.Text.RegularExpressions.MatchCollection _CollectionSubject = _RegexSubject.Matches(_Value);
if (_CollectionSubject.Count != 0) MailDataTable.Rows[m_TOPIndex - 1]["Subject"] =
GetReadText(_CollectionSubject[0].Value);
m_TOPIndex++;
m_SendMessage--;
ReadEnd = true;
if (m_TOPIndex > MailDataTable.Rows.Count)
{
ReturnEnd = true;
return
System.Text.Encoding.ASCII.GetBytes("QUIT");
}
else
{
return System.Text.Encoding.ASCII.GetBytes("TOP "
+ m_TOPIndex.ToString() + "\r\n");
}
case 6:
break;
}
}
Error = _Value;
ReturnEnd = true;
return new byte[0];
}
///
/// 转换文字里的字符集
///
///
///
public string GetReadText(string p_Text)
{
System.Text.RegularExpressions.Regex _Regex = new System.Text.RegularExpressions.Regex(@"(?<=\=\?).*?(?=\?\=)+");
System.Text.RegularExpressions.MatchCollection _Collection = _Regex.Matches(p_Text);
string _Text = p_Text;
foreach (System.Text.RegularExpressions.Match _Match in _Collection)
{
string _Value = "=?" + _Match.Value + "?=";
if (_Value[0] == '=')
{
string[] _BaseData = _Value.Split('?');
if (_BaseData.Length == 5)
{
System.Text.Encoding _Coding = System.Text.Encoding.GetEncoding(_BaseData[1]);
_Text = _Text.Replace(_Value, _Coding.GetString(Convert.FromBase64String(_BaseData[3])));
}
}
else
{
}
}
return _Text;
}
}
///
/// 连接事件
///
///
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);
}
///
/// 连接事件
///
///
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);
}
///
/// 连接事件
///
///
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);
}
///
/// 获取知道获取到. 否则一直获取数据
///
///
///
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();
}
return _Stream.ToArray();
}
}
}