收取电子邮件

热卖产品:

收取电子邮件

实例说明

本实例制作了一个从服务器读取电子邮件的程序。运行程序,输入服务器的IP、电子邮箱名和邮箱密码,本实例电子邮箱名为”boy@163.com”,密码为”123456″,单击”登录”按钮,登录电子邮箱,并将该电子邮箱中的内容显示在RichTextBox控件中。运行结果如图1所示。


1 收取电子邮件

技术要点

实现本实例功能主要用到了System.Net.Sockets命名空间下的TcpClient类的GetStream方法、NetworkStream类的Write方法、System.IO命名空间下的StreamReader类的ReadLine方法、RichTextBox控件的AppendText方法和POP3协议。下面分别进行介绍。

(1)System.Net.Sockets命名空间

System.Net.Sockets命名空间为需要严密控制网络访问的开发人员提供了Windows Sockets (Winsock)接口的托管实现。

(2)TcpClient类

此类为TCP网络服务提供客户端连接、初始化TcpClient类的新实例并连接到指定主机上的指定端口。其语法格式如下:

public TcpClient (string hostname,int port)

参数说明如下。

l     hostname:要连接到的远程主机的DNS名。

l     Port:要连接到的远程主机的端口号。

(3)GetStream方法

此方法用于返回发送和接收数据的NetworkStream。其语法格式如下:

public NetworkStream GetStream ()

l     返回值:基础NetworkStream

(4)NetworkStream类

此类提供用于网络访问的基础数据流。其语法格式如下:

public NetworkStream (Socket socket)

参数说明如下。

l     socketNetworkStream中用来发送和接收数据的Socket

(5)Write方法

此方法将数据写入NetworkStream。其语法格式如下:

public override void Write (byte[] buffer,int offset,int size)

参数说明如下。

l     buffer:类型Byte的数组,该数组包含要写入NetworkStream的数据。

l     Offsetbuffer中开始写入数据的位置。

l     Size:要写入NetworkStream的字节数。

(6)System.IO命名空间

System.IO 命名空间包含允许读写文件和数据流的类型以及提供基本文件和目录支持的类型。

(7)StreamReader类

此类实现一个TextReader,使其以一种特定的编码从字节流中读取字符。

StreamReader类旨在以一种特定的编码输入字符,而Stream类用于字节的输入和输出。使用StreamReader类读取标准文本文件的各行信息。

(8)ReadLine方法

此方法从当前流中读取一行字符并将数据作为字符串返回。其语法格式如下:

public override string ReadLine ()

l     返回值:输入流中的下一行;如果到达了输入流的末尾,则为空引用。

(9)AppendText方法

此方法向文本框的当前文本追加文本。其语法格式如下:

public void AppendText(string text)

参数说明如下。

l     text:要向文本框的当前内容追加的文本。

(10)POP3协议

POP(Post Office Protocol—邮局协议)用于电子邮件的接收,现在常用第3版,所以称POP3。通过POP3协议,客户机登录到服务器后,可以对自己的邮件进行删除,或是下载到本地。表1为POP3协议的常用命令。

1 POP3协议常用命令

命  令

描  述

USER

此命令与下面的pass命令若都发送成功,将使状态转换

PASS

用户名所对应的密码

APOP

DigestMD5消息摘要

STAT

请求服务器发回关于邮箱统计资料(邮件总数和总字节数)

UIDL

回送邮件惟一标识符

LIST

回送邮件数量和每个邮件的大小

RETR

回送由参数标识的邮件的全部文本

DELE

服务器将由参数标识的邮件标记为删除,由QUIT命令执行

RSET

服务器将重置所有标记为删除的邮件,用于撤销DELE命令

TOP

服务器将回送由参数标识的邮件前n行内容,n是正整数

NOOP

服务器返回一个肯定的响应,不做任何操作

QUIT

退出

 

注意:POP服务器使用的端口号一般为110

实现过程

(1)新建一个Windows应用程序,将其命名为”收取电子邮件”,默认窗体为Form1。

(2)在Form1窗体中主要添加4个TextBox控件,分别用于输入服务器IP、邮箱名称和密码等信息;添加3个Button控件,用来执行登录邮箱、查看电子邮件和退出邮箱操作;添加一个RichTextBox控件,用于显示电子邮箱中的信息。

(3)主要程序代码。

登录邮箱的实现代码如下:

TcpClient server;                                            //接收服务器

string sendstring;                                            //用于存储POP3服务命令参数

byte[] bufferstring;                                        //用于存储POP3服务命令参数字节数

