`
hududanyzd
  • 浏览: 815530 次
文章分类
社区版块
存档分类
最新评论

C#接收电子邮件

 
阅读更多

/////////////////////////////////////////////

// 类名:Pop3 //

// 功能:接收电子邮件 //

/////////////////////////////////////////////

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


namespace ZTSX.Email
{
/// <summary>
/// Pop3 的摘要说明。
/// </summary>
public class Pop3
{
private string mstrHost= null;//主机名称或IP地址
private int mintPort= 110;//主机的端口号(默认为110)
private TcpClient mtcpClient= null;//客户端
private NetworkStream mnetStream= null;//网络基础数据流
private StreamReader m_stmReader= null;//读取字节流
private string mstrStatMessage= null;//执行STAT命令后得到的消息(从中得到邮件数)

/// <summary>
/// 构造函数
/// </summary>
/// <remarks>一个邮件接收对象</remarks>
public Pop3()
{
}

/// <summary>
/// 构造函数
/// </summary>
/// <param name="host">主机名称或IP地址</param>
public Pop3(string host)
{
mstrHost = host;
}

/// <summary>
/// 构造函数
/// </summary>
/// <param name="host">主机名称或IP地址</param>
/// <param name="port">主机的端口号</param>
/// <remarks>一个邮件接收对象</remarks>
public Pop3(string host,int port)
{
mstrHost = host;
mintPort = port;
}

#region属性

/// <summary>
/// 主机名称或IP地址
/// </summary>
/// <remarks>主机名称或IP地址</remarks>
public string HostName
{
get{return mstrHost;}
set{mstrHost = value;}
}

/// <summary>
/// 主机的端口号
/// </summary>
/// <remarks>主机的端口号</remarks>
public int Port
{
get{return mintPort;}
set{mintPort = value;}
}

#endregion

#region 私有方法

/// <summary>
/// 向网络访问的基础数据流中写数据(发送命令码)
/// </summary>
/// <param name="netStream">可以用于网络访问的基础数据流</param>
/// <param name="command">命令行</param>
/// <remarks>向网络访问的基础数据流中写数据(发送命令码)</remarks>
private void WriteToNetStream(ref NetworkStream netStream,String command)
{
string strToSend = command + "/r/n";
byte[] arrayToSend = System.Text.Encoding.ASCII.GetBytes(strToSend.ToCharArray());
netStream.Write(arrayToSend,0,arrayToSend.Length);
}

/// <summary>
/// 检查命令行结果是否正确
/// </summary>
/// <param name="message">命令行的执行结果</param>
/// <param name="check">正确标志</param>
/// <returns>
/// 类型:布尔
/// 内容:true表示没有错误,false为有错误
/// </returns>
/// <remarks>检查命令行结果是否有错误</remarks>
private bool CheckCorrect(string message,string check)
{
if(message.IndexOf(check) == -1)
return false;
else
return true;
}

/// <summary>
/// 邮箱中的未读邮件数
/// </summary>
/// <param name="message">执行完LIST命令后的结果</param>
/// <returns>
/// 类型:整型
/// 内容:邮箱中的未读邮件数
/// </returns>
/// <remarks>邮箱中的未读邮件数</remarks>
private int GetMailNumber(string message)
{
string[] strMessage = message.Split(' ');
return Int32.Parse(strMessage[1]);
}

/// <summary>
/// 得到经过解码后的邮件的内容
/// </summary>
/// <param name="encodingContent">解码前的邮件的内容</param>
/// <returns>
/// 类型:字符串
/// 内容:解码后的邮件的内容
/// </returns>
/// <remarks>得到解码后的邮件的内容</remarks>
private string GetDecodeMailContent(string encodingContent)
{
string strContent = encodingContent.Trim();
string strEncode = null;

int iStart = strContent.IndexOf("Base64");
if(iStart == -1)
throw new Pop3Exception("邮件内容不是Base64编码,请检查");
else
{
strEncode = strContent.Substring(iStart + 6,strContent.Length - iStart - 6);
try
{
return SX.Encode.TransformToString(strEncode);
}
catch(SX.EncodeException exc)
{
throw new Pop3Exception(exc.Message);
}
}
}

#endregion

/// <summary>
/// 与主机建立连接
/// </summary>
/// <returns>
/// 类型:布尔
/// 内容:连接结果(true为连接成功,false为连接失败)
/// </returns>
/// <remarks>与主机建立连接</remarks>
public bool Connect()
{
if(mstrHost == null)
throw new Exception("请提供SMTP主机名称或IP地址!");
if(mintPort == 0)
throw new Exception("请提供SMTP主机的端口号");
try
{
mtcpClient = new TcpClient(mstrHost,mintPort);
mnetStream = mtcpClient.GetStream();
m_stmReader = new StreamReader(mtcpClient.GetStream());

string strMessage = m_stmReader.ReadLine();
if(CheckCorrect(strMessage,"+OK") == true)
return true;
else
return false;
}
catch(SocketException exc)
{
throw new Pop3Exception(exc.ToString());
}
catch(NullReferenceException exc)
{
throw new Pop3Exception(exc.ToString());
}
}

#region Pop3命令

/// <summary>
/// 执行Pop3命令,并检查执行的结果
/// </summary>
/// <param name="command">Pop3命令行</param>
/// <returns>
/// 类型:字符串
/// 内容:Pop3命令的执行结果
/// </returns>
private string ExecuteCommand(string command)
{
string strMessage = null;//执行Pop3命令后返回的消息

try
{
//发送命令
WriteToNetStream(ref mnetStream,command);

//读取多行
if(command.Substring(0,4).Equals("LIST") || command.Substring(0,4).Equals("RETR") || command.Substring(0,4).Equals("UIDL"))//记录STAT后的消息(其中包含邮件数)
{
strMessage = ReadMultiLine();

if(command.Equals("LIST"))//记录LIST后的消息(其中包含邮件数)
mstrStatMessage = strMessage;
}
//读取单行
else
strMessage = m_stmReader.ReadLine();

//判断执行结果是否正确
if(CheckCorrect(strMessage,"+OK"))
return strMessage;
else
return "Error";
}
catch(IOException exc)
{
throw new Pop3Exception(exc.ToString());
}
}

/// <summary>
/// 在Pop3命令中,LIST、RETR和UIDL命令的结果要返回多行,以点号(.)结尾,
/// 所以如果想得到正确的结果,必须读取多行
/// </summary>
/// <returns>
/// 类型:字符串
/// 内容:执行Pop3命令后的结果
/// </returns>
private string ReadMultiLine()
{
string strMessage = m_stmReader.ReadLine();
string strTemp = null;
while(strMessage != ".")
{
strTemp = strTemp + strMessage;
strMessage = m_stmReader.ReadLine();
}
return strTemp;
}

//USER命令
private string USER(string user)
{
return ExecuteCommand("USER " + user) + "/r/n";
}

//PASS命令
private string PASS(string password)
{
return ExecuteCommand("PASS " + password) + "/r/n";
}

//LIST命令
private string LIST()
{
return ExecuteCommand("LIST") + "/r/n";
}

//UIDL命令
private string UIDL()
{
return ExecuteCommand("UIDL") + "/r/n";
}

//NOOP命令
private string NOOP()
{
return ExecuteCommand("NOOP") + "/r/n";
}

//STAT命令
private string STAT()
{
return ExecuteCommand("STAT") + "/r/n";
}

//RETR命令
private string RETR(int number)
{
return ExecuteCommand("RETR " + number.ToString()) + "/r/n";
}

//DELE命令
private string DELE(int number)
{
return ExecuteCommand("DELE " + number.ToString()) + "/r/n";
}

//QUIT命令
private void Quit()
{
WriteToNetStream(ref mnetStream,"QUIT");
}

/// <summary>
/// 收取邮件
/// </summary>
/// <param name="user">用户名</param>
/// <param name="password">口令</param>
/// <returns>
/// 类型:字符串数组
/// 内容:解码前的邮件内容
/// </returns>
private string[] ReceiveMail(string user,string password)
{
int iMailNumber = 0;//邮件数

if(USER(user).Equals("Error"))
throw new Pop3Exception("用户名不正确!");
if(PASS(password).Equals("Error"))
throw new Pop3Exception("用户口令不正确!");
if(STAT().Equals("Error"))
throw new Pop3Exception("准备接收邮件时发生错误!");
if(LIST().Equals("Error"))
throw new Pop3Exception("得到邮件列表时发生错误!");

try
{
iMailNumber = GetMailNumber(mstrStatMessage);

//没有新邮件
if(iMailNumber == 0)
return null;
else
{
string[] strMailContent = new string[iMailNumber];

for(int i = 1 ; i <= iMailNumber ; i++)
{
//读取邮件内容
strMailContent[i - 1] = GetDecodeMailContent(RETR(i));
}
return strMailContent;
}
}
catch(Pop3Exception exc)
{
throw new Pop3Exception(exc.ToString());
}
}

#endregion


/// <summary>
/// 收取邮件
/// </summary>
/// <param name="user">用户名</param>
/// <param name="password">口令</param>
/// <returns>
/// 类型:字符串数组
/// 内容:解码前的邮件内容
/// </returns>
///<remarks>收取邮箱中的未读邮件</remarks>
public string[] Receive(string user,string password)
{
try
{
return ReceiveMail(user,password);
}
catch(Pop3Exception exc)
{
throw new Pop3Exception(exc.ToString());
}
}

/// <summary>
/// 断开所有与服务器的会话
/// </summary>
/// <remarks>断开所有与服务器的会话</remarks>
public void DisConnect()
{
try
{
Quit();
if(m_stmReader != null)
m_stmReader.Close();
if(mnetStream != null)
mnetStream.Close();
if(mtcpClient != null)
mtcpClient.Close();
}
catch(SocketException exc)
{
throw new Pop3Exception(exc.ToString());
}
}

/// <summary>
/// 删除邮件
/// </summary>
/// <param name="number">邮件号</param>
public void DeleteMail(int number)
{
//删除邮件
int iMailNumber = number + 1;
if(DELE(iMailNumber).Equals("Error"))
throw new Pop3Exception("删除第" + iMailNumber.ToString() + "时出现错误!");
}

}
}
分享到:
评论

相关推荐

    c#电子邮件收发系统

    在本项目中,我们探讨的是一个基于C#构建的电子邮件收发系统,它与SQL数据库相结合,提供了高效且稳定的邮件处理功能。 首先,C#电子邮件收发系统的实现依赖于.NET Framework或.NET Core中的System.Net.Mail命名...

    C# winfrom电子邮件源码

    电子邮件系统通常基于SMTP(Simple Mail Transfer Protocol)用于发送邮件,而IMAP(Internet Message Access Protocol)或POP3(Post Office Protocol version 3)用于接收邮件。在C#中,我们可以使用System.Net....

    c# HotMail收发邮件

    1. **SMTP协议**:SMTP是互联网上用于发送电子邮件的标准协议。在C#中,可以使用`System.Net.Mail`命名空间中的`SmtpClient`类来实现SMTP服务。开发者需要设置SMTP服务器地址、端口号、用户名、密码以及是否启用SSL/...

    c#接收邮件 c#接收邮件

    POP3(Post Office Protocol version 3)是一种简单但功能强大的协议,用于从邮件服务器下载电子邮件。在C#中,我们可以利用System.Net.Mail命名空间中的类来实现这一功能。首先,我们需要了解几个关键概念: 1. **...

    C#使用Pop3接收邮件(可接收163,QQ邮箱等)

    本篇文章将深入探讨如何使用C#通过POP3协议来接收电子邮件,以实现从163、QQ等主流邮箱服务接收邮件的功能。首先,我们要明白POP3(Post Office Protocol version 3)是一种标准的邮件接收协议,它允许用户从邮件...

    c# 电子邮件源码 c# 电子邮件源码

    在C#编程中,发送电子邮件是一项常见的任务,用于在应用程序中实现邮件通信功能。C#提供了System.Net.Mail命名空间,该命名空间包含了处理电子邮件发送的所有类和方法。本篇文章将详细解析C#发送电子邮件的源码及其...

    毕业设计,基于C#+Winform开发的电子邮件收发系统,内含完整源代码,数据库,毕业论文

    毕业设计,基于C#+Winform开发的电子邮件收发系统,内含完整源代码,数据库,毕业论文 电子邮件作为互联网中交换信息广泛的通信工具之一,如今都已被广大用户接受。早期的电子邮件只是从一个计算机终端向另外一个...

    C# 使用 MailKit 接收邮件

    MailKit 是一个开源的 C# 邮件处理库,用于在应用程序中发送和接收电子邮件。它提供了一个强大且易于使用的 API,支持多种邮件协议,包括 SMTP、POP3、和 IMAP。 MailKit 是一个开源的 C# 邮件处理库,用于在应用...

    C#收发邮件系统完整版

    C#收发邮件系统是一个基于C#编程语言开发的、用于处理电子邮件的软件应用。它包含两个主要组件:一个用于接收邮件的POP3客户端程序,另一个是用于发送邮件的SMTP客户端程序。这样的系统通常用于自动化邮件处理,例如...

    收取电子邮件的C#程序源码(邮件客户端

    标题中的“收取电子邮件的C#程序源码(邮件客户端”指的是使用C#编程语言开发的,用于接收电子邮件的客户端应用程序。这种程序允许用户通过代码直接与邮件服务器交互,获取、下载或管理邮件,而无需使用传统的图形...

    C#做的电子邮件收发模块

    本项目涉及的是利用C#实现电子邮件的收发功能,这是一个基础且实用的技能,对于开发企业级应用或者个人工具软件至关重要。下面将详细阐述这个模块涉及到的关键知识点。 1. **SMTP(Simple Mail Transfer Protocol)...

    C# pop接收邮件

    POP(Post Office Protocol)是一种用于从邮件服务器检索电子邮件的协议。它允许用户下载邮件到本地设备,并且通常在下载后删除服务器上的邮件。C#中的System.Net.Mail命名空间提供了对邮件操作的支持,包括使用POP3...

    C#发送接收邮件网页资料汇总

    发送和接收电子邮件是许多应用程序的基本功能之一,对于开发者来说,理解这一过程及其背后的协议至关重要。以下是对C#中邮件收发相关知识的详细解释。 一、电子邮件原理及协议 电子邮件的工作原理可以类比于传统的...

    C# 电子邮件接收程序设计与实现

    在C#编程环境中,开发一个电子邮件接收程序涉及多个关键知识点,包括网络通信、邮件协议、对象模型以及异步处理。本项目"邮件接收程序设计与实现"提供了完整的邮件收发功能,非常适合用作课程设计实践。 首先,我们...

    C#获取邮箱邮件及附件

    POP3是Internet上接收电子邮件的一种标准协议,它允许用户从邮件服务器下载邮件。C#提供了System.Net.Mail命名空间,通过这个命名空间,我们可以方便地实现邮件的收发功能。下面我们将深入探讨如何使用C#与POP3协议...

    电子邮件客户端软件c#

    电子邮件客户端软件是用于收发电子邮件的应用程序,通常与Internet服务提供商(ISP)的邮件服务器进行交互。在本项目中,我们关注的是一个使用C#编程语言编写的电子邮件客户端软件。C#是一种面向对象的、现代的编程...

    C# 发邮件和POP3邮件接收程序

    本主题聚焦于使用C#进行电子邮件的发送与接收,主要涉及到SMTP(Simple Mail Transfer Protocol)服务和POP3(Post Office Protocol version 3)协议。 SMTP是用于发送电子邮件的标准协议,而POP3则用于从邮件...

    C#电子邮件接收程序设计与实现

    在本文中,我们将深入探讨如何使用C#语言设计和实现一个简单的电子邮件接收程序。C#是一种功能强大的编程语言,尤其适合构建Windows桌面应用程序和网络服务,包括处理电子邮件。电子邮件通信通常涉及SMTP(Simple ...

    C#邮件接收案例源码

    本案例聚焦于使用C#实现邮件接收功能,这对于开发需要处理电子邮件的应用来说至关重要。邮件接收通常涉及到IMAP(Internet Message Access Protocol)或POP3(Post Office Protocol version 3)协议,这些协议允许...

    C#制作的邮件收发器

    本项目"**C#制作的邮件收发器**"利用C#的强大功能,实现了电子邮件的发送和接收服务,这对于自动化任务、系统通知、数据同步等应用场景非常有用。 邮件收发服务通常基于SMTP(Simple Mail Transfer Protocol)和...

Global site tag (gtag.js) - Google Analytics