使用SMTP发送电子邮件

描述SMTP的基本操作,有如下常见的情景。假如Alice想给Bob发送一封简单的ASCII报文:

1)Alice启动她的邮件代理服务器并提供Bob的邮件地址(例如:***@163.com),撰写邮件,通过用户代理发送该邮件。

2)Alice的用户代理把报文发送给Alice的邮件服务器,该邮件再这里被放在报文发送队列中。

3)运行在Alice邮件服务器上的SMTP客户端发现了在报文队列中的该报文,他就创建一个到运行在Bob的邮件服务器上的SMTP服务器的TCP连接。

4)在经过一些初始SMTP握手后,SMTP客户端通过该TCP连接发送Alice的报文。

5)在Bob的有劲啊服务器上,SMTP的服务器接收该报文,Bob的邮件服务器然后将该报文放入Bob的邮箱中。

6)再Bob方便的时候,他调用用户代理阅读该报文。

如下图所示:

使用SMTP发送电子邮件_第1张图片

下面简单介绍发送邮件时,6步操作的具体内容。

SMTP客户机(运行在发送方邮件服务器上)在25号端口建立一个到SMTP的服务器(运行在接收方邮件服务器上)的TCP连接。如果某服务器没有开机,客户机会再稍后继续尝试连接。一旦连接建立,服务器与客户机之间执行一些应用层的握手操作,相互进行自我介绍,然后再发送数据报文。在SMTP握手阶段,SMTP客户机指明发送方的邮件地址(产生报文的用户)和接收方的邮件地址。一旦该SMTP客户机和服务器彼此介绍之后,客户机发送该报文。SMTP能利用TCP提供的可靠数据传输无差错地将邮件投递到服务器。该客户机如果有另外的报文要发送到该服务器,就在该相同的TCP连接上重复当前处理;否则,它指示TCP关闭连接。

SMTP客户机(C)和SMTP服务器(S)之间交换报文脚本的例子:客户机的主机名为crepes.fr,服务器的主机名为hamburger.edu。以c:开头的ASCII码文本行就是客户机交给其TCP套接字的哪些行,以s:开头的ASCII码则是服务器发送给其TCP套接字的哪些行,一旦TCP连接起来,就开始了下列过程:

S:220 hamburger.edu
C:HLo crepes.fr
S:250 Hello crepes.fr, pleased to meet you
C:MAIL FROM:  
S:250 [email protected]  ···  Sender  ok
C:RCPT TO: C:DATA
S:354 Enter mail, end with "." on a line by itself
C:Do you like ketchup?
C:How about pickles?
C:.
S:250 Message accepted for delivery
C:QUIT
S:221 hamburger.edu closing connection

在客户机向服务器发送数据时,客户机向服务器发送了5条命令:HELO(Hello的缩写)、MAIL FROM、RCPT TO、 DATA以及QUIT。这些命令都是自解释的。客户机发送一个只包含一个句点的行,告诉服务器该报文结束了(按照ASCII码的表示方法,每个报文用CRLF.CRLF结束,其中的CR和LF分别表示回车和换行)。需要指出的是SMTP用的是持久连接:如果发送邮件的服务器有几个报文发往同一个接收邮件的服务器,他可以通过同一个TCP连接发送所有这些报文。对每个报文,客户机都用一个新的MAIL FROM:crepes.fr开始,类似,独立的一个句点表示报文发送结束,当所有邮件发送完成后才发送QUIT。

 

 

你可能感兴趣的:(使用SMTP发送电子邮件)