手机版 欢迎访问it开发者社区(www.mfbz.cn)网站

当前位置: > 开发

SMTP-THE SMTP PROCEDURES

时间:2021/5/26 14:45:21|来源:|点击: 次

RFC第三节内容,该节内容大致分为3类

1 基本邮件过程(mail transaction/邮件事务)

2 转发邮件、验证邮箱名称和展开邮件列表、发送到终端而不是邮箱或同时发送给邮箱,以及打开和关闭交换

3 relaying、关于邮件域的说明、关于角色转换的探讨

 

目录

1 Mail

2 Forwarding

3 Verifying and Expanding

4 Sending and Mailing

5 Opening and Closing

6 Relaying

7 Domains

8 Changing Roles

 

1 MAIL

SMTP mail transaction有三个步骤:

第1步 MAIL命令:指定发件人

第2步 RCPT命令:指定收件人(使用多个PCPT命令,指定多个收件人)

第3步 DATA命令:邮件数据(伴随着邮件数据指示符的结束,SMTP mail transaction也结束了)

MAIL

格式: MAIL <SP> FROM:<reverse-path> <CRLF>

1 reverse-path指定发件人

2 该命令通知SMTP-receiver新的邮件事务已经开始并重置其所有状态表和缓冲区,包括任何收件人或邮件数据

3 reverse-path用于接收错误报告

4 如果SMTP-receiver接受则响应250 OK

5 <reverse-path>可以包含多个邮箱

6 <reverse-path>是主机和源邮箱的反向源路由列表

7 <reverse-path>中的第一个主机应该是发送此命令的主机

RCPT

格式: RCPT <SP> TO:<forward-path> <CRLF>

1 forward-path指定收件人

2 如果SMTP-receiver接受则响应250 OK,并保存forward-path

3 如果forward-path是未知的,SMTP-receiver响应550 Failure

4 该过程可以重复多次,指定多个收件人

5 <forward-path>可以包含多个邮箱

6 <forward-path>是主机和目的邮箱的源路由列表

7 <forward-path>中的第一个主机应该是接收此命令的主机

DATA

格式: DATA <CRLF>

1 如果SMTP-receiver接受则响应354 Intermediate,并将随后的所有行视为消息文本

2 当接收和存储文本结束时,SMTP-receiver将发送250 OK

3 由于邮件数据是在传输通道上发送的,因此必须指示邮件数据的结束,以便可以恢复command和reply对话框

4 SMTP通过发送仅包含.的行指示邮件数据的结束

5 透明程序用于防止干扰用户的文本(见4.5.2)

6 邮件数据包括日期、主题...

7 邮件数据指示符的结束同时代表着邮件事务的结束,并告诉SMTP-receiver现在处理存储的收件人和邮件数据

8 只有当邮件事务不完整(例如,没有收件人)或资源不可用时,DATA命令才会失败

示例

主机Alpha.ARPA上的Smith发邮件给主机Beta.ARPA上的Jones, Green,Brown。假设两个主机直连:

S: MAIL FROM:<Smith@Alpha.ARPA>

R: 250 OK

 

S: RCPT TO:<Jones@Beta.ARPA>

R: 250 OK

 

S: RCPT TO:<Green@Beta.ARPA>

R: 550 No such user here

 

S: RCPT TO:<Brown@Beta.ARPA>

R: 250 OK

 

S: DATA

R: 354 Start mail input; end with <CRLF>.<CRLF>

S: Blah blah blah...

S: ...etc. etc. etc.

S: <CRLF>.<CRLF>

R: 250 OK

邮件已经被Jones、Brown接受,Green没有邮箱在Beta.ARPA

 

2 FORWARDING

说明

在某些情况下,<forward-path>中的目标信息是不正确的,但是receiver-SMTP知道正确的目的地。(6 RELAYING中介绍forward-path、reverse-path)

此时可以使用以下的应答之一允许发件人与正确的目的地联系:

251 User not local; will forward to <forward-path>

551 User not local; please try <forward-path>

 

251 User not local; will forward to <forward-path>

1 此答复表示receiver-SMTP知道用户的邮箱位于另一台主机上,并指定后续要使用的正确的forward-path

2 注意,主机或用户或两者都可能不同

3 receiver-SMTP负责传递消息

551 User not local; please try <forward-path>

1 此答复表示receiver-SMTP知道用户的邮箱位于另一台主机上,并指定要使用的正确的forward-path>

2 注意,主机或用户或两者都可能不同

3receiver-SMTP拒绝接受该用户的邮件,sender-SMTP必须根据所提供的信息重定向邮件或向原始用户返回错误响应

示例

S: RCPT TO:<Postel@USC-ISI.ARPA>

R: 251 User not local; will forward to <Postel@USC-ISIF.ARPA>

S: RCPT TO:<Paul@USC-ISIB.ARPA>

