C#_收邮件

用visual c#实现邮件接收程序_邮件服务器

本文通过运用C#来实现一个基于POP3协议的邮件接收程序来向大家展示C#网络编程的功能强大,同时也向大家介绍一下基于POP3协议的电子邮件接收原理。

  首先我向大家介绍邮件接收的基本原理:

  一开始便是客户端与服务器的连接。不过,在客户端连接到服务器之前,注意把端口设为POP3协议默认的110号。

  客户端连接服务器成功后,服务器会返回以下信息:

  +OK……

  字符+OK是POP3协议的返回信息。它的回应信息不像SMTP协议那样用丰富多变的数字表示,只有两个:+OK或者-ERR。其中,+OK表示连接成功,而-ERR则表示连接失败。

  接下来,客户端输入USER
<用户名>

  该命令告诉服务器你的用户名。注意,有些服务器会区分大小写字母的。

  服务器返回+OK后,客户端输入PASS
<口令>

  服务器返回+OK后,还返回一些邮箱的统计信息,比如:+OK 1 message(s) [1304
byte(s)]
不同的服务器返回的信息格式不太一样,所以我们可以用STAT命令来查看邮箱的情况。STAT命令的回应中有两个数字,分别表示邮件的数量和邮件的大小。

  如果信箱里有信,就可以用RETR命令来获取邮件的正文。RETR命令的格式为:

  RETR
<邮件编号>

  如果返回结果第一行是+OK信息,则表示成功。第二行起便是邮件的正文。最后一行和SMTP协议一样,是一个单独的英文句号,表示邮件的结尾部分。

  把邮件存储起来后要用DELE命令删除邮箱中的邮件,否则原有的邮件会继续保留在服务器上,一旦邮件一多,你的邮箱就爆了。DELE命令的格式为:

  DELE
<邮件编号>

  如果删错了,可以用RSET命令来恢复所有已被删除的邮件。条件是你还没有退出,一旦退出,那就一切Bye
Bye了。全部完成以后,输入QUIT命令就可以退出POP3服务器了。

  以上,我简要地向大家介绍了POP3邮件接收的基本过程和原理,下面就是一个运用上面的原理实现的简易的邮件接收程序。在本程序中,我主要用到了两个类:TcpClient类和NetworkStream类。TcpClient类是运用C#进行网络编程的一个非常重要的类,它提供了通过网络连接、发送和接收数据的简单方法,从而实现了网络编程的大大简化。NetworkStream类实现通过网络套接字发送和接收数据的标准.Net框架流机制,它支持对网络数据流的同步和异步访问,是实现网络通讯的重要组成部分。在这里我先给出程序最终的运行效果,图示如下:


          图1

  具体的过程步骤如下:

  第一步:打开VS.Net,新建一个工程,在项目类型里选择"Visual
C#项目",在模板里选择"Windows
应用程序",工程名不妨为"MailReceiver",最后点击"确定"按钮。

  第二步:布置主界面。先往窗体上添加如下控件:六个Label控件、四个TextBox控件、一个RichTextBox控件、一个CheckBox控件、一个ListBox控件以及三个Button控件。各个控件的属性设置如图1所示。

  在设置完图1的各个控件属性后,对主窗体进行合理的布局,则可得到最终的界面示意图如下所示:


            图2

  第三步:代码编写。首先因为程序中运用到网络编程的一些重要的类,如:TcpClient、NetworkStream,所以在程序的开头处需添加以下名字空间(Namespace):

using System.Net;
using System.Net.Sockets;
using
System.IO;

  接着,为我们的类添加以下一些公有的数据成员:

public TcpClient Server;
public NetworkStream NetStrm;
public
StreamReader RdStrm;
public string Data;
public byte[] szData;
public
string CRLF =
"\r\n";

  最后,便是三个按钮的消息响应函数,这三个函数是程序的主体部分。其中Connect按钮的消息响应函数完成了到POP3服务器的连接工作,并根据用户名和密码进行登录。如果一切顺利,则再向服务器发送STAT命令从而获得邮箱中邮件的相关信息:邮件数量和大小,最终完成连接。其函数实现如下:

