描述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。

使用SMTP发送电子邮件相关推荐

  1. 在Python中使用SMTP发送电子邮件

    Python中有内置的smtplib模块,完成一封邮件的发送,需要做很多准备工作.第三方的py_smtp这个包也是基于smtplib的,在Python中使用py_smtp发送电子邮件非常方便,只要填写 ...

  2. WordPress配置SMTP发送电子邮件(QQ邮箱)

    Wordpress通过PHP自带的mail函数实现电子邮件的发送成功率极低,现有的各类邮箱,例如QQ邮箱.新浪邮箱.163邮箱等,基本不支持PHP语言的mail函数实现的邮件发送,因此,需要配置基于S ...

  3. C# 网络编程之基于SMTP发送电子邮件

     本文主要讲述基于C#网络编程的发送邮件的编程,邮件发送功能是基于邮件协议的,常见的电子邮件协议有SMTP(简单邮件传输协议).POP3(邮局协议).IMAP(Internet邮件访问协议),文章主要 ...

  4. java smtp_java通过smtp发送电子邮件

    packagecom.sm.modules.oa.web;importjavax.mail.Session;importjavax.mail.Transport;importjavax.mail.in ...

  5. java通过smtp发送电子邮件,部分解决554 DT:SPM 163问题

    package com.sm.modules.oa.web;import javax.mail.Session; import javax.mail.Transport; import javax.m ...

  6. GO(golang)语言使用SMTP发送电子邮件,简单和复杂带附件cc,bcc

    转https://studygolang.com/articles/2098 核心代码:smtp.SendMail(host, auth, user, send_to, msg),auth := sm ...

  7. php gmail smtp,使用PHP通过Gmail SMTP发送电子邮件

    我一直使用 PHPMailer来满足我的所有邮件需求. 它已经内置支持GMail作为服务器(并且它是免费的) 我认为您的问题是您尝试使用PHP的邮件设置而不是PHPMailer 确保您具有以下设置: ...

  8. 利用python SMTP 发送电子邮件

    python 发送邮件!!! 直接发代码! 不会有bugk哦

  9. iphone发送邮件html,iPhone使用smtp服务器发送电子邮件?

    在我的应用程序中,我能够使用smtp服务器发送电子邮件,因为我输入了正确的电子邮件ID和密码. 但当我输入我的Gmail或雅虎帐户详细信息时,我无法发送邮件. 因为我设置了relayHost = @& ...

最新文章

  1. 读书:个人成长 -- 即兴演讲
  2. 搭建服务器集群——Windows7系统中nginx与IIS服务器搭建集群实现负载均衡
  3. Python中range和xrange的区别
  4. ajaxToolKit中 的折叠面板用法--Accordion
  5. CentOS 7 yum方式快速安装MongoDB
  6. 网络知识:路由器不关闭这个功能,视频越刷越卡!
  7. android--Activity有返回值的跳转
  8. 了解 C# foreach 内部语句和使用 yield 实现的自定义迭代器
  9. 右移函数(字符串,数组)
  10. CEF3:https 请求返回状态码canceled
  11. 旷视Face++回清华求教AI本质创新,姚期智授2锦囊,出任首席顾问
  12. day6面向对象--继承、多态
  13. Julia: Beginning deep learning with 500 lines of Julia
  14. 个人项目集 - Oliver Chu
  15. 中职生计算机求职信350,护士求职信350字
  16. Flutter插件shared_preferences数据存储的使用
  17. 关于hibernate检索策略
  18. flink 的用途 场景
  19. 单利 java_JAVA中的单利
  20. 世界上最远的距离——泰戈尔

热门文章

  1. 《3D Point Cloud Registration for Localization using a Deep Neural Network Auto-Encoder》读书笔记
  2. Mysterious Organization
  3. 数据库原理-SQL Server版(期末复习)
  4. HoloLens2之路-配置文件(一)
  5. 判断两个数是否互为素数(质数)
  6. python图灵测试_图灵测试对话
  7. 微信开发网页授权的两种方式
  8. VxWorks的VxBus驱动
  9. 一分钟明白 VS manifest 原理
  10. 真有那么大差距?— iPhone XR 屏幕素质报告