R: 551 User not local; please try <Mockapetris@USC-ISIF.ARPA>

 

3 VERIFYING AND EXPANDING

说明

SMTP提供附加功能:验证用户名、展开邮件列表

VRFY命令用于验证用户名

EXPN命令用于展开邮件列表 (邮件列表是一组收件人的集合,它可以表示为一个邮箱地址,向这个地址发送邮件,这个地址会帮你转发给其他用户)

"user name"

"user name"是特别使用的一个模糊术语:

当服务器实现VRFY、EXPN命令时,必须将本地邮箱识别为"user name"

也允许服务器将其他的字符串识别为"user name"

验证邮件列表与展开用户名

在某些主机中,单个邮箱的邮件列表和别名之间的区别有点模糊,因为公共数据结构可能包含两种类型的条目,并且有可能有一个邮箱的邮件列表。

别名可以看成邮箱的一个标识,单个邮箱的邮件列表也可以看成邮件的一个标识

如果请求验证邮件列表,可以响应邮件列表,或报告错误(服务器可以选择如何实现)

例: "550 That is a mailing list, not a user"

如果请求扩展用户名,可以响应一个包含名称的列表,或报告错误(服务器可以选择如何实现)

例: "550 That is a user name, not a mailing list"
EXPN

EXPN响应多行内容时,每一行为一个邮箱

VRFY

对于不明确的请求,则响应"553 User ambiguous"

例: 当服务器存在多个包含Smith的用户时,发送VRFY Smith,则响应"553 User ambiguous"

EXPN示例

S: VRFY Smith

R: 250 Fred Smith <Smith@USC-ISIF.ARPA>

S: VRFY Smith

R: 251 User not local; will forward to <Smith@USC-ISIQ.ARPA>

S: VRFY Jones

R: 550 String does not match anything.

S: VRFY Jones

R: 551 User not local; please try <Jones@USC-ISIQ.ARPA>

S: VRFY Gourzenkyinplatz

R: 553 User ambiguous.

VRFY示例

S: EXPN Example-People

R: 250-Jon Postel <Postel@USC-ISIF.ARPA>

R: 250-Fred Fonebone <Fonebone@USC-ISIQ.ARPA>

R: 250-Sam Q. Smith <SQSmith@USC-ISIQ.ARPA>

R: 250-Quincy Smith <@USC-ISIF.ARPA:Q-Smith@ISI-VAXA.ARPA>

R: 250-<joe@foo-unix.ARPA>

R: 250 <xyz@bar-unix.ARPA>

S: EXPN Executive-Washroom-List

R: 550 Access Denied to You.

 

4 SENDING AND MAILING

mailing与sending区别

SMTP的目的用于投递消到用户的邮箱(邮箱存在于服务器),该过程/行为称之为"mailing"

服务器有着类似"mailing"的服务,称之为"sending"。即服务器将用户邮箱内的邮件发送到用户的终端

因为在许多服务器中"mailing"和"sending"实现几乎相同,因此他们是打包在SMTP中的。但是在SMTP的最低实现中,可以不包含sending命令

用户应该有能力控制其终端上的邮件写入,大多数服务器许用户接受或拒绝此类邮件。

sending选项的三种命令

        SEND <SP> FROM:<reverse-path> <CRLF>

        1 SEND命令要求将邮件数据(mail data)发送给用户的终端

        2 服务器上用户不活跃(服务器检测用户是否处于在线状态)或不接受终端邮件,则向RCPT命令响应450(可能翻译不准确,原文如下)

          If the user is not active (or not accepting terminal messages) on the host a 450 reply may returned to a RCPT command.

        3 如果消息投递到给终端,则邮件事务成功

 

SOML <SP> FROM:<reverse-path> <CRLF>

        1 Send Or MaiL(SOML)命令要求将邮件数据发送给用户终端,当服务器上的用户活跃并且接收终端消息时。

        2 如果用户不活动(或不接受终端消息),则将邮件数据投递到用户的邮箱中。

         ("sending"命令用于代替"mailing"命令进行邮件事务的开始,只不过"mailing"是发送邮件数据到用户邮箱,"sending"命令可以根据情况发送到用户邮箱或用户终端)

        3 如果消息投递到终端或邮箱,则邮件事务成功

 

SAML <SP> FROM:<reverse-path> <CRLF>

       1 Send And MaiL(SAML) 命令要求将邮件数据发送给用户终端,当服务器上的用户活跃并且接收终端消息时。

       2 任何情况下,邮件数据都会被投递到用户邮箱中

       3 如果消息投递到邮箱,则邮件事务成功

MAIL命令的响应代码,也用于以上3种命令

 

 

5 OPENING AND CLOSING

说明

在传输信道打开时发送一个交换来确保对端是期望的主机

打开传输信道命令

HELO <SP> <domain> <CRLF>

该命令用于表示发送者自身

关闭传输信道命令

QUIT <CRLF>

