当前位置:文档之家› 基于POP3与SMTP协议的邮件收发程序的开发

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

一、设计思想

电子邮件指用电子手段传送信件、单据、资料等信息的通信方法。电子邮件综合了电话通信和邮政信件的特点,它传送信息的速度和电话一样快,又能象信件一样使收信者在接收端收到文字记录。电子邮件系统又称基于计算机的邮件报文系统。它承担从邮件进入系统到邮件到达目的地为止的全部处理过程。电子邮件不仅可利用电话网络,而且可利用任何通信网传送。在利用电话网络时,还可利用其非高峰期间传送信息,这对于商业邮件具有特殊价值。由中央计算机和小型计算机控制的面向有限用户的电子系统可以看作是一种计算机会议系统。

电子邮件的工作过程遵循客户-服务器模式。每份电子邮件的发送都要涉及到发送方与接收方,发送方式构成客户端,而接收方构成服务器,服务器含有众多用户的电子信箱。发送方通过邮件客户程序,将编辑好的电子邮件向邮局服务器(SMTP服务器)发送。邮局服务器识别接收者的地址,并向管理该地址的邮件服务器(POP3服务器)发送消息。

一个邮件系统的传输包含用户代理User Agent传输代理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收发程序,简单的实现了邮件的收发功能。

二、算法流程图

USER E-mail 用户登录用户信息邮件信息选择邮件

用户操作

发送邮件接收邮件

SMTP协议POP3协议

邮件服务器

图1 算法流程图

三、源代码

下面给出的是用登录程序的源代码:

using System; //导入名字空间

using System.Collections.Generic; //包含定义各种对象集合的接口和类using https://www.doczj.com/doc/f5952853.html,ponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text; //包含表示ASCII等字符编码的类using System.Windows.Forms;

using https://www.doczj.com/doc/f5952853.html,;

using https://www.doczj.com/doc/f5952853.html,.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; //定义BPass

public string Data;

public byte[] szData;

public string CRLF = "\r\n"; //定义快捷键

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); //服务器

try

{

NetStrm = 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 https://www.doczj.com/doc/f5952853.html,ponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text; //包含表示ASCII等字符编码的类using System.Windows.Forms;

using https://www.doczj.com/doc/f5952853.html,;

using https://www.doczj.com/doc/f5952853.html,.Sockets;

using System.IO;

using System.Collections;

using System.Data.OleDb;

namespace MailSendOfRecive //命名空间

{

public partial class Form1 : Form //定义类

{

TcpClient smtpSrv;

NetworkStream netStm; //提供数据流

string CRLF = "\r\n";

public List SMail = new List();

public Form2 fa;

public string Ua, Pw, Sv;

public Form1(Form2 f,string UN,string Pd,string SR) //创建Form1

{

fa = 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) //连接服务器输出字符串{

try

{

byte[] 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;

try

{

byte[] outputb = Convert.FromBase64String(a); //转换数据类型

a = Encoding.Default.GetString(outputb);

return true;

}

catch (System.Exception ex) //显示错误

{

a= b;

return false;

}

}

public void WritInf(string s) //定义WritInf

{

tryTran(ref s);

listBoxMsg.Items.Add(s);

}

private void ButtonSend_Click(object sender, EventArgs e) //定义ButtonSend_Click

{

listBoxMsg.Items.Clear(); //存放smtp服务器返回的信息

try

{

string 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:<" + TextBoxSend.Text + ">"; //发件人地址

WriteStream(data);

listBoxMsg.Items.Add(rdStrm.ReadLine());

progressBar1.Value++;

data = "RCPT TO:<"+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(); //释放资源

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 https://www.doczj.com/doc/f5952853.html,ponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using https://www.doczj.com/doc/f5952853.html,; //包含表示ASCII等字符编码的类

using https://www.doczj.com/doc/f5952853.html,.Mail;

using https://www.doczj.com/doc/f5952853.html,.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 = "\r\n";

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); //初始化服务器

try

{

NetStrm = 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); //获取编码

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 (Cout>0)

{

buttonDel.Enabled = true; //设置控件属性

for (int i = 0; i < Cout;i++ )

{

MailInfo ou = new MailInfo();

GetInfo(i+1,ref ou);

EMail.Add(ou); //对象添加到结尾

}

ShowInfo();

}

else

{

buttonDel.Enabled = false; //控件设为不可用

}

buttonCon.Enabled = false; //控件设为不可用buttonDison.Enabled = true;

GuiButton.Enabled = true;

buttonDel.Enabled = true; //控件设为不可用treeView1.Enabled = true;

}

catch (System.Exception ex)

{

MessageBox.Show(ex.ToString()); //显示消息框

}

}

//按ID读取邮件并进行解析private void GetInfo(int ID,ref MailInfo NewInfo)

{

richTexOfInfo.AppendText("\r\n-----------------------\r\n");//追加文本

NewInfo.id = ID;

string szTemp;

try

{

string st = Convert.ToString(ID);

Data = "UIDL " + st + CRLF; //获取每个邮件的唯一标示szData = System.Text.Encoding.Default.GetBytes(Data);

szTemp = RdStrm.ReadLine();

richTexOfInfo.AppendText(szTemp + CRLF); //追加文本

Data = "RETR " + st + CRLF;

szData = System.Text.Encoding.Default.GetBytes(Data); //获取编码

NetStrm.Write(szData, 0, szData.Length);

szTemp = RdStrm.ReadLine(); //读取字符串并返回richTexOfInfo.AppendText(szTemp + CRLF);

}

szTemp = RdStrm.ReadLine();

}

}

else

}

catch (System.Exception ex)

{

listBoxStatus.Items.Add("Error:" + ex.ToString());

}

}

private void buttonDison_Click(object sender, EventArgs e)

//退出连接

{

Data = "QUIT "+CRLF;

szData = System.Text.Encoding.ASCII.GetBytes(Data); //获取编码

NetStrm.Write(szData, 0, szData.Length);

NetStrm.Close(); //释放资源

RdStrm.Close();

buttonDel.Enabled = false; //设置控件属性buttonCon.Enabled = true;

buttonDison.Enabled = false;

}

public bool tryTran(ref string a) //安照Base64进行解析流文件{

try

{

byte[] outputb = Convert.FromBase64String(a);

a = Encoding.Default.GetString(outputb);

return true;

}

catch (System.Exception ex) //错误信息

{

return false;

}

}

