smtp协议使用
篇一:利用SMTP协议收发邮件
利用SMTP协议收发邮件
摘 要
电子邮件可以达成发信人和收信人之间的信息交互。
SMPT 协议用来进行邮件的发送,本文分析了SMTP 协议的
目的意义和通信模型, 详细说明了它的命令和应答程序。并
通过直接使用SMTP协议命令而在程序中实现电子邮件传
送的
。并在此基础上结合VC++ 6. 0的编程实现了接收
和发送电子邮件。
关键字:SMTP协议;收发邮件;编程
目录
摘
要 .................................................................................................
...................... 1
第一章 背景知识概
述 ............................................................................................. 3
1.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 接收邮
件 .................................................................................................
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,简称
3
E-mail,标志是@,,又称电子信箱、电子邮政,电子邮件指用电子手段传送信件、单据、资料等信息的通信方法,通过网络的电子邮件系统,用户可以用低廉的价格、以快速的方式,与任何一个网络用户联系,这些电子邮件可以是文字、图象、声音等各种方式。
1.2 电子邮件体系结构和服务功能
电子邮件系统主要分为两个子系统: 服务器系统和客户端系统 。服务器系统的主要功能是实现电子邮件在Internet中的传输, 客户端系统的主要功能是 发送电子邮件和接收电子邮件。电子邮件的工作原理遵循客户/ 服务器模式, 电子邮件的发送要涉及到发送方和接受方, 发送方构成客户端, 而接收方则为服务器。当发送方编辑好一份电子邮件。依照收件人的地址将其发送出去; 接收方服务器收到电子邮件后, 先将其存放在电子邮箱中, 并告知收件人有新邮件到来。发送方的主机与接收方的邮件服务器直接相连。
图1-1 SMTP交互命令模型
Figure. 1-1 SMTP command interaction model
第二章 SMTP协议
2.1 SMTP协议目的及意义
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,是一种提供可靠且有效电子邮件传输的协议。SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于传
4
输系统之间的邮件信息并提供与来信有关的
。SMTP目前已是事实上的在Internet传输SMTP服务器,需要使用MX(Mail exchange)DNS。
SMTP提供一种可靠的有效的传送机制,它用于传送电子邮件。SMTP服务的意义是在SMTP转发的邮件中包括信封和内容这两种东西。内容是由两部分组成的,一部分是信头,一部分是信体,信头是由一个个的域/值对(一个域,一个值)组成的,如果信体有结构的话,它的结构是以MIME构造的。
2.2 SMTP协议工作原理
SMTP是工作在两种情况下:一是电子邮件从客户机传输到服务器:二是从某一个服务器传输到另一个服务器。SMTP也是个请求/响应协议,命令和响应都是基于ASC?文本,并以CR和LF符结束。响应包括一个表示返回状态的三位数字代码。SMTP在TCP协议25号端口监听连续请求。SMTP连接和发送过程如下:
1)建立TCP 连接。
2)客户端发送HELLO命令以标识发件人自己的身份,然后客户端发送MAIL命令;服务器端正希望以OK作为响应,表明准备接收。
3)客户端发送RCPT命令,以标识该电子邮件的
接收人;服务器端则表示是否愿意为收件人接收邮件。
5
4)协商结束,发送邮件,用命令DATA发送。
5)以“.”号表示结束输入内容一起发送出去,结束此次发送,用QUIT命令退出。 SMTP的实现模型如下图所示。
图2-1 SMTP的实现模型
Figure 2-1 SMTP implementation model
2.3 SMTP协议的命令和应答
SMTP邮件数据包括三部分:命令、应答和报文数据。SMTP命令用于从客户进程向服务器进程发送服务请求;SMTP应答用于使客户进程知道服务器进程的接收状态,以确保在邮件传输过程中对话同步;SMTP报文数据包含报文的正文内容由任意长度的ASCII字符序列组成,以单行的据点作为结束标志。命令与应答必须是一对一的交互传输过程。SMTP的命令集如下表所示。
表2-1 SMTP的命令集
Table 2-1 SMTP command set
篇二:SMTP协议详解
SMTP协议分析
第1章SMTP概述
1.1 SMTP在邮件通信中的位置 SMTP,即简单邮件传送协议,所对应RFC文档为RFC821。同http等多数应用层协议一样,它工作在C/S模式下,用来实现因特网上的邮件传送。SMTP在整个电子邮件通信中所处的位置如图
6
1所示。
图 1电子邮件的通信过程
可以看出,SMTP是用来将客户机上的邮件传送到服务器上。这里的客户机是指某次连接中的发送方,服务器是指相应的接收方。在讲解发送邮件的整个通信过程前,先解释一下面几个术语。
1.2几个术语
1.2.1.邮件
邮件是一种消息的格式,由信封、首部和正文组成。
信封上最重要的是收信人的地址。邮件服务器用这个地址将邮件发送到收信人所在的邮件服务器上。
首部是由用户代理或邮件服务器添加的一些信息。包括Received、Message-ID、From、Data、Reply-To、X-Phone、X-Mailer、To和Subject等字段。
正文是是发送用户发给接收用户报文的内容。RFC 822 规定正文为NVT ASCII文字行。
更为详细的说明,请参考RFC821和RFC822等协议。
1.2.2.用户代理 用户代理UA(User Agent)是用户与电子邮件系统的交互接口,一般来说它就是我们PC机上的一个程序。Windows上常见的用户代理是Foxmail和Outlook Express。
用户代理提供一个好的用户界面,它提取用户在其界面填
7
写的各项信息,生成一封符合SMTP等邮件标准的邮件,然后采用SMTP协议将邮件发送到发送端邮件服务器。
1.2.3.邮件服务器
邮件服务器是电子邮件系统的核心,它用来发送和接收邮件。邮件服务器不同于普通PC的是它几乎是全天工作的,所以它可以在任何时候为用户提供服务,后面将提到这正是为什么需要邮件服务器的一个重要原因。很多ISP都提供免费的邮件服务器,如126提供smtp.126.com邮件服务器。
邮件服务器向其它邮件服务器转发邮件也是采用SMTP协议。
1.3 邮件的收发过程 一般情况下,一封邮件的发送和接收过程如下。
1) 发信人在用户代理里编辑邮件,包括填写发信人邮箱、收信人邮箱和邮件标
等等。
2) 用户代理提取发信人编辑的信息,生成一封符合邮件格式标准
(RFC822)的邮件。
3) 用户代理用SMTP将邮件发送到发送端邮件服务器(即发信人邮箱所对应的邮件服务器)。
4) 发送端邮件服务器用SMTP将邮件发送到接收端邮件服务器(即收信人邮箱所对应的邮件服务器)。
5) 收信人调用用户代理。用户代理用POP3协议从接收
8
端邮件服务器取回邮件。
6) 用户代理解析收到的邮件,以适当的形式呈现在收信人面前。
第2章.SMTP详解
2.1.通信过程
一个具体的SMTP通信(如发送端邮件服务器与接收端服务器的通信)的过程如下。
1) 发送端邮件服务器(以下简称客户端)与接收端邮件服务器(以下简称服务器)的25号端口建立TCP连接。
2) 客户端向服务器发送各种命令,来请求各种服务(如认证、指定发送人和接收人)。
3) 服务器解析用户的命令,做出相应动作并返回给客户端一个响应。 4) 2)和3)交替进行,直到所有邮件都发送完或两者的连接被意外中断。
从这个过程看出,命令和响应是SMTP协议的重点,下面将予以重点讲述。
2.2.命令和响应
2.2.1.格式 SMTP的命令不多(14个),它的一般形式是:COMMAND [Parameter] <CRLF。其中COMMAND是ASCII形式的命令名,Parameter是相应的命令参数,<CRLF是回车换行符(0DH, 0AH)。
SMTP的响应也不复杂,它的一般形式是:XXX
9
Readable Illustration。XXX是三位十进制数;Readable Illustration是可读的解释说明,用来表明命令是否成功等。XXX具有如下的规律:以2开头的表示成功,以4和5开头的表示失败,以3开头的表示未完成(进行中)。
2.2.2.一个例子 命令和响应的格式是语法,各命令和响应的意思则是语义,各命令和各响应在时间上的关系则是同步。下面将通过一个简单的SMTP通信过程来说明协议的这三个要素。
C:telnet smtp.126.com 25/* 以telnet方式连接126邮件服务器 */
S:220 126.com Anti-spam GT for Coremail System
(126com[071018]) /* 220为响应数字,其后的为欢迎信息,会应服务器不同而不同*/
C:HELO smtp.126.com /* HELO 后用来填写返回域名(具体含义请参阅RFC821),但该命令并不检查后面的参数 */
,:250 OK
C: MAIL FROM: bripengandre@126.com /* 发送者邮箱 */
S:250 ? ./* “?”代表省略了一些可读信息 */
C:RCPT TO: bripengandre@smail.hust.edu.cn /* 接收者邮箱 */
10
S:250 ? ./* “?”代表省略了一些可读信息 */
C:DATA /* 请求发送数据 */
S:354 Enter mail, end with . on a line by itself
C:Enjoy Protocol Studing
C:.
S:250 Message sent
C:QUIT /* 退出连接 */
S:221 Bye
分析上面的过程可参考注释进行,这里要补充如下几点。
1) “C:”开头的行(不包括C:)是客户端的输入,而以“S:”
开头的行(不包括S:)则是服务器的输出。
2) 上述的命令并不一定会一次性成功,服务器会返回错误响应,客户端应该按照协议规定的时序,来输入后续的命令(或重复执行失败的命令,或重置会话,或退出会话等等)。
2.2.3.常用命令
SMTP命令不区分大小写,但参数区分大小写,有关这方面的详细说明请参考RFC821。常用的命令如下。
HELO <domain <CRLF。向服务器标识用户身份发送者能欺骗,说谎,但一般情况下服务器都能检测到。
MAIL FROM: <reverse-path <CRLF。<reverse-path为发送者地址,此命令用来初始化邮件传输,即用来对所有的状态和缓冲区进行初始化。
11
RCPT TO:<forward-path <CRLF。 <forward-path用来标志邮件接收者的地址,常用在MAIL FROM后,可以有多个RCPT TO。
DATA <CRLF。将之后的数据作为数据发送,以<CRLF.<CRLF标志数据的结尾。
REST <CRLF。重置会话,当前传输被取消。
NOOP <CRLF。要求服务器返回OK应答,一般用作测试。
QUIT <CRLF。结束会话。
VRFY <string <CRLF。验证指定的邮箱是否存在,由于安全方面的原因,服务器大多禁止此命令。
EXPN <string <CRLF。验证给定的邮箱列表是否存在,由于安全方面的原因,服务器大多禁止此命令。
HELP <CRLF。查询服务器支持什么命令。
2.2.4.常用响应 常用的响应如下所示,数字后的说明是从英文译过来的。更详细的说明请参考RFC821。
501参数格式错误
502命令不可实现
503错误的命令序列
504命令参数不可实现
211系统状态或系统帮助响应
214帮助信息
12
220,domain,服务就绪
221,domain,服务关闭
421,domain,服务未就绪,关闭传输信道
250要求的邮件操作完成
251用户非本地,将转发向,forward-path,
450要求的邮件操作未完成,邮箱不可用
550要求的邮件操作未完成,邮箱不可用
451放弃要求的操作;处理过程中出错
551用户非本地,请尝试,forward-path,
452系统存储不足,要求的操作未执行
552过量的存储分配,要求的操作未执行
553邮箱名不可用,要求的操作未执行
354开始邮件输入,以.结束
554操作失败
第3章.SMTP的扩充3.1.SMTP的缺点
从2.2.2的例子可以看出,SMTP至少还有如下缺点。
1) 命令过于简单,没提供认证等功能。
2) 只传送7位的ASCII码,不能传送二进制文件。
针对缺点1),标准化组织制定了扩充的SMTP(即ESMTP),对应的RFC文档为RFC1425。针对缺点2),标准化组织在兼容SMTP的前提下,提出了传送非7位ASCII码的方法,对应的RFC文档有两个:邮件首部的扩充对应
13
于RFC1522,邮件正文的扩充对应与RFC1521(即MIME)。
3.2.ESMTP ESMTP最显著的地方是添加了用户认证功能。如果用户想使用ESMTP提供的新命令,则在初次与服务器交互时,发送的命令应该是EHLO而不是HELO。先来看一个例子。
C:telnet smtp.126.com 25/* 以telnet方式连接126邮件服务器 */
S:220 126.com Anti-spam GT for Coremail System
(126com[071018]) /* 220为响应数字,其后的为欢迎信息,会应服务器不同而不同*/
C:EHLO smtp.126.com /* 除了HELO所具有的功能外,EHLO主要用来查询服务器支持的扩充功能 */ S:250-mail
S:250-AUTH LOGIN PLAIN
S:250-AUTH=LOGIN PLAIN
S:250 8BITMIME /* 最后一个响应数字应答码之后跟的是一个空格,而不是'-' */
C:AUTH LOGIN /* 请求认证 */
S:334 dxNlcm5hbWU6 /* 服务器的响应——经过base64编码了的“Username” */
C:Y29zdGFAYW1heGl0Lm5ldA== /* 发送经过BASE64编码了的用户名 */
S:334 UGFzc3dvcmQ6 /* 经过BASE64编码了的
14
Password: */
C:MTk4MjIxNA== /* 客户端发送的经过BASE64编码了的密码 */
S:235 auth successfully /* 认证成功 */
C: MAIL FROM: bripengandre@126.com /* 发送者邮箱 */
S:250 ? ./* “?”代表省略了一些可读信息 */
C:RCPT TO: bripengandre@smail.hust.edu.cn /* 接收者邮箱 */
S:250 ? ./* “?”代表省略了一些可读信息 */
C:DATA /* 请求发送数据 */
S:354 Enter mail, end with . on a line by itself
C:Enjoy Protocol Studing
C:.
S:250 Message sent
C:QUIT /* 退出连接 */
S:221 Bye
对于这个例子有如下几点说明。
篇三:SMTP协议发邮件流程
用C++发邮件
近段时间,实验室电脑的IP频繁地改变,搞得想用远程偷下懒都不行。这时想到的解决方法有:静态IP,动态域名,
15
自己解决。静态IP虽然可以自己指定,但一关机后,与对方冲突就完了,作罢。免费的动态域名又要手机认证,也作罢。最后只能自己解决。解决
是写一个程序不断地检测本机IP,如果改变了,就发邮件通知。检测本机IP很简单,就略过。这里介绍下怎样发邮件吧。
发邮件前,需要理解SMTP(Simple Mail Transfer
Protocol)。SMTP是电子邮件从客户机传输到服务器或从某一个服务器传输到另一个服务器使用的传输协议。SMTP 是请求/响应协议,命令和响应都是基于 ASCII 文本,并以 CR 和 LF 符结束。响应包括一个表示返回状态的三位数字代码。在 TCP 协议 25 端口监听连接请求。其命令如下:
SMTP命令 命令说明
HELO ,domain,,CRLF, 识别发送方到接收SMTP的一个HELO命令
AUTH LOGIN<CRLF 登陆服务器的命令。在这条命令之后,要发送用Base64编码后的用户名与密码进行登陆
MAIL FROM:,reverse-path,,CRLF, ,reverse-path,为发送者地址。此命令告诉接收方一个新邮件发送的开始,并对所有的状态和缓冲区进行初始化。此命令开始一个邮件传输处理,最终完成将邮件数据传送到一个或多个邮箱中。
RCPT TO:,forward-path,,CRLF, ,forward-path
16
,标识各个邮件接收者的地址
DATA ,CRLF, 接收SMTP将把其后的行为看作邮件数据去处理,以,CRLF,.,CRLF,标识数据的结尾。
REST ,CRLF, 退出/复位当前的邮件传输
NOOP ,CRLF, 要求接收SMTP仅做OK应答。(用于测试)
QUIT ,CRLF, 要求接收SMTP返回一个OK应答并关闭传输。
VRFY ,string,,CRLF, 验证指定的邮箱是否存在,由于安全因素,服务器多禁止此命令。 EXPN ,string,,CRLF, 验证给定的邮箱列表是否存在,扩充邮箱列表,也常禁止使用。 HELP ,CRLF, 查询服务器支持什么命令
17