HELO示例

R: 220 BBN-UNIX.ARPA Simple Mail Transfer Service Ready

S: HELO USC-ISIF.ARPA

R: 250 BBN-UNIX.ARPA

QUIT示例

S: QUIT

R: 221 BBN-UNIX.ARPA Service closing transmission channel

 

6 RELAYING

源路由:

源路由的用户可以指定他所发送的数据包沿途经过的部分或者全部路由器

即从发送者到接收者的所经过的路由器

forward-path

forward-path可能是"@ONE,@TWO:JOE@THREE"形式的源路由,其中ONE, TWO, THREE是主机

这种形式用于强调地址和路由之间的区别

邮箱是绝对地址,路由是关于如何到达那里的信息

reverse-path

从概念上讲,当邮件从一个SMTP服务器中继到另个一服务器时,forward-path中元素移动到reverse-path中

reverse-path是一个反向源路由,即从邮件的当前位置到邮件发送者的源路由

当SMTP服务器从forward-path中删除自身标识并插入到reverse-path中时,它必须使用发送到的环境中已知的名称,而不是邮件来自环境的名称,因为SMTP服务器可以在不同环境中使用不同的名称

forward-path第一个元素非当前服务器

如果邮件到达SMTP服务器时,如果forward-path的第一个元素不是当前服务器的标识符,则不会从forward-path中删除元素,而是用于确定要将邮件发送到的下一个SMTP服务器

在任何情况下,SMTP服务器都会将自身的标识符添加到reverse-path

中继

通过使用源路由,receiver-SMTP接收要中继到另一个server-SMTP的邮件

receiver-SMTP可以接受或拒绝转发邮件的任务,就像它接受或拒绝本地用户的邮件一样

receiver-SMTP通过将自己的标识符从forward-path径移到reverse-path的开始来转换命令参数

随后receiver-SMTP成为sender-SMTP,建立到forward-path中下一个SMTP服务器的通道,并将邮件发送给它。

path中的第一个主机

reverse-path中第一个主机应该是发送SMTP命令的主机

forward-path中第一个主机应该是接收SMTP命令的主机

注意:

forward-path和reverse-path出现在SMTP命令和答复中,没有必要出现在邮件中

在邮件头的"To:" , "From:", "CC:"...字段中没有必要出现路径和语法

中继异常

server-SMTP已经接受了中继邮件的任务,随后发现forward-path是错误的或因为其他原因邮件无法投递

此时server-SMTP必须构造一个"undeliverable mail"通知消息,然后将其发送给无法送达邮件的原始发件人(如reverse-path所示)

"undeliverable mail"通知信息必须来自出现问题的服务器的STMP服务,该信息不应该包含所发生问题的相关信息

在错误报告中防止环路的一种方式是在通知消息的MAIL命令中指定空的reverse-path,这类消息中继时是允许保留空reverse-path的

空reverse-path的MAIL命令示例:

           MAIL FROM:<>

中继异常示例

S: MAIL FROM:<>

R: 250 ok

S: RCPT TO:<@HOSTX.ARPA:JOE@HOSTW.ARPA>

R: 250 ok

S: DATA

R: 354 send the mail data, end with .

S: Date: 23 Oct 81 11:22:33

S: From: SMTP@HOSTY.ARPA

S: To: JOE@HOSTW.ARPA

S: Subject: Mail System Problem

S:

S:   Sorry JOE, your message to SAM@HOSTZ.ARPA lost.

S:   HOSTZ.ARPA said this:

S:    "550 No Such User"

S: .

R: 250 ok

 

7 DOMAINS

domains(域)是最近在ARPA互联网邮件系统(ARPA Internet mail system)中引入的一个概念

域的使用将地址空间从简单字符串主机名的平面全局空间更改为全局地址的层次结构根目录树。

主机名由域和主机指示符替换,它们是由句点分隔的域元素字符串序列,域元素从最具体到最一般排序

当仅在SMTP中使用域名时,不允许使用昵称或别名

 

域域名的介绍可以百度搜索一下,这里仅是简单介绍

 

8 CHANGING ROLES

说明

TURN命令可用于逆转在传输信道上通信的两个程序的角色:

     1   program-A当前是sender-SMTP,当它发送TURN命令并接收到OK(250)响应,program-A将成为receiver-SMTP

      2  program-B当前是receiver-SMTP,当它接收到TURN命令并发送OK(250)响应,program-B将成为sender-SMTP

receiver发送502响应时,将拒绝转变角色

使用

此命令是可选的,在传输通道为TCP的情况下,通常不会使用它。

当建立传输信道的成本很高时,这个命令可能非常有用。例如,该命令可用于支持使用公共交换电话系统作为传输信道的邮件交换,特别是当一些主机轮询其他主机进行邮件交换时。

 

 

 

 

 

Copyright © 2002-2019 某某自媒体运营 版权所有