private void Connect_Click(object sender, System.EventArgs
e)
{
//将光标置为等待状态
Cursor cr = Cursor.Current;
Cursor.Current =
Cursors.WaitCursor;

//用110端口新建POP3服务器连接
Server = new
TcpClient(PopServer.Text,110);

Status.Items.Clear();

try
{
//初始化
NetStrm =
Server.GetStream();
RdStrm= new
StreamReader(Server.GetStream());
Status.Items.Add(RdStrm.ReadLine());

//登录服务器过程
Data
= "USER "+ Username.Text+CRLF;
szData =
System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData,0,szData.Length);
Status.Items.Add(RdStrm.ReadLine());

Data
= "PASS "+ Password.Text+CRLF;
szData =
System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData,0,szData.Length);
Status.Items.Add(RdStrm.ReadLine());

//向服务器发送STAT命令,从而取得邮箱的相关信息:邮件数量和大小
Data
= "STAT"+CRLF;
szData =
System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData,0,szData.Length);
Status.Items.Add(RdStrm.ReadLine());

//改变按钮的状态
Connect.Enabled
= false;
Disconnect.Enabled = true;
Retrieve.Enabled =
true;

//将光标置回原来的状态
Cursor.Current =
cr;

}
catch(InvalidOperationException
err)
{
Status.Items.Add("Error:
"+err.ToString());
}
}

  而Disconnect按钮的消息响应函数则通过向服务器发送QUIT命令来终止和邮件服务器的连接,实现比较简单,具体函数如下:

private void Disconnect_Click(object sender, System.EventArgs
e)
{
//将光标置为等待状态
Cursor cr = Cursor.Current;
Cursor.Current =
Cursors.WaitCursor;

//向服务器发送QUIT命令从而结束和POP3服务器的会话
Data = "QUIT"+CRLF;

szData =
System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData,0,szData.Length);
Status.Items.Add(RdStrm.ReadLine());

//断开连接
NetStrm.Close();
RdStrm.Close();

//改变按钮的状态
Connect.Enabled
= true;
Disconnect.Enabled = false;
Retrieve.Enabled =
false;

//将光标置回原来的状态
Cursor.Current =
cr;
}

  最后,Retrieve按钮的消息响应函数则根据用户在邮件编号文本框中的输入来取得相应的邮件,它向服务器发送的命令为RETR,并根据返回的信息判断邮件的有无。若返回信息的第一个字符为"+",则表示+OK,也即成功;若为"-",则表示-ERR,也即为失败。在成功的情况下,若用户选择了"在邮件服务器上保留备份",则收取邮件后不删除服务器上的备份,否则用DELE命令来进行相应的删除。函数实现如下:

private void Retrieve_Click(object sender, System.EventArgs
e)
{
//将光标置为等待状态
Cursor cr = Cursor.Current;
Cursor.Current =
Cursors.WaitCursor;
string szTemp;

Message.Clear();

try
{
//根据邮件编号从服务器获得相应邮件
Data = "RETR "+
MailNum.Text+CRLF;
szData =
System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData,0,szData.Length);
szTemp
= RdStrm.ReadLine();

if(szTemp[0]!=-)

{
//不断地读取邮件内容,只到结束标志:英文句号
while(szTemp!=".")
{
Message.Text +=
szTemp;
szTemp =
RdStrm.ReadLine();
}

//若BackupChBox未选中,则收取邮件后,删除保留在服务器上的邮件
if(BackupChBox.Checked
== false)
{
Data = "DELE" + MailNum.Text + CRLF;
szData =
System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData,0,szData.Length);
Status.Items.Add(RdStrm.ReadLine());
}
}
else
{
Status.Items.Add(szTemp);
}

//将光标置回原来的状态
Cursor.Current
= cr;
}

catch(InvalidOperationException
err)
{
Status.Items.Add("Error:
"+err.ToString());
}
}

  最后一步便是保存你的劳动成果,再进行编译、建立并运行了,最终的图示我已经在文章的开头处给出了,还行吧。

  到处为止,我们已经完成了POP3邮件接收程序的全部工作了。从中,我们不难发现运用C#完成一些网络实用编程是非常容易的。只要我们掌握了其中的原理,具体的编程工作就变得非常的轻松而且有条理。即使以前你对POP3邮件接收的实现一无所知,我想在看完这篇文章后,你对它至少会有了个大概的了解。不过,还要指出的是这只是一个很简单的实例,如果要在实际中应用,则还需大大的改进,有兴趣的读者不妨一试。,

文章整理:西部数码--专业提供域名注册虚拟主机服务

时间: 2024-10-11 02:00:29

C#_收邮件的相关文章

Gmail邮件功能那么强大,GMail被封,在国内怎么用gmail收邮件?

