基于POP3与SMTP协议的邮件收发程序的开发.doc

上传人:xin****828 文档编号:6640624 上传时间:2020-03-01 格式:DOC 页数:18 大小:256KB
返回 下载 相关 举报
基于POP3与SMTP协议的邮件收发程序的开发.doc_第1页
第1页 / 共18页
基于POP3与SMTP协议的邮件收发程序的开发.doc_第2页
第2页 / 共18页
基于POP3与SMTP协议的邮件收发程序的开发.doc_第3页
第3页 / 共18页
点击查看更多>>
资源描述
一、设计思想电子邮件指用电子手段传送信件、单据、资料等信息的通信方法。电子邮件综合了电话通信和邮政信件的特点,它传送信息的速度和电话一样快,又能象信件一样使收信者在接收端收到文字记录。电子邮件系统又称基于计算机的邮件报文系统。它承担从邮件进入系统到邮件到达目的地为止的全部处理过程。电子邮件不仅可利用电话网络,而且可利用任何通信网传送。在利用电话网络时,还可利用其非高峰期间传送信息,这对于商业邮件具有特殊价值。由中央计算机和小型计算机控制的面向有限用户的电子系统可以看作是一种计算机会议系统。电子邮件的工作过程遵循客户-服务器模式。每份电子邮件的发送都要涉及到发送方与接收方,发送方式构成客户端,而接收方构成服务器,服务器含有众多用户的电子信箱。发送方通过邮件客户程序,将编辑好的电子邮件向邮局服务器(SMTP服务器)发送。邮局服务器识别接收者的地址,并向管理该地址的邮件服务器(POP3服务器)发送消息。一个邮件系统的传输包含用户代理User Agent传输代理TransferAgent及接受代理DeliveryAgent三大部分。用户代理是一个用户发信和收信的程序,负责将电子邮件按照一定的标准包装,然后送至邮件服务器,或由邮件服务器收回。传输代理负责信件的交换和传输。将信件传送至适当的邮件主机,再由接受代理将信件分发至不同的邮件信箱。传输代理必须要能够接受用户邮件程序送来的信件,解读收信人的地址,根据SMTP协议将它正确无误地传递到目的地。现在一般的传输代理已采用Sendmail程序完成工作。电子邮件到达邮件主机后,在经接收代理POP协议被用户读取至自己的主机。电子邮件在发送与接收过程中都要遵循SMTP、POP3等协议,这些协议确保了电子邮件在各种不同系统之间的传输。其中,SMTP负责电子邮件的发送,而POP3则用于接收Internet上的电子邮件。SMTP(SimpleMailTransferProtocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCPIP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,我们就可以把Email寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转你发出的电子邮件。POP3(PostOfficeProtocol3)即邮局协议,目前已发展到第三版,称POP3。它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。总的来说POP3协议是让用户把服务器上的信收到本地来所需要的一种协议。本程序为一个基于SMTP和POP3协议的小型EMAIL收发程序,简单的实现了邮件的收发功能。二、算法流程图USERE-mail用户操作SMTP协议POP3协议邮件服务器用户登录用户信息邮件信息选择邮件发送邮件接收邮件图1 算法流程图三、源代码下面给出的是用登录程序的源代码:using System; /导入名字空间using System.Collections.Generic; /包含定义各种对象集合的接口和类using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text; /包含表示 ASCII等字符编码的类using System.Windows.Forms;using System.Net;using System.Net.Sockets;using System.IO;namespace MailSendOfRecive /命名空间public partial class Form3 : Form /定义类public string Conn,Uname,Pwd,Inf; /定义用户名、密码public TcpClient Server; /定义服务器public NetworkStream NetStrm;public StreamReader RdStrm;public Boolean BPass; /定义BPasspublic string Data;public byte szData;public string CRLF = rn; /定义快捷键public Form2 Sender;public Form3() /定义框架InitializeComponent(); /初始化private void Login_Click(object sender, EventArgs e)Conn = pop.+textBox1.Text.Trim();Uname = textBox2.Text.Trim(); /用户名Pwd = textBox3.Text; /密码Server = new TcpClient(Conn, 110); /服务器tryNetStrm = Server.GetStream();RdStrm = new StreamReader(Server.GetStream(), System.Text.Encoding.Default);RdStrm.ReadLine();Data = USER + Uname + CRLF;szData = System.Text.Encoding.ASCII.GetBytes(Data);/获取ASCII值NetStrm.Write(szData,0,szData.Length);RdStrm.ReadLine(); /读取字符并返回Data = PASS + Pwd + CRLF;szData = System.Text.Encoding.ASCII.GetBytes(Data);NetStrm.Write(szData,0,szData.Length);Inf = RdStrm.ReadLine();if (Inf.IndexOf(+OK)-1)BPass = true; /布尔值设为真Sender = new Form2(Uname, Pwd, textBox1.Text);this.Hide();Sender.Show();else if (Inf.IndexOf(-OK)-1) /判断索引MessageBox.Show(密码或者用户名错误, 用户验证); /文本框显示信息Data = QUIT;szData = System.Text.Encoding.ASCII.GetBytes(Data);NetStrm.Write(szData, 0, szData.Length); /写入数据catch (System.Exception ex)MessageBox.Show(ex.Message); /文本框显示信息private void Form3_Load(object sender, EventArgs e)/定义Form3_Load下面是发送邮件程序源代码using System; /导入名字空间using System.Collections.Generic; /包含定义各种对象集合的接口和类using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text; /包含表示 ASCII等字符编码的类using System.Windows.Forms;using System.Net;using System.Net.Sockets;using System.IO;using System.Collections;using System.Data.OleDb;namespace MailSendOfRecive /命名空间public partial class Form1 : Form /定义类TcpClient smtpSrv;NetworkStream netStm; /提供数据流string CRLF = rn;public List SMail = new List();public Form2 fa;public string Ua, Pw, Sv;public Form1(Form2 f,string UN,string Pd,string SR) /创建Form1fa = f;Ua = UN;Pw = Pd;Sv = SR;InitializeComponent(); /初始化public void WriteStream(string strCmd)strCmd += CRLF; /crlf表示结束byte bw = System.Text.Encoding.Default.GetBytes(strCmd); /将字符串转为字节数组netStm.Write(bw,0,bw.Length); /写入网络private string AuthStream(string strCmd) /连接服务器输出字符串trybyte by = System.Text.Encoding.Default.GetBytes(strCmd);strCmd = Convert.ToBase64String(by); /转换成base64编码catch (System.Exception ex)return ex.ToString();return strCmd;public bool tryTran( ref string a) /定义布尔变量string b = ;b = a;trybyte outputb = Convert.FromBase64String(a); /转换数据类型a = Encoding.Default.GetString(outputb);return true;catch (System.Exception ex) /显示错误a= b;return false;public void WritInf(string s) /定义WritInftryTran(ref s);listBoxMsg.Items.Add(s);private void ButtonSend_Click(object sender, EventArgs e) /定义ButtonSend_ClicklistBoxMsg.Items.Clear(); /存放smtp服务器返回的信息trystring data;progressBar1.Visible = true;progressBar1.Value = 1;smtpSrv = new TcpClient(smtp.+Sv,25);/TextBoxSer.Text,25); /连接smtp服务器netStm = smtpSrv.GetStream(); /取得Networkstream对象,来发送接收数据StreamReader rdStrm = new StreamReader(smtpSrv.GetStream(); /产生StreamReader来读取数据流WriteStream(EHLO Local); /发送命令建立连接progressBar1.Value+;listBoxMsg.Items.Add(输入用户名开始);WriteStream(AUTH LOGIN); /发送命令请求验证listBoxMsg.Items.Add(rdStrm.ReadLine();progressBar1.Value+;data = AuthStream(Ua);/data); /转换编码格式WriteStream(data); /发送用户名listBoxMsg.Items.Add(rdStrm.ReadLine();data = AuthStream(Pw);/data); /转换编码格式WriteStream(data); /发送listBoxMsg.Items.Add(rdStrm.ReadLine(); progressBar1.Value+;data = MAIL FROM:; /发件人地址WriteStream(data);listBoxMsg.Items.Add(rdStrm.ReadLine();progressBar1.Value+;data = RCPT TO:; /收件人地址WriteStream(data);listBoxMsg.Items.Add(rdStrm.ReadLine();progressBar1.Value+;WriteStream(DATA); /数据listBoxMsg.Items.Add(rdStrm.ReadLine();progressBar1.Value+;data = Date:+System.DateTime.Now; /日期WriteStream(data);progressBar1.Value+;data = From: + TextBoxSend.Text; /发送者WriteStream(data);progressBar1.Value+;data = To: + TextBoxRev.Text; /接收者WriteStream(data);progressBar1.Value+;data = SUBJECT: + textBoxSubject.Text; /主题WriteStream(data);progressBar1.Value+;data = Reply-To: + TextBoxSend.Text; /发送回复地址WriteStream(data);progressBar1.Value+;WriteStream(); /表示首部结束,开始正文progressBar1.Value+;WriteStream(textBoxMailText.Text);progressBar1.Value+;WriteStream(.); /点表示邮件内容结束progressBar1.Value+;listBoxMsg.Items.Add(rdStrm.ReadLine();WriteStream(QUIT); /断开progressBar1.Value+;listBoxMsg.Items.Add(rdStrm.ReadLine(); /添加项netStm.Close();rdStrm.Close(); /释放资源MailInfo i = new MailInfo();i.sender = TextBoxSend.Text;i.geter = TextBoxRev.Text;i.Ttile = textBoxSubject.Text;i.NeiRong = textBoxMailText.Text;i.Datatime = DateTime.Now.ToString();/将发送的消息送到SMail便于传个收件箱界面SMail.Add(i);MessageBox.Show(邮件发送成功, 成功); /显示信息catch (System.Exception ex)MessageBox.Show(ex.ToString(), 操作错误); /显示信息private void Form1_FormClosed(object sender, FormClosedEventArgs e)Application.Exit(); /终止所有程序private void button1_Click(object sender, EventArgs e)this.Hide(); /隐藏控件fa.Show();fa.GetSenMail(SMail);private void Form1_Load(object sender, EventArgs e)下面是接收邮件程序源代码using System; /导入名字空间using System.Collections.Generic; /包含定义各种对象集合的接口和类using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Net; /包含表示 ASCII等字符编码的类using System.Net.Mail;using System.Net.Sockets;using System.IO;using System.Collections;namespace MailSendOfRecive /命名空间public partial class Form2 : Form /定义类public TcpClient Server; /定义服务器public NetworkStream NetStrm;public StreamReader RdStrm;public string Data,UsName,Pawd,InEmai;public byte szData,other;public List EMail = new List(); /链表类public List DMail = new List();public List SndMail = new List();public string CRLF = rn;public FileStream fs;public int InfoID,BackId;public int DeleTxt = -1; /声明写入流DataTable dt = new DataTable(); /数据表了,类似于数据库,可以存放数据public Form2(string Uname,string Pwd,string IEM)InfoID = -1;InEmai = IEM;/pop.+IEM;UsName = Uname;Pawd = Pwd;InitializeComponent(); /初始化Inint(); /为网格添加标题dt.Columns.Add(ID, typeof(int);dt.Columns.Add(主题, typeof(string);dt.Columns.Add(发件人, typeof(string); /创建对象dt.Columns.Add(时间, typeof(string);dt.Columns.Add(含有附件, typeof(Boolean); private void Inint() /初始化节点 TreeNode Node = treeView1.Nodes.Add(Name, 邮件归档系统);Node.Nodes.Add(Send, 发件箱);Node.Nodes.Add(Recove, 收件箱);Node.Nodes.Add(GuiDang, 邮件归档); /获取对象的集合Node.Nodes.Add(HuiShou, 回收站);private void ShowInfo()private void buttonCon_Click(object sender, EventArgs e) /定义点击事件Server = new TcpClient(pop.+InEmai, 110); /初始化服务器tryNetStrm = Server.GetStream();RdStrm = new StreamReader(NetStrm,System.Text.Encoding.Default);listBoxStatus.Items.Add(RdStrm.ReadLine(); /向列表添加项Data = USER + UsName + CRLF;/textBoxUser.Text+CRLF;szData = System.Text.Encoding.Default.GetBytes(Data); /获取编码NetStrm.Write(szData,0,szData.Length);listBoxStatus.Items.Add(RdStrm.ReadLine();Data = PASS + Pawd + CRLF;/textBoxPwd.Text+CRLF;szData = System.Text.Encoding.Default.GetBytes(Data); /获取编码NetStrm.Write(szData,0,szData.Length);listBoxStatus.Items.Add(RdStrm.ReadLine(); /获取所有的邮件的大小Data = STAT + CRLF;szData = System.Text.Encoding.Default.GetBytes(Data); /获取编码NetStrm.Write(szData,0,szData.Length); /写入数据string st = RdStrm.ReadLine();MessageBox.Show(st); /显示消息框listBoxStatus.Items.Add(st);st = st.Substring(4, 2); /检索字符串MessageBox.Show(st);int Cout = Int32.Parse(st);if (Cout0)buttonDel.Enabled = true; /设置控件属性for (int i = 0; i -1)string st = InfoID.ToString();dt.Rows.Remove(dt.RowsDeleTxt);dataGridView1.DataSource = dt;richTexOfInfo.Text = ;MessageBox.Show(删除操作成功, 操作成功); /显示信息catch (System.Exception ex) /显示错误MessageBox.Show(ex.Message); /显示信息private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) /选择点击树节点时触发的事件dt.Clear();richTexOfInfo.Text = SndMailConvert.ToInt32(e.Node.Name).NeiRong;if (dt.Rows.Count0)this.dataGridView1.DataSource = dt; /获取数据源else private void GuiButton_Click(object sender, EventArgs e) /进行归档treeView1.NodesName.NodesGuiDang.Nodes.Add(ShiYang, 实验报告); /获取树节点集合treeView1.NodesName.NodesGuiDang.Nodes.Add(Other,其他邮件);foreach (MailInfo a in EMail)if (a.Ttile.IndexOf(实验报告) 0)treeView1.NodesName.NodesGuiDang.NodesShiYang.Nodes.Add(a.sender, a.sender); /获取树节点集合else treeView1.NodesName.NodesGuiDang.NodesOther.Nodes.Add(a.sender, a.sender);GuiButton.Enabled = false; /控件设为不可用private void dataGridView1_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) /点击表格时触发的事件DeleTxt = e.RowIndex; /获取索引InfoID = (int)this.dataGridView10, e.RowIndex.Value; /获取值foreach (MailInfo a in EMail)if (a.id = InfoID)richTexOfInfo.Text = a.NeiRong; /获取文本break;public void GetSenMail(List e) /获取发件模块送的数据if (e.Count0)foreach (MailInfo a in e)int i = treeView1.NodesName.NodesSend.Nodes.Count;treeView1.NodesName.NodesSend.Nodes.Add(i.ToString(),a.geter);SndMail.Add(a); /添加对象到结尾处private void button1_Click(object sender, EventArgs e) /跳到发件界面Form1 Se = new Form1(this, UsName, Pawd, InEmai);this.Hide();Se.Show();private void Form2_FormClosed(object sender, FormClosedEventArgs e) /程序退出处理Application.Exit(); /停止程序private void button2_Click(object sender, EventArgs e) /还原回收站中的数据treeView1.NodesName.NodesHuiShou.Nodes.Remove(treeView1.NodesName.NodesHuiShou.NodesBackId.ToString(); /获取集合foreach (MailInfo a in DMail)if (a.id = BackId)dt.Rows.Add(new Object a.id, a.Ttile, a.sender, a.Datatime, a.Fujian ); /获取集合dataGridView1.DataSource = dt; /获取数据源private void Form2_Load(object sender, EventArgs e)public class MailInfo public int id;public string sender; /寄件人public string geter; /收件人public Boolean Fujian; /是否有附件public string FJname; /附件名称public string Ttile; public string NeiRong; /内容public string Datatime; /日期public MailInfo() /构建MailInfoFujian = false;id = -1;sender = ;geter = ;FJname = ;Ttile = ;NeiRong = ;Datatime = ;四、运行结果运行结果有3个界面图2 登录界面图3 发送邮件界面图4 接收邮件界面五、遇到的问题及解决这部分我主要遇到了如下两个问题,其内容与解决方法如下所列:l 不清楚SMTP和POP3的区别。其实一般每个提供电子邮件服务的网站都有自己的SMTP和POP服务器地址,在你登录你的电子邮件网站时仔细找找肯定能发现它们,如果找不到还可以查看一下网站的“帮助”。如果你想详细的了解一下这其中的知识,就请看看下面的解释吧: POP(Post Office Protocol)邮局通讯协定,POP是互联网上的一种通讯协定,主要功能是用在传送电子邮件,当我们寄信给另外一个人时,对方当时多半不会在线上,所以邮件服务器必须为收信者保存这封信,直到收信者来检查这封信件。当收信人收信的时候,必须通过POP通讯协定,才能取得邮件。 与POP同时出现的还有SMTP,它也是用来传送网络上的电子邮件,不同的是POP是负责邮件程序和邮件服务器收信的通讯协定,SMTP则是负责邮件服务器与邮件服务器之间的寄信的通讯协定。 SMTP(Simple Mail Transfer Protocol)简易邮件传输通讯协议,SMTP是互联网上的一种通讯协议,主要功能是用在传送电子邮件,当我们通过电子邮件程序,寄E-mil给另外一个人时,必须通过SMTP通讯协议,将邮件送到对方的邮件服务器上,等到对方上网的时候,就可以收到你所寄的信。其实简单的说,POP服务器是用来收信的,而且每个E-mail地址一般只有一个。如果你要同时收取多个邮箱的信件,就必须挨个设置每个邮箱的POP3服务器地址。l 不知道POP3和SMTP命令和应答。 POP客户使用POP命令向POP服务器发送请求,例如PASS命令传送帐户密码,RETR命令请求传送邮件内容等.POP服务器使用应答对此回应,“+OK”表示命令成功,-ERR表示命令失败,后面是简单的文字说明,例如+OK Password required for Bob 表示USER命令成功执行,需要客户输入密码进行认证.SMTP客户使用命令把邮件信息传送到服务器。共有4个字母组成,例如MAIL命令传送发件人信息,DATA传送邮件内容等.服务器使用应答对此回应,由3个数字后面附上简单的文字说明组成,例如250 OK 表示同意客户发来的命令。六、心得体会 通过这次的项目开发,从中获得了许多的知识,尤其是对C#语言的认识更加的深刻了,C#是目前流行的程序开发语言。作为一种完全的面向对象的语言,它吸取了其他语言的各种有点,设计简介而优美,使用起来方便而高效,是一门典型的门槛低而天花板高的语言。既像Basic那样容易入门,又像C/C+那样具有强大的实际应用能力。而且与其他纯粹的语言不同,C#其实是一个完整的技术平台。经过几天的学习,该软件基本完成,其基本功能已经具备。虽然还不够完善,但我相信,在同学和老师的帮助下会更加完善。学习过程中学到了许多知识,发觉C#并没有想象中的难,只要熟悉一些基本的操作,还有一些命令还有控件,便可以做些小项目。虽然是第一次接触,但是只要有耐心,要有积极向上的自学心态,便一定会学好。 在开发过程中吸取的教训也很多,就是在对某些方法掌握的不是很清楚的情况下,乱用一些方法,导致产生一些严重的错误。 还有就是每次开发一段时间之后,都会备份一下完整的代码,以防电脑出现故障导致代码丢失,或者是代码修改之后无法复原等等。 总体而言,这次
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 模板表格


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!