private void GetString(ref string a,int s,int e) //字符串处理

{

string u1 = "", u2 ="",u3=""; //初始化

int sum;

sum = a.IndexOf("B?");

u1 = a.Substring(0, s);

u2 = a.Substring(sum+2, e-sum-2);

byte[] outputb = Convert.FromBase64String(u2);

u2 = Encoding.Default.GetString(outputb);

u3 = a.Substring(e + 2, a.Length - e - 2);

a = u1 + u2 + u3;

}

private void buttonRead_Click(object sender, EventArgs e) //定义事件

{

}

private void buttonDel_Click(object sender, EventArgs e) //删除邮件

{

try

{

if (InfoID>-1)

{

string st = InfoID.ToString();

dt.Rows.Remove(dt.Rows[DeleTxt]);

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 = SndMail[Convert.ToInt32(https://www.doczj.com/doc/f5952853.html,)].NeiRong;

}

if (dt.Rows.Count>0)

{

this.dataGridView1.DataSource = dt; //获取数据源

}

else

}

private void GuiButton_Click(object sender, EventArgs e) //进行归档

{

treeView1.Nodes["Name"].Nodes["GuiDang"].Nodes.Add("ShiYang", "实验报告");

//获取树节点集合

treeView1.Nodes["Name"].Nodes["GuiDang"].Nodes.Add("Other","其他邮件");

foreach (MailInfo a in EMail)

{

if (a.Ttile.IndexOf("实验报告")> 0)

{

treeView1.Nodes["Name"].Nodes["GuiDang"].Nodes["ShiYang"].Nodes.Add(a.sender, a.sender);

//获取树节点集合

}

else treeView1.Nodes["Name"].Nodes["GuiDang"].Nodes["Other"].Nodes.Add(a.sender, a.sender);

}

GuiButton.Enabled = false; //控件设为不可用

}

private void dataGridView1_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)

//点击表格时触发的事件

{

DeleTxt = e.RowIndex; //获取索引

InfoID = (int)this.dataGridView1[0, e.RowIndex].Value; //获取值

foreach (MailInfo a in EMail)

{

if (a.id == InfoID)

{

richTexOfInfo.Text = a.NeiRong; //获取文本

break;

}

}

}

public void GetSenMail(List e) //获取发件模块送的数据

{

if (e.Count>0)

{

foreach (MailInfo a in e)

{

int i = treeView1.Nodes["Name"].Nodes["Send"].Nodes.Count;

treeView1.Nodes["Name"].Nodes["Send"].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.Nodes["Name"].Nodes["HuiShou"].Nodes.Remove(treeView1.Nodes["Name"].Nodes["HuiShou" ].Nodes[BackId.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() //构建MailInfo

{

Fujian = false;

id = -1;

sender = "";

geter = "";

FJname = "";

Ttile = "";

NeiRong = "";

Datatime = "";

}

}

}

四、运行结果

运行结果有3个界面

图2 登录界面

图3 发送邮件界面

图4 接收邮件界面

五、遇到的问题及解决

这部分我主要遇到了如下两个问题,其内容与解决方法如下所列:

不清楚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服务器地址。

不知道POP3和SMTP命令和应答。

P OP客户使用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#并没有想象中的难,只要熟悉一些基本的操作,还有一些命令还有控件,便可以做些小项目。虽然是第一次接触,但是只要有耐心,要有积极向上的自学心态,便一定会学好。

在开发过程中吸取的教训也很多,就是在对某些方法掌握的不是很清楚的情况下,乱用一些方法,导致产生一些严重的错误。

还有就是每次开发一段时间之后,都会备份一下完整的代码,以防电脑出现故障导致代码丢失,或者是代码修改之后无法复原等等。

总体而言,这次的项目开发收获还是巨大的。

SMTP协议发邮件流程

HELO v domain >v CRLF > 用 C++ 发邮件 近段时间,实验室电脑的 IP 频繁地改变,搞得想用远程偷下懒都不行。这时想到的 解决方法有:静态IP,动态域名,自己解决。静态 IP 虽然可以自己指定,但一关机后,与 对方冲突就完了,作罢。免费的动态域名又要手机认证,也作罢。最后只能自己解决。解决 方案是写一个程序不断地检测本机 IP ,如果改变了,就发邮件通知。检测本机 IP 很简单, 就略过。这里介绍下怎样发邮件吧。 发邮件前,需要理解 SMTP(Simple Mail Transfer Protocol) 。 SMTP 是电子邮件从 客户机传输到服务器或从某一个服务器传输到另一个服务器使用的传输协议。 SMTP 是请 求/ 响应协议,命令和响应都是基于 ASCII 文本,并以 CR 和 LF 符结束。响应包括一个 表示返回状态的三位数字代码。在 TCP 协议 25 端口监听连接请求。其命令如下: SMTP 命令 命令说明 识 别发送方到接收 SMTP 的一个 HELO 命令 AUTH LOGIN 登陆服务器的命令。在这条命令之后,要发送用 Base64 编 码后的用户名与密码进行登陆 MAIL FROM: v reverse-path >v CRLF>v reverse-path >为发送者地址。 此命令告 诉接收方一个新邮件发送的开始, 并对所有的状态和缓冲区进行初始化。 此命令开始一个邮 件传输处理,最终完成将邮件数据传送到一个或多个邮箱中。

RCPT TO:v forward-path >v CRLF>v forward-path >标识各个邮件接收者的地

利用wireshark分析SMTP、POP3协议实验报告

. .. ... 利用wireshark分析SMTP、POP3协议实验报告

利用wireshark分析SMTP、POP3协议实验报告一、实验目的 利用wireshark抓包,分析SMTP协议和POP3协议容。 二、实验环境 连接Internet的计算机,系统为windows8.1; Foxmail,软件版本为7.2; Wireshark,软件版本为1.10.7。 三、实验过程 1.登陆及接收过程(POP3协议) 1)操作过程 打开wireshark开始俘获。然后打开Foxmail,输入用户名,密码,POP 服务器,SMTP服务器,如下图:

然后点击创建,登陆成功如下图: 然后点击收取,结果如下图: 打开wireshark,停止俘获,并保存(结果“capture_for_emailLogin.pcapng”另附)。 2)结果分析

因为POP3协议默认的传输协议是TCP协议,因此连接服务器要先进行三次握手,如下图: 连接成功,主机向服务器发送明文用户名和密码,如下图: 认证成功,开始接收处理,主机先向服务器发送SATA命令,得到数量: 主机向服务器发送LIST命令,得到每封的大小:

主机向服务器发送UIDL命令,得到这四封的唯一标示符: 最后主机向服务器发送QUIT命令,回话结束: 2.邮寄发送过程(SMTP协议) 1)操作过程 打开wireshark,开始俘获。然后打开Foxmail,点击写,写一封,点发送,如下图:

然后打开wireshark,停止俘获,并保存(结果 “capture_for_emailSend.pcapng”另附)。 2)结果分析 因为SMTP协议是基于TCP协议的,所以要先进行三次握手: 主机向服务器发送EHLO加上主机名(val-pc),服务器响应并回复250,表示服务器可用: 主机向服务器发送发送用户登录命令“AHTU LOGIN”,服务器回复334,表示接受: 因为SMTP要求用户名和密码必须经过64位编码后发送,不接受明文。所以客户端分别向服务器发送编码后的用户名和密码,服务器分别回复334和235表示接受和通过: 客户端先后向服务器发送“MAIL FROM”和“RCPT TO”命令,后面分别接上发件人和收件人的地址。服务器分别回复“250 MAIL OK”,表示接受成功: 接下来客户端向服务器发送命令“DATA”,表示将要向服务器发送正文,服务器回应“354 End data with .”表示同意接收:

SMTP协议的命令和应答

从前面的通讯模型可以看出SMTP协议在发送SMTP和接收SMTP之间的会话是靠发送SMTP的SMTP 命令和接收SMTP反馈的应答来完成的。在通讯链路建立后,发送SMTP发送MAIL命令指令邮件发送者,若接收SMTP此时可以接收邮件则作出OK的应答,然后发送SMTP继续发出RCPT命令以确认邮件是否收到,如果接收到就作出OK的应答,否则就发出拒绝接收应答,但这并不会对整个邮件操作造成影响。双方如此反复多次,直至邮件处理完毕。SMTP协议共包含10个SMTP命令,列表如下: SMTP命令命令说明 HELLO<domain><CRLF>识别发送方到接收SMTP的一个HELLO命令 MAILFROM:<reverse-path><CRLF><reverse-path>为发送者地址。此命令告诉接收方一个新邮件发送的开始,并对所有的状态和缓冲区进行初始化。此命令开始一个邮件传输处理,最终完成将邮件数据传送到一个或多个邮箱中。 RCPTTO:<forward-path><CRLF><forward-path>标识各个邮件接收者的地址 DATA<CRLF> 接收SMTP将把其后的行为看作邮件数据去处理,以<CRLF>.<CRLF>标识数据的结尾。 REST<CRLF>退出/复位当前的邮件传输 NOOP<CRLF>要求接收SMTP仅做OK应答。(用于测试) QUIT<CRLF>要求接收SMTP返回一个OK应答并关闭传输。 VRFY<string><CRLF>验证指定的邮箱是否存在,由于安全因素,服务器多禁止此命令。 EXPN<string><CRLF>验证给定的邮箱列表是否存在,扩充邮箱列表,也常禁止使用。 HELP<CRLF>查询服务器支持什么命令 注:<CRLF>为回车、换行,ASCII码分别为13、10(十进制)。 SMTP协议的每一个命令都会返回一个应答码,应答码的每一个数字都是有特定含义的,如第一位数字为2时表示命令成功;为5表失败;3表没有完成。一些较复杂的邮件程序利用该特点,首先检查应答码的首数字,并根据其值来决定下一步的动作。下面将SMTP的应答码列表如下: 应答码说明 501参数格式错误 502命令不可实现 503错误的命令序列 504命令参数不可实现 211系统状态或系统帮助响应 214帮助信息 220<domain>服务就绪 221<domain>服务关闭 421<domain>服务未就绪,关闭传输信道 250要求的邮件操作完成 251用户非本地,将转发向<forward-path> 450要求的邮件操作未完成,邮箱不可用 550要求的邮件操作未完成,邮箱不可用 451放弃要求的操作;处理过程中出错 551用户非本地,请尝试<forward-path> 452系统存储不足,要求的操作未执行

实验10 使用Wireshark分析SMTP和POP3协议

实验十使用Wireshark分析SMTP和POP3协议 一、实验目的 分析SMTP和POP3协议 二、实验环境 与因特网连接的计算机,操作系统为Windows,安装有Wireshark、IE等软件。三、实验步骤 大多数电子邮件客户端允许用户撰写电子邮件并将其方到发件箱中,还能发送发件箱中的邮件,接收新邮件到收件箱。大多数用户都知道必须连接到因特网才能发送和接收邮件,但他们可能不知道网络通信的细节。 发送邮件的过程和接收邮件的过程截然不同,它们甚至使用不同的应用层协议。电子邮件客户端通常使用邮件传送协议(Simple Mail Transfer Protocol, SMTP)来发送邮件,并用邮局协议(Post Office Protocol, POP)接收邮件。客户端发送邮件时,通常连接一台独立的本地邮件服务器,并将所有外发的邮件发送到这个服务器而不管接收者的地址。本地邮件服务器将报文放在发送邮件队列中。此时,电子邮件客户端不再涉及邮件的传输,而由本地邮件服务器负责对每个接收者传送邮件。SMTP不仅用于电子邮件客户端和本地邮件服务器之间的数据传输,而且还用于本地邮件服务器和每一个接收者的邮件服务器之间的数据传输。 一旦电子邮件报文到达接收者的邮件服务器,就随同该用户的其他接收邮件报文一起放在邮件队列中,用户可以通过类似的POP这样的协议来获取所有的接收邮件。 1、俘获发送邮件时SMTP分组 (1)启动IE,在IE工具栏中选择“邮件”-> “阅读邮件”,出现Outlook界面,在Outlook中选择“工具”->“选项”->“邮件设置”-> “电子邮件帐户...”,出现“电子邮件帐户”窗口,选择“添加新电子邮件帐户”,单击“下一步”,选择“POP3(P)”,单击“下一步”,将会出现如下界面:

SMTP简单邮件传输协议

一个网络可以由公用互联网上 TCP 可相互访问的主机、防火墙分隔的 TCP/IP 网络上 TCP 可相互访问的主机,及其它 LAN/WAN 中的主机利用非TCP 传输层协议组成。使用 SMTP ,可实现相同网络上处理机之间的邮件传输,也可通过中继器或网关实现某处理机与其它网络之间的邮件传输。 在这种方式下,邮件的发送可能经过从发送端到接收端路径上的大量中间中继器或网关主机。域名服务系统(DNS)的邮件交换服务器可以用来识别出传输邮件的下一跳 IP 地址。 在传输文件过程中使用25号端口 编辑本段协议原理 SMTP-简单邮件传输协议(SimpleMailTransferProtocol),是定义邮件传输的协议,它是基于TCP服务的应用层协议,由RFC0821所定义。SMTP协议规定的命令是以明文方式进行的。为了说明SMTP的工作原理,我们以向163发送邮件为实例进行说明。 在linux环境下,使用"telnet smtp.163. com 25"连接smtp.163. com 的25号端口(SMTP的标准服务端口);在windows下使用telnet程序,远程主机指定为smtp.163. com,而端口号指定为25,然后连接smtp.163. com:交互过程如下: SMTP [lix@nslix]$telnet smtp.163. com 25 220 163 .com Anti-spam GT for Coremail System (163com[071018]) HELO smtp.163 .com 250 OK auth login 334 dXNlcm5hbWU6 USER base64加密后的用户名 334 UGFzc3dvcmQ6 PASS base64加密后的密码 235 Authentication successful MAILFROM:XXX@163 .COM 250 Mail OK RCPTTO:XXX@163 .COM

SMTP与POP协议简析

SMTP、POP协议简析

作者:李鹏博时间:2016/06

1.SMTP协议与POP协议说明 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。 POP(Post Office Protocol)即邮局协议,用于电子邮件的接收。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。本文只介绍POP3。 2.SMTP协议简析 通过抓包,可以看到清晰的服务器与客户端的交流过程。如下图。

如上图,将整个流程分为三部分:握手阶段、认证阶段、发送数据阶段。其中TCP三次握手在上图中未体现,握手成功后,进入认证阶段。 SMTP命令字说明 HELO客户端为标识自己的身份而发送的命令(通常带域名) EHLO使服务器可以表明自己支持扩展简单邮件传输协议(ESMTP) 命令。 MAIL FROM标识邮件的发件人;以MAIL FROM: 的形式使用。 RCPT TO标识邮件的收件人;以RCPT TO: 的形式使用。 DATA客户端发送的、用于启动邮件内容传输的命令。 RSET使整个邮件的处理无效,并重置缓冲区。 QUIT终止会话。 对于服务器的每个回复,都有一个返回码,这个返回码标志着上次的请求操作完成状态。如果第一个数字是2表示操作成功;3表示操作正在进行;5表示操作失败。 握手阶段 认证阶段 握手成功后,邮件服务器(上面示例是163的邮件服务器)会发送欢迎连接信息。然后是客户端HELO(或EHLO),向服务器标识用户身份;接下来进行认证操作。认证成功后,客户端告诉服务器这封邮件从哪个邮箱来,到哪个邮箱去,mail from只有一个,但是recpt to 后面可以跟多个收件人地址。成功后,客户端请求发送邮件数据。 数据发送阶段 服务器回复DATA命令后,会有一个结束符说明。如上图,就是以.结束邮件DATA。其中即为“\r\n”;

利用wireshark分析SMTP、POP3协议实验报告

利用wireshark分析SMTP、POP3协议实验报告

利用wireshark分析SMTP、POP3协议实验报告 一、实验目的 利用wireshark抓包,分析SMTP协议和POP3协议内容。 二、实验环境 连接Internet的计算机,系统为windows8.1; Foxmail,软件版本为7.2; Wireshark,软件版本为1.10.7。 三、实验过程 1.邮箱登陆及接收过程(POP3协议) 1)操作过程 打开wireshark开始俘获。然后打开Foxmail邮箱,输入用户名,密码,POP 服务器,SMTP服务器,如下图: 然后点击创建,登陆成功如下图:

然后点击收取,结果如下图: 打开wireshark,停止俘获,并保存(结果“capture_for_emailLogin.pcapng”另附)。 2)结果分析 因为POP3协议默认的传输协议是TCP协议,因此连接服务器要先进行三次握手,如下图:

连接成功,主机向服务器发送明文用户名和密码,如下图: 认证成功,开始接收处理,主机先向服务器发送SATA命令,得到邮件数量: 主机向服务器发送LIST命令,得到每封邮件的大小:

主机向服务器发送UIDL命令,得到这四封邮件的唯一标示符: 最后主机向服务器发送QUIT命令,回话结束: 2.邮寄发送过程(SMTP协议) 1)操作过程 打开wireshark,开始俘获。然后打开Foxmail,点击写邮件,写一封邮件,点发送,如下图: 然后打开wireshark,停止俘获,并保存(结果“capture_for_emailSend.pcapng”另附)。 2)结果分析

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

一、设计思想 电子邮件指用电子手段传送信件、单据、资料等信息的通信方法。电子邮件综合了电话通信和邮政信件的特点,它传送信息的速度和电话一样快,又能象信件一样使收信者在接收端收到文字记录。电子邮件系统又称基于计算机的邮件报文系统。它承担从邮件进入系统到邮件到达目的地为止的全部处理过程。电子邮件不仅可利用电话网络, 而且可利用任何通信网传送。在利用电话网络时, 还可利用其非高峰期间传送信息,这对于商业邮件具有特殊价值。由中央计算机和小型计算机控制的面向有限用户的电子系统可以看作是一种计算机会议系统。 电子邮件的工作过程遵循客户- 服务器模式。每份电子邮件的发送都要涉及到发送方与接收方,发送方式构成客户端,而接收方构成服务器,服务器含有众多用户的电子信箱。发送方通过邮件客户程序,将编辑好的电子邮件向邮局服务器(SMTP服务器)发送。邮局服 务器识别接收者的地址,并向管理该地址的邮件服务器(POP3服务器)发送消息。 一个邮件系统的传输包含用户代理User Agent 传输代理TransferAgent 及接受代理DeliveryAgent 三大部分。 用户代理是一个用户发信和收信的程序, 负责将电子邮件按照一定的标准包装,然后送至邮件服务器, 或由邮件服务器收回。传输代理负责信件的交换和传输。将信件传送至适当的邮件主机, 再由接受代理将信件分发至不同的邮件信箱。传输代理必须要能够接受用户邮件程序送来的信件,解读收信人的地址,根据SMTP协议将它正确无误地传递到目的地。现在一般的传输代理已采用Sendmail 程序完成工作。电子邮件到达邮件主机后, 在经接收代理POP协议被用户读取至自己的主机。 电子邮件在发送与接收过程中都要遵循SMTP POP3等协议,这些协议确保了电子邮件 在各种不同系统之间的传输。其中,SMTP负责电子邮件的发送,而POP3则用于接收In ternet 上的电子邮件。 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收发程序,简单的实现了邮件的收发功能。

