使用SMTP发送电子邮件 - Go语言中文社区

使用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方便的时候,他调用用户代理阅读该报文。

如下图所示:

下面简单介绍发送邮件时,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: <alice@crepes.fr> 
S:250 alice@crepes.fr  ···  Sender  ok
C:RCPT TO: <bob@hamberger.edu ... Recipient ok
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。

 

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/leopold2015/article/details/83314182
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2019-10-27 19:07:38
  • 阅读 ( 1489 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

推荐文章

猜你喜欢