NetworkStream networkstream;                                //接收服务器与服务器进行数据交互

StreamReader streamreader;                                    //读取信息数据

private void button2_Click(object sender, EventArgs e)

{

    server = new TcpClient(this.textBox1.Text, 110);                //实例TcpClient 类对象连接服务器

networkstream = server.GetStream();                        //实例NetworkStream类对象接收返回发送的数据

    streamreader = new StreamReader(networkstream);            //实例StreamReader类对象读取数据

try

{

    sendstring = “USER “+this.textBox2.Text+”\r\n”;            //存储用户名

        bufferstring = Encoding.GetEncoding(“gb2312”).GetBytes(sendstring.ToCharArray());

networkstream.Write(bufferstring, 0, bufferstring.Length);     //将用户名发送到服务器

richTextBox1.AppendText(streamreader.ReadLine() + “\r\n”);     //将用用户显示在 richTextBox控件中

sendstring = “PASS ” + this.textBox3.Text + “\r\n”;        //存储用户密码

        bufferstring = Encoding.GetEncoding(“gb2312”).GetBytes(sendstring.ToCharArray());

networkstream.Write(bufferstring, 0, bufferstring.Length);        //将用户密码发送到服务器

richTextBox1.AppendText(streamreader.ReadLine() + “\r\n”);    //显示内容

sendstring = “STAT ” +”\r\n”;                            //储存从服务器获得所有信息序号和字节数命令

        bufferstring = Encoding.GetEncoding(“gb2312”).GetBytes(sendstring.ToCharArray());

networkstream.Write(bufferstring, 0, bufferstring.Length);     //从服务器获得所有信息序号和字节数

string strResult=streamreader.ReadLine();                    //读取从服务器返回的数据

if (strResult.IndexOf(‘-‘) == -1)

{

richTextBox1.AppendText(strResult + “\r\n”);

sendstring = “LIST ” + “\r\n”;                        //存储从服务器中获得信息列表和大小的命令

            bufferstring = Encoding.GetEncoding(“gb2312”).GetBytes(sendstring.ToCharArray());

networkstream.Write(bufferstring, 0, bufferstring.Length);    //读取内容

string strInfo = streamreader.ReadLine();            

string[] str = strInfo.Split(‘ ‘);                        

richTextBox1.AppendText(“邮件数量:” + str[1] + “\r\n”);    //显示邮件数量

            //显示邮件的总容量

richTextBox1.AppendText(str[1] + “:封邮件总容量为” + str[2] + “\r\n”);

MessageBox.Show(this.textBox2.Text + “用户您好!!!“);    //显示用户信息

this.groupBox1.Enabled = false;

button1.Enabled = true;

}

else

{

MessageBox.Show(“读取信息有误,请重新登录“);        //如果读取信息失败则弹出提示

}

}

catch (Exception ey)                                    //如果发生异常

{

MessageBox.Show(ey.Message);                        //显示异常

}

}

自定义方法Showinfo用来查看邮箱内容,实现代码如下:

private void Showinfo()

{

Cursor cr = Cursor.Current;                                //定义鼠标信息

Cursor.Current = Cursors.WaitCursor;                        //设置光标样式

this.richTextBox1.Clear();                                //清空richTextBox1

try

{

string strResult = “”;                                //声明变量用于获取邮件信息

    sendstring = “RETR ” + this.textBox4.Text + “\r\n”;             //存储从服务器获得一条信息的命令

bufferstring = Encoding.ASCII.GetBytes(sendstring.ToCharArray());//解码

networkstream.Write(bufferstring, 0, bufferstring.Length);        

strResult = streamreader.ReadLine();                        //读取邮件内容

if (strResult[0] != ‘-‘)

{

//不断地读取邮件内容,直到结束标志:英文句号

while (strResult != “.”)

{

this.richTextBox1.AppendText(strResult + “\r\n”);    //将邮件内容添加到richTextBox1

strResult = streamreader.ReadLine();            //逐行读取

}

}

else

{

this.richTextBox1.AppendText(“\r\n” + “邮件错误” + “\r\n”);//如果发生错误则弹出提示

}

}

catch (Exception ey)                                    //如果出现异常

{

MessageBox.Show(ey.Message);                        //显示异常信息

}

Cursor.Current = cr;

}

 

 

如无特殊说明均为原创,转载请附上原文地址。:佛系糖果的博客 » 收取电子邮件

赞 (0) 打赏

说点什么

avatar
  Subscribe  
提醒

觉得文章有用就打赏一下呗~

支付宝扫一扫打赏

微信扫一扫打赏