Wireshark抓包分析资料报告POP3和SMTP协议详情

Wireshark抓包分析POP3和SMTP协议 一、实验目的 1.初步掌握Wireshark的使用方法,熟悉抓包流程; 2.通过对Wireshark抓包实例进行分析,加强对POP3协议和 SMTP协议的理解; 3.培养动手实践能力和自主学习自主探究的精神。 二、实验要求 利用Wireshark软件抓包,得到登录的信息和发送的信息,并根据所抓包对POP3协议和SMTP协议进行分析。 三、实验环境 1.系统环境:Windows 8专业版 2.接收:Foxmail 6正式版 3.Wireshark:V1. 4.9 四、实验过程 (一)登录及接收过程(POP3协议) 1.POP3协议简介[1] POP3(Post Office Protocol 3)即邮局协议的第3个版本,它是规定个人计算机如何连接到互联网上的服务器进行收发的

协议。它是因特网电子的第一个离线协议标准,POP3协议允许用户从服务器上把存储到本机主机上,同时根据客户端的操作删除或保存在服务器上的。而POP3服务器则是遵循POP3协议的接收服务器,用来接收电子的。POP3协议是TCP/IP协议族中的一员,由RFC 1939 定义。本协议主要用于支持使用客户端远程管理在服务器上的电子。 2.实验过程 (1)准备工作 ●申请一个126 ●安装并配置Foxmail,将接收和发送的服务器分别设置 为POP3服务器和SMTP服务器 ●在安装好的Foxmail上添加申请到的126账户

