基于POP3与SMTP协议的邮件收发程序的开发.docx
《基于POP3与SMTP协议的邮件收发程序的开发.docx》由会员分享,可在线阅读,更多相关《基于POP3与SMTP协议的邮件收发程序的开发.docx(29页珍藏版)》请在冰豆网上搜索。
基于POP3与SMTP协议的邮件收发程序的开发
一、设计思想
电子邮件指用电子手段传送信件、单据、资料等信息的通信方法。
电子邮件综合了电话通信和邮政信件的特点,它传送信息的速度和电话一样快,又能象信件一样使收信者在接收端收到文字记录。
电子邮件系统又称基于计算机的邮件报文系统。
它承担从邮件进入系统到邮件到达目的地为止的全部处理过程。
电子邮件不仅可利用电话网络,而且可利用任何通信网传送。
在利用电话网络时,还可利用其非高峰期间传送信息,这对于商业邮件具有特殊价值。
由中央计算机和小型计算机控制的面向有限用户的电子系统可以看作是一种计算机会议系统。
电子邮件的工作过程遵循客户-服务器模式。
每份电子邮件的发送都要涉及到发送方与接收方,发送方式构成客户端,而接收方构成服务器,服务器含有众多用户的电子信箱。
发送方通过邮件客户程序,将编辑好的电子邮件向邮局服务器(SMTP服务器)发送。
邮局服务器识别接收者的地址,并向管理该地址的邮件服务器(POP3服务器)发送消息。
一个邮件系统的传输包含用户代理UserAgent传输代理TransferAgent及接受代理DeliveryAgent三大部分。
用户代理是一个用户发信和收信的程序,负责将电子邮件按照一定的标准包装,然后送至邮件服务器,或由邮件服务器收回。
传输代理负责信件的交换和传输。
将信件传送至适当的邮件主机,再由接受代理将信件分发至不同的邮件信箱。
传输代理必须要能够接受用户邮件程序送来的信件,解读收信人的地址,根据SMTP协议将它正确无误地传递到目的地。
现在一般的传输代理已采用Sendmail程序完成工作。
电子邮件到达邮件主机后,在经接收代理POP协议被用户读取至自己的主机。
电子邮件在发送与接收过程中都要遵循SMTP、POP3等协议,这些协议确保了电子邮件在各种不同系统之间的传输。
其中,SMTP负责电子邮件的发送,而POP3则用于接收Internet上的电子邮件。
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。
通过SMTP协议所指定的服务器,我们就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。
SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转你发出的电子邮件。
POP3(Post Office Protocol 3)即邮局协议,目前已发展到第三版,称POP3。
它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。
它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。
总的来说POP3协议是让用户把服务器上的信收到本地来所需要的一种协议。
本程序为一个基于SMTP和POP3协议的小型EMAIL收发程序,简单的实现了邮件的收发功能。
二、算法流程图
图1算法流程图
三、源代码
下面给出的是用登录程序的源代码:
usingSystem;//导入名字空间
usingSystem.Collections.Generic;//包含定义各种对象集合的接口和类
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;//包含表示ASCII等字符编码的类
usingSystem.Windows.Forms;
usingSystem.Net;
usingSystem.Net.Sockets;
usingSystem.IO;
namespaceMailSendOfRecive//命名空间
{
publicpartialclassForm3:
Form//定义类
{
publicstringConn,Uname,Pwd,Inf;//定义用户名、密码
publicTcpClientServer;//定义服务器
publicNetworkStreamNetStrm;
publicStreamReaderRdStrm;
publicBooleanBPass;//定义BPass
publicstringData;
publicbyte[]szData;
publicstringCRLF="\r\n";//定义快捷键
publicForm2Sender;
publicForm3()//定义框架
{
InitializeComponent();//初始化
}
privatevoidLogin_Click(objectsender,EventArgse)
{
Conn="pop."+textBox1.Text.Trim();
Uname=textBox2.Text.Trim();//用户名
Pwd=textBox3.Text;//密码
Server=newTcpClient(Conn,110);//服务器
try
{
NetStrm=Server.GetStream();
RdStrm=newStreamReader(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=newForm2(Uname,Pwd,textBox1.Text);
this.Hide();
Sender.Show();
}
elseif(Inf.IndexOf("-OK")>-1)//判断索引
{
MessageBox.Show("密码或者用户名错误","用户验证");
//文本框显示信息
}
Data="QUIT";
szData=System.Text.Encoding.ASCII.GetBytes(Data);
NetStrm.Write(szData,0,szData.Length);//写入数据
}
catch(System.Exceptionex)
{
MessageBox.Show(ex.Message);//文本框显示信息
}
}
privatevoidForm3_Load(objectsender,EventArgse)//定义Form3_Load
{
}
}
}
下面是发送邮件程序源代码
usingSystem;//导入名字空间
usingSystem.Collections.Generic;//包含定义各种对象集合的接口和类
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;//包含表示ASCII等字符编码的类
usingSystem.Windows.Forms;
usingSystem.Net;
usingSystem.Net.Sockets;
usingSystem.IO;
usingSystem.Collections;
usingSystem.Data.OleDb;
namespaceMailSendOfRecive//命名空间
{
publicpartialclassForm1:
Form//定义类
{
TcpClientsmtpSrv;
NetworkStreamnetStm;//提供数据流
stringCRLF="\r\n";
publicListSMail=newList();
publicForm2fa;
publicstringUa,Pw,Sv;
publicForm1(Form2f,stringUN,stringPd,stringSR)//创建Form1
{
fa=f;
Ua=UN;
Pw=Pd;
Sv=SR;
InitializeComponent();//初始化
}
publicvoidWriteStream(stringstrCmd)
{
strCmd+=CRLF;//crlf表示结束
byte[]bw=System.Text.Encoding.Default.GetBytes(strCmd);//将字符串转为字节数组
netStm.Write(bw,0,bw.Length);//写入网络
}
privatestringAuthStream(stringstrCmd)//连接服务器输出字符串
{
try
{
byte[]by=System.Text.Encoding.Default.GetBytes(strCmd);
strCmd=Convert.ToBase64String(by);//转换成base64编码
}
catch(System.Exceptionex)
{
returnex.ToString();
}
returnstrCmd;
}
publicbooltryTran(refstringa)//定义布尔变量
{
stringb="";
b=a;
try
{
byte[]outputb=Convert.FromBase64String(a);//转换数据类型
a=Encoding.Default.GetString(outputb);
returntrue;
}
catch(System.Exceptionex)//显示错误
{
a=b;
returnfalse;
}
}
publicvoidWritInf(strings)//定义WritInf
{
tryTran(refs);
listBoxMsg.Items.Add(s);
}
privatevoidButtonSend_Click(objectsender,EventArgse)//定义ButtonSend_Click
{
listBoxMsg.Items.Clear();//存放smtp服务器返回的信息
try
{
stringdata;
progressBar1.Visible=true;
progressBar1.Value=1;
smtpSrv=newTcpClient("smtp."+Sv,25);//TextBoxSer.Text,25);
//连接smtp服务器
netStm=smtpSrv.GetStream();//取得Networkstream对象,来发送接收数据
StreamReaderrdStrm=newStreamReader(smtpSrv.GetStream());
//产生StreamReader来读取数据流
WriteStream("EHLOLocal");//发送命令建立连接
progressBar1.Value++;
listBoxMsg.Items.Add("输入用户名开始");
WriteStream("AUTHLOGIN");//发送命令请求验证
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="MAILFROM:
<"+TextBoxSend.Text+">";//发件人地址
WriteStream(data);
listBoxMsg.Items.Add(rdStrm.ReadLine());
progressBar1.Value++;
data="RCPTTO:
<"+TextBoxRev.Text+">";//收件人地址
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();//释放资源
MailInfoi=newMailInfo();
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.Exceptionex)
{
MessageBox.Show(ex.ToString(),"操作错误");//显示信息
}
}
privatevoidForm1_FormClosed(objectsender,FormClosedEventArgse)
{
Application.Exit();//终止所有程序
}
privatevoidbutton1_Click(objectsender,EventArgse)
{
this.Hide();//隐藏控件
fa.Show();
fa.GetSenMail(SMail);
}
privatevoidForm1_Load(objectsender,EventArgse)
{
}
}
}
下面是接收邮件程序源代码
usingSystem;//导入名字空间
usingSystem.Collections.Generic;//包含定义各种对象集合的接口和类
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Net;//包含表示ASCII等字符编码的类
usingSystem.Net.Mail;
usingSystem.Net.Sockets;
usingSystem.IO;
usingSystem.Collections;
namespaceMailSendOfRecive//命名空间
{
publicpartialclassForm2:
Form//定义类
{
publicTcpClientServer;//定义服务器
publicNetworkStreamNetStrm;
publicStreamReaderRdStrm;
publicstringData,UsName,Pawd,InEmai;
publicbyte[]szData,other;
publicListEMail=newList();//链表类
publicListDMail=newList();
publicListSndMail=newList();
publicstringCRLF="\r\n";
publicFileStreamfs;
publicintInfoID,BackId;
publicintDeleTxt=-1;//声明写入流
DataTabledt=newDataTable();//数据表了,类似于数据库,可以存放数据
publicForm2(stringUname,stringPwd,stringIEM)
{
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));
}
privatevoidInint()//初始化节点
{
TreeNodeNode=treeView1.Nodes.Add("Name","邮件归档系统");
Node.Nodes.Add("Send","发件箱");
Node.Nodes.Add("Recove","收件箱");
Node.Nodes.Add("GuiDang","邮件归档");//获取对象的集合
Node.Nodes.Add("HuiShou","回收站");
}
privatevoidShowInfo()
{
}
privatevoidbuttonCon_Click(objectsender,EventArgse)
//定义点击事件
{
Server=newTcpClient("pop."+InEmai,110);//初始化服务器
try
{
NetStrm=Server.GetStream();
RdStrm=newStreamReader(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);//写入数据
stringst=RdStrm.ReadLine();
MessageBox.Show(st);//显示消息框
listBox