C#通过POP3获取邮件的代码(正文和附件)

使用方法:
获取第1封邮件


代码如下:

Zgke.Net.POP3 _Popt = new Zgke.Net.POP3("192.168.0.1", 110);
DataTable _Mail = _Popt.GetMail("zk", "zk", 1);

返回DataTable 数据内容为
Type为类型 Text为文字 如果是附件 为byte[] Name 如果是附件里存放的为文件名
 
下面是全部的类


代码如下:

using System;
using System.Net.Sockets;
using System.Net;
using System.Security.Cryptography;
using System.IO;
using System.Data;

namespace Zgke.Net
{

/// <summary>
/// 获取邮件的类
/// zgke@sina.com
/// qq:116149
/// </summary>
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;
}

/// <summary>
/// 获取Mail列表
/// </summary>
/// <param name="p_Name">用户名</param>
/// <param name="p_PassWord">密码</param>
/// <returns>Mail信息</returns>
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;
}

/// <summary>
/// 获取邮件内容
/// </summary>
/// <param name="p_Name">名称</param>
/// <param name="p_PassWord">密码</param>
/// <param name="p_MailIndex">邮件编号</param>
/// <returns>数据集</returns>
public DataTable GetMail(string p_Name, string p_PassWord, int p_MailIndex)
{
POP3Client _Client = new POP3Client();
_Client.UserName = p_Name;
_Client.PassWord = p_PassWord;
_Client.Client = new TcpClient();
_Client.ReadIndex = p_MailIndex;
_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.MailTable;
}

private class POP3Client
{
public TcpClient Client;

public string UserName = "";

public string PassWord = "";

public bool ReturnEnd = false;

public DataTable MailDataTable = new DataTable();

public DataTable MailTable = new DataTable();

public string Error = "";

public bool ReadEnd = false;

public int ReadIndex = -1;

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");

MailTable.Columns.Add("Type",typeof(string));
MailTable.Columns.Add("Text",typeof(object));
MailTable.Columns.Add("Name", typeof(string));
}

private int m_SendMessage = 0;
private int m_TOPIndex = 1;

/// <summary>
/// 获取下一个登陆到获取列表需要的命令
/// </summary>
/// <param name="p_Value"></param>
/// <returns></returns>
public byte[] GetSendBytes(byte[] p_Value)
{
ReadEnd = false;
string _Value = System.Text.Encoding.Default.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;
if (ReadIndex != -1)
{
m_SendMessage = 5;
return System.Text.Encoding.ASCII.GetBytes("RETR " + ReadIndex.ToString() + "\r\n");
}
else
{
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:
GetMailText(_Value);
ReturnEnd = true;
return System.Text.Encoding.ASCII.GetBytes("QUIT");

}
}
Error = _Value;
ReturnEnd = true;
return new byte[0];
}

/// <summary>
/// 转换文字里的字符集
/// </summary>
/// <param name="p_Text"></param>
/// <returns></returns>
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;
}

#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;
}
}

/// <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();
}
}

}
}

(0)

相关推荐

  • C#使用windows服务发送邮件

    最近做了一个使用 C# 写了一个发送邮件的windows 服务,在这里记录一下. 首先使用 Visual Studio 2015 创建一个 windows 服务项目. 然后在设计器上面右击添加安装程序.如下图. 安装好后,选择安装程序设计界面,选择服务和安装程序右击选择属性修改一些属性值. PS:如果不给服务添加安装程序,后面是没法把服务安装至 windows 系统里的. 在数据库创建一个表,用于存储需要发送的邮件信息. create table MainInfo ( MainInfoID in

  • C#实现发送邮件的三种方法

    本文实例讲述了C#实现发送邮件的三种方法.分享给大家供大家参考.具体方法分析如下: 一.问题: 最近公司由于一个R&I项目的需要,用户要求在购买产品或出货等一些环节,需要发送邮件提醒或者说每周一让系统自动采集数据发送一封E-mail,因此我也就找来相关资料,写了一个Demo分享给大家,大家共同学习学习. 二.实现代码: 通过.Net FrameWork 2.0下提供的"System.Net.Mail"可以轻松的实现,本文列举了3种途径来发送: 1.通过Localhost: 2.

  • c#实现服务器性能监控并发送邮件保存日志

    客户端代码 复制代码 代码如下: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Diagnostics;using System.ServiceProcess;using System.Text;using System.Threading;using System.Management;using System.Configurat

  • C# 邮件发送和接收实现代码

    邮件发送 方法一:使用System.Web.Mail命名空间(此方法我测试没有成功过)  复制代码 代码如下: #region 发送邮件:此方法失败 protected void SendFailed() { System.Web.Mail.MailMessage mail = new System.Web.Mail.MailMessage(); mail.From = "test@ gmail.com"; mail.To = " test@ gmail.com "

  • C# 邮件地址是否合法的验证

    复制代码 代码如下: /// <summary> /// 检测输入的邮件地址strEmail是否合法,非法则返回true. /// </summary> public bool CheckEmail(string strEmail) { int i, j; string strTmp, strResult; string strWords = "abcdefghijklmnopqrstuvwxyz_-.0123456789"; //定义合法字符范围 bool b

  • c#调用qq邮箱smtp发送邮件修改版代码分享

    复制代码 代码如下: try            {                MailMessage mm = new MailMessage();                MailAddress Fromma = new MailAddress("xxxx@qq.com");                MailAddress Toma = new MailAddress("MMMMMMM@qq.com", null);              

  • C#实现SMTP邮件发送程序实例

    通常来说邮件发送功能在网站应用程序中经常会用到,包括大家经常看到的博客,在添加评论后,系统会自动发送邮件通知到我邮箱的,把系统发送邮件的功能整理了下,本文展示了一个客户端Demo,希望对有需要的朋友有所帮助.运行效果如下图所示: 核心代码如下: 复制代码 代码如下: using System; using System.Net; using System.Net.Mail; using System.Text; namespace HC.Email {     /// <summary>   

  • C#使用MailAddress类发送html格式邮件的实例代码

    1.首先引入命名空间using System.Net.Mail;2.将发送的邮件的功能封装成一个类,该类中包含了发送邮件的基本功能:收件人(多人),抄送(多人),发送人,主题,邮件正文,附件等,封装的Email类如下: 复制代码 代码如下: public class Email    {        /// <summary>        /// 发送者        /// </summary>        public string mailFrom { get; set

  • C#.NET采用HTML模板发送电子邮件完整实例

    本文实例讲述了C#.NET采用HTML模板发送电子邮件的方法,是非常实用的技巧.分享给大家供大家参考.具体方法如下: 要使用html模板进行发送邮件,需要准备以下几项工作: 1)HTML模板 2)替换函数(替换模板中绑定的变量) 3)邮件函数(发送邮件) 一.HTML模板 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtm

  • C#中发送邮件代码

    始找的代码只能发送无SMTP验证的邮件,但现在很多EMAIL发送时都需要验证,后来查找了下MSDN的帮助,找到了发送验证的代码,贴出来希望对大家有所帮助! 复制代码 代码如下: public static int sendmail(string to, string body,string subject) { try { int nContain = 0; ///添加发件人地址 string from = "你的发送EMAIL"; MailMessage mailMsg = new

随机推荐