添加后的信息 (2)打开Wireshark软件,选择正在联网的网卡,开始抓包。 (3)打开Foxmail,选择账号登录,点击左上角收取,开始连接服务器。

SMTP协议原理

SMTP协议原理 SMTP协议原理 SMTP-简单邮件传输协议(SimpleMailTransferProtocol),是定义邮件传输最常用的协议,它是基于TCP服务的应用层协议,由RFC821所定义。SMTP协议规定的命令是以明文方式进行的。为了说明SMTP的工作原理,我们以向163发送邮件为实例进行说明。 在linux环境下,使用"telnet smtp.163. com 25"连接smtp.163. com的25号端口(SMTP的标准服务端口);在windows下使用telnet程序,远程主机指定为smtp.163. com,而端口号指定为25,然后连接smtp.163. com:交互过程如下:[lix@nslix]$telnet smtp.163. com 25 220 163 .com Anti-spam GT for Coremail System (163com[071018]) HELO smtp.163 .com 250 OK auth login 334 dXNlcm5hbWU6 USER base64加密后的用户名 334 UGFzc3dvcmQ6 PASS base64加密后的密码 235 Authentication successful MAILFROM:XXX@163 .COM

250 Mail OK RCPTTO:XXX@163 .COM 250 Mail OK DATA 354 End data with . QUIT 250 Mail OK queued as smtp5,D9GowLArizfIFTpIxFX8AA==.41385S2 HELO是客户向对方邮件服务器发出的标识自己的身份的命令,这里假设发送者为ideal;MAILFROM命令用来表示发送者的邮件地址;RCPTTO:标识接收者的邮件地址,这里表示希望发送邮件给XXX@163. COM,如果邮件接收者不是本地用户,例如RCPTTO:ideal,则说明希望对方邮件服务器为自己转发(Relay)邮件,若该机器允许转发这样的邮件,则表示该邮件服务器是OPENRELAY的,否则说明该服务器不允许RELAY;DATA表示下面是邮件的数据部分,输入完毕以后,以一个"."开始的行作为数据部分的结束标识;QUIT表示退出这次会话,结束邮件发送。 这就是一个简单的发送邮件的会话过程,其实当使用outlookexpress等客户软件发送时,后台进行的交互也是这样的,当然,SMTP协议为了处理复杂的邮件发送情况如附件等等,定义了很多的命令及规定,具体可以通过阅读RFC821来获得。当你的一个朋友向你发送邮件时,他的邮件服务器和你的邮件服务器通过SMTP协议通信,将邮件传递给你邮件地址所指示的邮件服务器上(这里假设你的本地邮件服务器是Linux系统),若你通过telnet协议直接登录到邮件服务器上,则可以使用mail 等客户软件直接阅读邮件,但是若你希望使用本地的MUA(MailUserAgent,如

SMTP协议RFC文档中文版

RFC821 简单邮件传输协议(SMTP) (RFC821 SIMPLE MAIL TRANSFER PROTOCOL) 目录 1. 介绍 2 2. SMTP模型 3 3. SMTP过程 4 3.1. MAIL 4 3.2. 转发 5 3.3. 确认和扩展 6 3.4. 发送信件(mailing)和获得信件(sending) 7 3.5. 打开和关闭7 3.6. 转发 8 3.7. 域9 3.8. 改变角色9 4. SMTP说明9 4.1. SMTP命令9 4.1.1. 命令语法9 4.1.2. COMMAND语法格式13 4.2. SMTP响应15 4.3. 命令和应答序列16 4.4. 状态图17 4.5. 详细内容18 4.5.1. 最小实现18 4.5.2. 透明性19 4.5.3. 大小19 附录 A TCP传输服务19 附录 B NCP传输服务20 附录 C NITS 20 附录 D X.25传输服务 20 附录 E 应答码构成方法20 附录 F 一些例子22 参考资料36 1. 介绍

简单邮件传输协议(SMTP)的目标是可靠高效地传送邮件,它独立于传送子系统而且仅要求一条可以保证传送数据单元顺序的通道。附录A,B,C和D描述了不同传送服务下SMTP的使用。在名词表中还定义了本文档中使用的术语。 SMTP的一个重要特点是它能够在传送中接力传送邮件,传送服务提供了进程间通信环境(IPCE),此环境可以包括一个网络,几个网络或一个网络的子网。理解到传送系统(或IPCE)不是一对一的是很重要的。进程可能直接和其它进程通过已知的IPCE通信。邮件是一个应用程序或进程间通信。邮件可以通过连接在不同IPCE上的进程跨网络进行邮件传送。更特别的是,邮件可以通过不同网络上的主机接力式传送。 2. SMTP模型 SMTP设计基于以下通信模型:针对用户的邮件请求,发送SMTP建立与接收SMTP之间建立一个双向传送通道。接收SMTP可以是最终接收者也可以是中间传送者。SMTP命令由发送SMTP发出,由接收SMTP接收,而应答则反方面传送。 一旦传送通道建立,SMTP发送者发送MAIL命令指明邮件发送者。如果SMTP接收者可以接收邮件则返回OK 应答。SMTP发送者再发出RCPT命令确认邮件是否接收到。如果SMTP接收者接收,则返回OK应答;如果不能接收到,则发出拒绝接收应答(但不中止整个邮件操作),双方将如此重复多次。当接收者收到全部邮件后会接收到特别的序列,如果接收者成功处理了邮件,则返回OK应答。 SMTP提供传送邮件的机制,如果接收方与发送方连接在同一个传送服务下时,邮件可以直接由发送方主机传送到接收方主机;或者,当两者不在同一个传送服务下时,通过中继SMTP服务器传送。为了能够对SMTP服务器提供中继能力,它必须拥有最终目的主机地址和邮箱名称。 MAIL命令参数是回复路径,它指定邮件从何处来;而RCPT命令的参数是转发路径的,它指定邮件向何处去。向前路径是源路径,而回复路径是返回路径(它用于发生错误时返回邮件)。 当同一个消息要发往不同的接收者时,SMTP遇到了向不同接收者发送同一份数据的复制品的问题,邮件命令和应答有一个比较奇怪的语法,应答也有一个数字代码。在下面,例子中可以看到哪些使用实际的命令和应答。完整的命令和应答在第四节。 命令与应答对大小写不敏感,也就是说,命令和应答可以是大写,小写或两者的混合,但这一点对用户邮件名称却不一定是对的,因为有的主机对用户名大小写是敏感的。这样SMTP实现中就将用户邮箱名称保留成初始时的样子,主机名称对大小写不敏感。 命令与应答由ASCII字母表组成,当传送服务提供8位字节传送通道,每7位字符正确传送,而最高位被填充为0。当指定一般的命令或应答格式后,参数会由一些类似于语言的字符串表示出来,如""或"",这里尖括号表示这是一种类似于语言的变量。 3. SMTP过程 本节提供了SMTP中的一些过程。头一个说明的是基本发送过程(定义为发送操作)。下来描述向前传送邮件,确认邮箱名称和扩展邮件列表,发送到终端和打开关闭交换。在本节的最后是对中断,邮件域的说明。本节的例子只是一部分命令和应答的序列,完整的例子见附录F。 3.1. MAIL 在SMTP发送操作中有三步,操作由MAIL命令开始给出发送者标识。一系列或更多的RCPT命令紧跟其后,给出了接收者信息,然后是DATA命令列出发送的邮件内容,最后邮件内容指示符确认操作。

POP3与SMTP协议

POP3协议 POP3,全名为“Post Office Protocol - Version 3”,即“邮局协议版本3”。是TCP/IP协议族中的一员,由RFC 1939 定义(见 Reference/rfc1939 pop3.html)。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。提供了SSL加密的POP3协议被称为POP3S。 使用telnet 连接pop3 最直观的了解什么是POP3,我觉得采用telnet的方式用pop3连接到邮件服务器,进行邮件的接收是最有效的。 打开终端,(C:client, S:Server) C: telnet https://www.doczj.com/doc/f5952853.html, 110 (用telnet方式连接163的pop3服务器,pop3协定端口为110) S: Trying 202.108.5.100... Connected to https://www.doczj.com/doc/f5952853.html,. Escape character is '^]'. +OK Welcome to coremail Mail Pop3 Server (163coms[3d8c1fa079729fb6acc588e66d30360es]) (服务器通常开头返回+OK表示正确的回应,+ERR表示所发命令有误) C: USER ***** (***处输入你的邮件用户名) S: +OK core mail (表示接受) C: PASS ***** (***处输入密码,这里都是明文显示) S: +OK 5 message(s) [9782 byte(s)] (这里表示服务器接受该帐户,服务器上对应有5封邮件,总大小9782个字节) C:LIST (LIST 命令列出每一封邮件的信息,己每封邮件对应的ID 号和大小) S: +OK 5 9782 1 1298 2 1311 3 1224 4 1312 5 4637 . C: TOP 1 0 (格式 TOP num 0, num代表邮件ID号,返回该邮件的头部信息) S:+OK 1298 octets (服务器接受) Received: from https://www.doczj.com/doc/f5952853.html, (unknown [221.10.25.6])

SMTP与POP协议简析

SMTP、POP协议简析 作者:李鹏博 时间:2016/06

1.SMTP协议与POP协议说明 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。 POP(Post Office Protocol)即邮局协议,用于电子邮件的接收。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。本文只介绍POP3。 2.SMTP协议简析 通过抓包,可以看到清晰的服务器与客户端的交流过程。如下图。 如上图,将整个流程分为三部分:握手阶段、认证阶段、发送数据阶段。其中TCP三次握手在上图中未体现,握手成功后,进入认证阶段。 SMTP命令字说明 HELO客户端为标识自己的身份而发送的命令(通常带域名) EHLO使服务器可以表明自己支持扩展简单邮件传输协议(ESMTP) 命令。

MAIL FROM标识邮件的发件人;以MAIL FROM: 的形式使用。 RCPT TO标识邮件的收件人;以RCPT TO: 的形式使用。 DATA客户端发送的、用于启动邮件内容传输的命令。 RSET使整个邮件的处理无效,并重置缓冲区。 QUIT终止会话。 对于服务器的每个回复,都有一个返回码,这个返回码标志着上次的请求操作完成状态。如果第一个数字是2表示操作成功;3表示操作正在进行;5表示操作失败。 握手阶段 认证阶段 握手成功后,邮件服务器(上面示例是163的邮件服务器)会发送欢迎连接信息。然后是客户端HELO(或EHLO),向服务器标识用户身份;接下来进行认证操作。认证成功后,客户端告诉服务器这封邮件从哪个邮箱来,到哪个邮箱去,mail from只有一个,但是recpt to 后面可以跟多个收件人地址。成功后,客户端请求发送邮件数据。 数据发送阶段 服务器回复DATA命令后,会有一个结束符说明。如上图,就是以.结束邮件DATA。其中即为“\r\n”; 数据内容规格一般是按照MIME协议生成,具体参见《MIME协议的内容分析及解析说明》。 数据发送完成后客户端以QUIT命令主动退出。邮件发送完成,流程结束。 3.POP协议简析 POP命令字说明 USER <用户名> 用户登录。 PASS <密码> 发送用户密码。 STAT返回邮箱列表(邮件数量、字节)。 LIST 返回邮件数量和每个邮件的大小。 UIDL 返回邮件的唯一标识符,pop3会话的每个标识符都将是唯一的。 RETR <邮件编号> 传回指定的邮件,以只有一个“.”号的行结束。 QUIT关闭连接。 服务器命令回应的第一行以“+OK”或“-ERR”(+OK指成功,-ERR指失败)指出相应的操作状态是成功还是失败。

利用SMTP协议收发邮件

利用SMTP协议收发邮件 摘要 电子邮件可以达成发信人和收信人之间的信息交互。SMPT协议用来进行邮件的发送,本文分析了SMTP协议的目的意义和通信模型, 详细说明了它的命令和应答程序。并通过直接使用SMTP协议命令而在程序中实现电子邮件传送的方法。并在此基础上结合VC++ 6. 0的编程实现了接收和发送电子邮件。 关键字:SMTP协议;收发邮件;编程

目录 摘要 (1) 第一章背景知识概述 (3) 1.1 电子邮件 (3) 1.2 电子邮件体系结构和服务功能 (3) 第二章SMTP协议 (4) 2.1 SMTP协议目的及意义 (4) 2.2 SMTP协议工作原理 (4) 2.3 SMTP协议的命令和应答 (5) 第三章VC++6.0 中实现收发电子邮件 (6) 3.1 发送邮件类SMTPMail (6) 3.1.1 主要函数功能介绍 (6) 3.1.2 邮件发送程序 (7) 3.2 接收邮件 (9) 3.2.1 初始化MAPI (9) 3.2.2阅读电子邮件 (10) 3.2.3 读取电子邮件程序 (10) 第四章结论与心得体会 (11) 4.1结论 (11) 4.2 心得体会 (11) 参考文献 (11)

第一章背景知识概述 1.1电子邮件 电子邮件(E-mail,又称电子函件、电邮或邮件)是指通过互联网进行书写、发送和接收信件,目的是达成发信人和收信人之间的信息交互。电子邮件,electronic mail,简称 E-mail,标志是@,,又称电子信箱、电子邮政,电子邮件指用电子手段传送信件、单据、资料等信息的通信方法,通过网络的电子邮件系统,用户可以用低廉的价格、以快速的方式,与任何一个网络用户联系,这些电子邮件可以是文字、图象、声音等各种方式。 1.2电子邮件体系结构和服务功能 电子邮件系统主要分为两个子系统: 服务器系统和客户端系统。服务器系统的主要功能是实现电子邮件在Internet中的传输, 客户端系统的主要功能是发送电子邮件和接收电子邮件。电子邮件的工作原理遵循客户/ 服务器模式, 电子邮件的发送要涉及到发送方和接受方, 发送方构成客户端, 而接收方则为服务器。当发送方编辑好一份电子邮件。依照收件人的地址将其发送出去; 接收方服务器收到电子邮件后, 先将其存放在电子邮箱中, 并告知收件人有新邮件到来。发送方的主机与接收方的邮件服务器直接相连。 图1-1 SMTP交互命令模型 Figure. 1-1 SMTP command interaction model

SMTP及POP3协议分析

网络协议分析与设计实验报告 实验名称:实验六SMTP及POP3协议分析 班级:姓名:学号: 实验地点:日期:2012年10 月20 日 一、实验目的: 1.掌握SMTP协议和POP协议的工作原理和工作过程 2.掌握SMTP协议和POP协议的常用命令 二、实验环境: 1.联网并运行SimpleNPTS软件的PC机 2.已配置好的SMTP和POP3服务器 3.安装了邮件客户端程序(如Outlook Express)的工作站 三、实验内容和要求: 1、捕获并分析SMTP协议工作过程中发送和接收的报文 2、捕获并分析POP3协议工作过程中发送和接收的报文 3、在与邮件服务器建立的TCP连接上发送SMTP和POP3命令,实现邮件的发送和接收 4、构造并发送SMTP报文 5、构造并发送POP3报文 四、实验步骤: 1、开启网络协议分析软件,设置过滤器为只捕获SMTP和POP3协议报文。 2、在一个支持SMTP发送邮件、POP3接收邮件的邮件服务器上申请一个邮箱,然后按照已 申请的邮箱信息对邮件客户端软件进行配置。 3、使用邮件客户软件创建并发送一封邮件,利用网络协议软件捕获并分析SMTP报文和 SMTP服务器的响应报文。 4、使用邮件客户软件从自己的邮箱中接收邮件,利用网络协议软件捕获并分析POP报文和 POP3服务器的响应报文。 5、利用TCP连接工具与SMTP服务器建立TCP连接,然后在该连接上使用SMTP命令来发 送邮件。捕获并分析该过程中发送和接收的SMTP报文。 6、利用TCP连接工具与POP3服务器建立TCP连接,然后在该连接上使用POP3命令来接 收邮件。捕获并分析该过程中发送和接收到的POP3报文。 7、编辑并发送POP3报文,以实现登录到POP3服务器。

计算机网络应用 SMTP协议

计算机网络应用SMTP协议 简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)是一种电子邮件协议,它既具有客户端(发送方)发送邮件的功能,又具有服务器(接收方)接收邮件的功能。SMTP 协议允许将电子邮件从一个计算机邮件服务器发送到另一个计算机邮件服务器,并且SMTP 服务器接收本地用户发送的邮件,以便将其传输到互联网中其他邮件服务器上。 在互联网中,大多数计算机系统通过本地邮件系统服务器在本地按路径发送电子邮件。SMTP发送程序从输出邮件队列中得到邮件报文,通过多个TCP连接将邮件报文传输到目标主机的25号端口上。在发送过程中,SMTP接收程序必须能够证实本地邮件目的地址,并处理各种差错,包括传输差错以及没有足够接收空间等。 SMTP发送程序对报文的作用直到SMTP接收程序指示传输完成才结束,因此SMTP协议的作用范围仅限于SMTP发送程序和SMTP接收程序之间的对话过程。SMTP协议的主要功能是传送报文,为了保证正确传送报文,SMTP协议规定了14条命令和21种响应信息。其中,每条命令由一行文本组和四个字母的命令组成;而每一种响应信息由一个三位数据代码和简单的文字说明组成。下面介绍SMTP协议通信过程中,各阶段主要用到的命令和响应信息。 1.建立连接 邮件发送方将需要发送的邮件发送到邮件缓存中,SMTP发送程序将每隔一定时间对邮件缓存进行扫描。如果缓存有未发送的电子邮件,则使用SMTP程序端口号与目的计算机的SMTP服务器建立连接。 建立连接后,发送方将发送“220 Service ready(服务就绪)”的信息,并向SMTP服务器发送用来标识自己的HELLO命令。当接收方的SMTP程序接收到发送方所发送的信息后,则返回响应信息“250 OK(一切正常)”,以便接收发送方SMTP发送程序的身份标识。如果接收方的邮件服务器不可用,则返回响应信息“421 Service not available(服务不可用)”。2.传输邮件 当连接建立成功后,SMTP发送程序将向SMTP接收程序发送邮件报文信息。邮件报文传送包括以下三个逻辑阶段: ●用一个EAIL命令标识出邮件报文的发送方。例如,MAIL FROM: 。 ●用一个或者多个RCPT命令标识该邮件报文的接收方。例如,RCPT TO: <收信人电子 邮箱地址>。 ●用一个DATA命令标识该邮件报文的内容。 发送MAIL命令后,如果SMTP服务器已经做好接收邮件的准备,则返回响应信息“250 OK(一切正常)”。否则,返回有关无法接收邮件原因的响应信息,例如451(处理时出错)、452(存储空间不够)、500(命令无法识别)等。 RCPT命令标识邮件接收方的电子邮箱地址,多次使用该命令能够为邮件指定多个接收者,并且每个RCPT命令都会返回一个单独的响应信息。例如“550 No such user here(无此用户)”,即不存在此电子邮箱地址。RCPT命令的作用是:先检测SMTP接收服务器是否做好接收邮件的准备,然后在进行邮件传输。 3.关闭连接 邮件发送完毕后,发送方SMTP服务器程序将发送QUIT命令。当接收方SMTP服务器程序返回响应信息“211(服务关闭)”时,表明接收方SMTP服务器程序同意关闭TCP连接。