IT圈子里最热门的话题一定是:gmail被封,该怎么办?gmail由于强大的邮件功能,ITer一定是人手一个or多个,之前想要收发gmail使用imap或SMTP方式是可以在国内正常使用的,目前imap和smtp方式在国内都已经不能完全正常的使用,给我们的生活带来了极大的不便.那么,我们如何在国内正常使用gmail收发邮件呢? 一想到谷歌的一系列服务,那么必然想到的就是vpn代理,没有vpn代理要想在国内顺畅的使用google几乎是不可能的. 之前我们一直可以使用例如Foxmail.qq邮箱.1

为什么起床后不能收邮件?

为什么起床后不能收邮件? 为什么起床后不能收邮件? 作者: 阮一峰 每天早晨打开电脑,你首先做什么? 我的习惯一直是收邮件.当我读到下面这篇文章,才震惊地发现,这样做是十分错误的,反映了我控制行为的能力十分低下. 这真是惨痛的教训,为了引以为鉴,我把全文翻译了出来,希望别的朋友不要再犯同样的错误. ========================================== 为什么起床后不能收邮件? 作者:Sid Savara 译者:阮一峰 原文网址:http://sidsavara.c

桌面支持--新收邮件看不到(在search folders新建一个unread mail)

新收邮件看不到(在search folders新建一个unread mail)

认真对待 Python3 收邮件

前言 准备 初体验 试水 划水 蹚水 潜水 拓展 前言 之前老是用Python发邮件,用起来挺方便的.但是一直没实现用Python收邮件,最近忙着笔试面试,但是又不能时刻打开浏览器,刷手机看看有没有新邮件(尤其是有没有关于面试,笔试通知的邮件)啊.所以写个脚本来做下定时任务,一旦有相关的主题邮件,结合GUI控件,声音组件,给出提醒. 想来还是不错的. 收邮件其实是被Python内置支持的,名为poplib.安装了Python的话,就会默认存在于标准库中,用起来也很方便.下面就一步步的来实现今天的

Ubuntu使用fetchmail+procmail收邮件

Ubuntu使用fetchmail+procmail收邮件: $ sudo apt-get install fetchmail$ sudo apt-get install procmail $ cp -rv /usr/share/doc/fetchmail/examples/fetchmailrc.example ~/.fetchmailrc$ vi ~/.fetchmailrc (最后添加) poll pop.126.com with protocol pop3username "[email

C#_发邮件详解

//发送人 var from = this.txtSendMailFrom.Text.Trim(); //收件人 var to = this.txtMailSendTo.Text.Trim(); //标题 var title = this.txtSendTitle.Text.Trim(); //内容 var info = this.txtInfo.Text.Trim(); var msg = new MailMessage(); //正文或内容 msg.Body = info; //发送网站 /

C#收邮件

用visual c#实现邮件接收程序_邮件服务器 本文通过运用C#来实现一个基于POP3协议的邮件接收程序来向大家展示C#网络编程的功能强大,同时也向大家介绍一下基于POP3协议的电子邮件接收原理. 首先我向大家介绍邮件接收的基本原理: 一开始便是客户端与服务器的连接.不过,在客户端连接到服务器之前,注意把端口设为POP3协议默认的110号. 客户端连接服务器成功后,服务器会返回以下信息: +OK…… 字符+OK是POP3协议的返回信息.它的回应信息不像SMTP协议那样用丰富多变的数字表示,只有

PHP收邮件receiveMail

用PHP来发邮件,相信大家都不陌生,但读取收件箱的话,接触就少了,这次总结下自己的经验,希望可以帮助大家. 注意:1.PHP读取收件箱主要是利用imap扩展,所以在使用以下方法前,必须开启imap扩展模块的支持. 2.此方法支持中文,不会乱码,需要保持所有文件的编码的一致性 1.文件结构 2.邮件类 ./mailreceived/receiveMail.class.php ./mailreceived/receiveMail.class.php 文件内容如下: <?php // Main Rec

JavaMail接、收邮件

我总算把这个研究出来啦.... 不要觉得 代码有点多哈. 我们先来说发送邮箱吧,首先建立一个属性文件*.properties sys.properties server=smtp.163.com ## [qq server is:smtp.qq.com OR 163eamil server is:smtp.163.com] authUser=**.com authPasswd=** ## 我建立了一个发送邮件的类: 贴上我的所有源码,毫不保留: package international.doc