SMTP及POP3协议分析

网络协议分析与设计实验报告 实验名称: 实验六SMTP及POP3协议分析 班级: 姓名: 学号: 实验地点: 日期: 2012年10 月20 日 一、实验目的: 掌握SMTP协议和POP协议的工作原理和工作过程 掌握SMTP协议和POP协议的常用命令 二、实验环境: 联网并运行SimpleNPTS软件的PC机 已配置好的SMTP和POP3服务器 安装了邮件客户端程序(如Outlook Express)的工作站 三、实验内容和要求: 1、捕获并分析SMTP协议工作过程中发送和接收的报文 2、捕获并分析POP3协议工作过程中发送和接收的报文 3、在与邮件服务器建立的TCP连接上发送SMTP和POP3命令,实现邮件的发送和接收 4、构造并发送SMTP报文 5、构造并发送POP3报文

四、实验步骤: 开启网络协议分析软件,设置过滤器为只捕获SMTP和POP3协议报文。 在一个支持SMTP发送邮件、POP3接收邮件的邮件服务器上申请一个邮箱,然后按照已申请的邮箱信息对邮件客户端软件进行配置。 使用邮件客户软件创建并发送一封邮件,利用网络协议软件捕获并分析SMTP报文和SMTP 服务器的响应报文。 使用邮件客户软件从自己的邮箱中接收邮件,利用网络协议软件捕获并分析POP报文和POP3服务器的响应报文。 利用TCP连接工具与SMTP服务器建立TCP连接,然后在该连接上使用SMTP命令来发送邮件。捕获并分析该过程中发送和接收的SMTP报文。 利用TCP连接工具与POP3服务器建立TCP连接,然后在该连接上使用POP3命令来接收邮件。捕获并分析该过程中发送和接收到的POP3报文。 编辑并发送POP3报文,以实现登录到POP3服务器。 五、实验结果与分析(含程序、数据记录及分析和实验总结等): 1、SMTP报文是如何封装的?邮件客户端软件在发送邮件时,向SMTP服务器发送了哪些SMTP报文?SMTP服务器的响应信息是什么?请列出上述SMTP报文和SMTP服务器的响应信息。 依次封装在tcp报文的数据区域,ip数据包的数据区域,以太网帧的数据区域。 三次握手建立连接 00 0F E2 45 B9 C2 00 E5 7C 07 DF 45 08 00 45 00 00 40 CE F2 40 00 40 06 79 87 0A 84 FE 9F DC B5 0C 65 08 B7 00 6E 93 9D 52 22 00 00 00 00 B0 02 FF FF 54 DB 00 00 02 04 05 B4 01 03 03 03 01 01 08 0A 00 00 00 00 00 00 00 00 01 01 04 02 0C 2、POP3报文是如何封装的?在使用邮件客户端软件接收邮件时,向POP3服务器发送了哪些POP报文?POP3服务器的响应信息是什么?请列出上述POP3报文和POP3服务器的响应信息。 依次封装在tcp报文的数据区域,ip数据包的数据区域,以太网帧的数据区域。 三次握手建立连接 00 E5 7C 07 DF 45 00 0F E2 45 B9 C2 08 00 45 00 00 34 00 00 40 00 35 06 53 86 DC B5 0C 65 0A 84 FE 9F 00 6E 08 B7 6B 9C 45 4F 93 9D 52 23 80 12 16 D0 C6 21 00 00 02 04 05 B4 01 01 04 02 01 03 03 07 00 3、给出利用TCP连接工具与SMTP/POP3服务器建立TCP连接后,利用SMTP/POP3命令发送和接收电子邮件时,使用的SMTP/POP3命令和服务器的相应响应,并对这个过程中发送和接收的报文进行解释。 00 E5 7C 07 DF 45 00 0F E2 45 B9 C2 08 00 45 00 00 34 00 00 40 00 35 06 53 86 DC B5 0C 65 0A 84

相关主题
文本预览
相关文档 最新文档