찾다
백엔드 개발PHP 튜토리얼RFC821-简单邮件传输协议(SMTP)中文版-0_PHP

RFC821-简单邮件传输协议(SMTP)中文版-0_PHP

Jun 01, 2016 pm 12:37 PM
smtp중국어 버전전염규약보내다주문하다인수하다단순한우편

SMTP

本文出自: 作者: (2001-11-23 07:08:00)
1. 介绍

  简单邮件传输协议(SMTP)的目标是可靠高效地传送邮件,它独立于传
送子系统而且仅要求一条可以保证传送数据单元顺序的通道。附录A,B,C
和D描述了不同传送服务下SMTP的使用。在名词表中还定义了本文档中使用
的术语。
  SMTP的一个重要特点是它能够在传送中接力传送邮件,传送服务提供了
进程间通信环境(IPCE),此环境可以包括一个网络,几个网络或一个网络
的子网。理解到传送系统(或IPCE)不是一对一的是很重要的。进程可能直
接和其它进程通过已知的IPCE通信。邮件是一个应用程序或进程间通信。邮
件可以通过连接在不同IPCE上的进程跨网络进行邮件传送。更特别的是,邮
件可以通过不同网络上的主机接力式传送。

2. SMTP模型  

  SMTP设计基于以下通信模型:针对用户的邮件请求,发送SMTP建立与接
收SMTP之间建立一个双向传送通道。接收SMTP可以是最终接收者也可以是中
间传送者。SMTP命令由发送SMTP发出,由接收SMTP接收,而应答则反方面传
送。
  一旦传送通道建立,SMTP发送者发送MAIL命令指明邮件发送者。如果
SMTP接收者可以接收邮件则返回OK应答。SMTP发送者再发出RCPT命令确认邮件
是否接收到。如果SMTP接收者接收,则返回OK应答;如果不能接收到,则发出
拒绝接收应答(但不中止整个邮件操作),双方将如此重复多次。当接收者收
到全部邮件后会接收到特别的序列,如果接收者成功处理了邮件,则返回OK应
答。



  SMTP提供传送邮件的机制,如果接收方与发送方连接在同一个传送服务下
时,邮件可以直接由发送方主机传送到接收方主机;或者,当两者不在同一个
传送服务下时,通过中继SMTP服务器传送。为了能够对SMTP服务器提供中继能
力,它必须拥有最终目的主机地址和邮箱名称。
  MAIL命令参数是回复路径,它指定邮件从何处来;而RCPT命令的参数是转
发路径的,它指定邮件向何处去。向前路径是源路径,而回复路径是返回路径
(它用于发生错误时返回邮件)。
  当同一个消息要发往不同的接收者时,SMTP遇到了向不同接收者发送同一
份数据的复制品的问题,邮件命令和应答有一个比较奇怪的语法,应答也有一
个数字代码。在下面,例子中可以看到哪些使用实际的命令和应答。完整的命
令和应答在第四节。
  命令与应答对大小写不敏感,也就是说,命令和应答可以是大写,小写或
两者的混合,但这一点对用户邮件名称却不一定是对的,因为有的主机对用户
名大小写是敏感的。这样SMTP实现中就将用户邮箱名称保留成初始时的样子,
主机名称对大小写不敏感。
  命令与应答由ASCII字母表组成,当传送服务提供8位字节传送通道,每7
位字符正确传送,而最高位被填充为0。当指定一般的命令或应答格式后,参
数会由一些类似于语言的字符串表示出来,如""或"",
这里尖括号表示这是一种类似于语言的变量。

3. SMTP过程  

  本节提供了SMTP中的一些过程。头一个说明的是基本发送过程(定义为
发送操作)。下来描述向前传送邮件,确认邮箱名称和扩展邮件列表,发送到终
端和打开关闭交换。在本节的最后是对中断,邮件域的说明。本节的例子只是一
部分命令和应答的序列,完整的例子见附录F。

3.1. MAIL
  在SMTP发送操作中有三步,操作由MAIL命令开始给出发送者标识。一系列或
更多的RCPT命令紧跟其后,给出了接收者信息,然后是DATA命令列出发送的邮件
内容,最后邮件内容指示符确认操作。

  过程中的第一步是MAIL命令,包括源邮箱。

  MAIL FROM:

  此命令告诉接收者新的发送操作已经开始,请复位所有状态表和缓冲区。
它给出反向路径以进行错误信息返回。如果请求被接收,接收方返回一个
250 OK应答。中不止包括了邮箱,它包括了主机和源邮箱的反
向路由,其中的第一个主机就是发送此命令的主机。

  过程中的第二步是发送RCPT命令。

  RCPT TO:

  此命令给出向前路径标识接收者,如果命令被接收,接收方返回一个
250 OK应答,并存储向前路径。如果接收者未知,接收方会返回一个550 Failure
应答。此过程可能会重复若干次。
  不仅包括邮件,它是主机和目的邮箱的路由表,在其中的
第一个主机就是接收命令的主机。 过程中的第三步是发送DATA命令。

DATA

  如果命令被接收,接收方返回一个354 Intermediate应答,并认定以下的
各行都是信件内容。当信件结尾收到并存储后,接收者发送一个250 OK应答。
因为邮件是在传送通道上发送,因此必须指明邮件内容结尾,以便应答对话可
以重新开始。SMTP通过在最后一行仅发送一个句号来表示邮件内容的结束,在
接收方,一个对用户透明的过程将此符号过滤掉,以不影响正常的数据。
  注意:邮件内容包括如下提示:Date, Subject, To, Cc, From。

  邮件内容指示符确认邮件操作并告知接收者可以存储和再发送数据了。如
果此命令被接收,接收方返回一个250 OK应答。DATA命令仅在邮件操作未完成
或源无效的情况下失败。

  上面所述的过程是一个发送操作。这些命令只能以上面的顺序使用。下例
表示了在一个发送操作中这些命令的使用。
  SMTP过程例子 此例是在Alpha.ARPA主机的Smith发送邮件给Beta.ARPA主机
的Jones,Green和Brown的,这里假定主机Alpha与主机Beta直接相连。

  S: MAIL FROM:
  R: 250 OK
  S: RCPT TO:
  R: 250 OK
  S: RCPT TO:
  R: 550 No such user here
  S: RCPT TO:
  R: 250 OK
  S: DATA
  R: 354 Start mail input; end with .
  S: Blah blah blah...
  S: ...等等
  S: .
  R: 250 OK
  此信被前两个人接收,而第三个人在此主机上没有邮箱。

3.2. 转发  
  下面是一些中目的地址不正确的,但接收者知道正确的目
的地址的例子。在这些例子中,下列应答之一应该允许发送方与获得正确地址。

  251:用户不在本地;将向前发送到

  这个应答意味着,接收方SMTP知道用户的邮箱在另外的主机上,而且意味
着将在未来使用正确的转向路径。请注意,主机或者用户,或者它们两者是不
同的。接收方负责传送消息。

  551 :用户非本地,请尝试

  这个应答意味着接收SMTP知道用户的邮箱在另外的主机上,并意味着使用
了正确的转发路径。注意请注意,主机或者用户,或者它们两者是不同的。接
收方拒绝接收此用户的信件,发送者必须根据提供的信息重新发送或者向原发
送者返回错误信息。 下例显示了这些响应的应用。

  转发的例子
  S: RCPT TO:
  R: 251 User not local; will forward to
  或者
  S: RCPT TO:
  R: 551 User not local; please try

3.3. 确认和扩展
  SMTP提供了另外的确认用户名和扩展邮件列表的功能。这些功能由VREF和
EXPN命令完成,它们都以字符串为参数。对于VREF命令,字符串参数指的是用
户名,对此命令的响应要包括用户的命名和用户的邮箱。对于EXPN命令,字符
串参数指的是邮件列表,对此命令的响应多于一个,它们要包括所有列表中用
户的命名和他们的邮箱。
  “用户名”是一个多余的项目,它是故意被加上的。如果主机采用VREF命
令和EXPN命令,最后本地邮箱必须提供用户名使它被主机确认。如果主机选择
由另外的字符串作为用户名,也是允许的。
  在一些主机中,邮箱列表和一个邮箱的代名有一点不清楚,因为一般的数
据结构可能包括两种类型的入口。如果要发出对邮件列表的确认,应该给出确
定响应。在接收到这个消息后,主机将把邮件传送到列表上所有的地址上去,
如果没有接收到确定响应,就会报告错误。例如,
"550 That is a mail list, not a user name"。如果请求用于扩展一个用户名,
可能通过返回包括一个名字的列表来形成确定响应,如果没有接收到确定响应,
就会报告错误。(例如, "550 That is a user name, not a mailing list")。
  在多个响应的情况下(通常是对于EXPN而言的),每个应答指定一个邮箱。
在模糊请求的情况下,例如"VRFY Smith",这里两个Smith的响应必须是
"553 User ambiguous"。

  确认用户名的情况如下例所示:例3:
  确认用户名
  S: VRFY Smith R: 250 Fred Smith
  或者
  S: VRFY Smith
  R: 251 User not local; will forward to
  或者
  S: VRFY Jones
  R: 550 String does not match anything.
  或者
  S: VRFY Jones
  R: 551 User not local; please try
  或者
  S: VRFY Gourzenkyinplatz
  R: 553 User ambiguous.

  邮箱列表要求多个响应的情况如下例所示:
  S: EXPN Example-People
  R: 250-Jon Postel
  R: 250-Fred Fonebone
  R: 250-Sam Q. Smith
  R: 250-Quincy Smith
  R: 250-
  R: 250
  或者
  S: EXPN Executive-Washroom-List
  R: 550 Access Denied to You.

  VERF和EXPN命令的字符串命令参数因为具体实现的不同而不能再加以限
制了。在一些系统上,EXPN命令的参数可能是一个包含邮件列表的文件名,
但是在Internet上有许多不同的文件结构。
  VRFY和EXPN命令在最小实现中并不包括,当它们实现时,它们也不要求
被在传送间实现。 

3.4. 发送信件(mailing)和获得信件(sending)  
  SMTP的主要目的是将邮件发送到用户的邮箱中。由一些主机提供的类似
的功能是把邮件送至用户的终端(如果用户正打开终端)。将邮件送到用户
的邮箱中称为发送信件(mailing);而送至用户终端则称之为获得信件
(sending)。因为在一些主机上,这两者的实现十分类似,所以它们同时
被放入了SMTP中。然而,获得信件命令在SMTP的最小实现中是没有的。用户
应该具有控制向终端上写信息的能力。大部分主机允许用户接受或者拒绝类
似的信息。
  下面三个命令被定义来支持获得信件。它们被用于邮件命令而不是MAIL
命令,指示接收SMTP这种操作的特殊意义:
  SEND FROM:

  SEND命令要求邮件内容直接传送到用户终端。如果用户未打开终端(或
者未接收终端信息),450响应将返回一个RCPT命令。如果信息被成功发送,
此操作成功。 

  SOML FROM:  

  Send或者MaiL命令要求将邮件内容直接发送到用户的终端上(如果用户
在终端上)。如果用户不在终端上,邮件内容直接进入邮箱。如果邮件被发送
到用户终端或者用户信箱,发送操作成功。 

  SAML FROM:

  Send和MaiL命令要求邮件内容直接发送到用户终端上(如果用户在终端上)。
不管怎么样,信件都会进入信箱。如果信件进入信箱,发送操作成功。
  用于MAIL命令的响应和这些命令的响应相同。  

3.5. 打开和关闭  
  当打开传送通道时,要交换一些信息以确定双方的身份。以下的命令是
用于打开和关闭的:
  HELO
  QUIT
  在HELLO命令中,主机自己发送命令,此命令可以被解释为:“你好,
我是XX”。

  打开联结的例子
  R: 220 BBN-UNIX.ARPA Simple Mail Transfer Service Ready
  S: HELO USC-ISIF.ARPA
  R: 250 BBN-UNIX.ARPA

  关闭联结的例子
  S: QUIT
  R: 221 BBN-UNIX.ARPA Service closing transmission channel

3.6. 转发
  转发路径可能是如下格式:"@ONE,@TWO:JOE@THREE",在这里,ONE,TWO
和THREE是主机。这种格式用于强调地址和路径的区别。邮箱是绝对地址,路
径是关于如何到达的信息。这两个概念不应该被混淆。
  概念上,转发路径的元素被移动到回复路径作为从一个SMTP服务器到另一
个SMTP服务器的信息。回复路径是一个反向数据源路径,例如从当前信息的位
置到发起者的位置。当一个SMTP服务器从转发路径中删除自己的标记并将它插
入到回复路径中时,它必须使用它发送环境能够理解的名称来进行,以防它的
名称在不同的环境中被理解为不同的名字。
  如果当SMTP接收到信息的转发路径的第一个元素不是此SMTP的标记时,此
元素不从转发路径中删除,而被用来决定下一个应该发送到的SMTP服务器。在
任何情况下,SMTP都将自己的标记加入反向路径中。
  使用源路径时,接收SMTP接收转发的邮件并发送到另一接收SMTP服务器上。
接收服务器可以接受或拒绝转发本地用户的邮件。接收SMTP通过将它自己的标记
从转发路径移至回复路径的开始处来改变命令参数。这时,接收SMTP变成了发
送SMTP,也就建立了到下一个转发路径中SMTP的通道,然后,它向这个SMTP发
送邮件。
  在回复路径上的头一个主机应是发送SMTP命令的主机,在转发路径上第一个
主机应是接收SMTP命令的主机。
  注意:转发路径和回复路径出现在SMTP命令和应答中,但不一定要出现在信
息中。也就是说,没有必须要这样的路径特别这种格式出现在信息头的"To:",
"From:"和"CC:"等域中。
   如果SMTP服务器接受了转发任务,但后来它发现因为转发路径不正确或者
其它原理无法发送邮件,它必须建立一"undeliverable mail"信号,将它此信号
送到此信的发主者那里。
  此信号必须是从此主机的SMTP服务上发出的,当然了,此服务器不应该再报
告出错信息的错误。一种阻止这种出错报告循环的情况是在信号的邮件命令的回
复路径上置空。在传送此信息时,允许将回复路径也置为空。一个MAIL命令后的
回复路径为空表现为如下形式:
  MAIL FROM:

  下例中显示了不可传送的邮件信息。此信息是对从HOSTW上的JOE发出的邮件
经过在HOSTX需要经过HOSTZ到达HOSTY时出错的回应。我们看到的例子是在HOSTX
和HOSTY之间发生的。

  不可传送邮件信息的例子
  S: MAIL FROM:
  R: 250 ok
  S: RCPT TO:
  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

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
과대 광고 : 오늘 PHP의 역할을 평가합니다과대 광고 : 오늘 PHP의 역할을 평가합니다Apr 12, 2025 am 12:17 AM

PHP는 현대적인 프로그래밍, 특히 웹 개발 분야에서 강력하고 널리 사용되는 도구로 남아 있습니다. 1) PHP는 사용하기 쉽고 데이터베이스와 완벽하게 통합되며 많은 개발자에게 가장 먼저 선택됩니다. 2) 동적 컨텐츠 생성 및 객체 지향 프로그래밍을 지원하여 웹 사이트를 신속하게 작성하고 유지 관리하는 데 적합합니다. 3) 데이터베이스 쿼리를 캐싱하고 최적화함으로써 PHP의 성능을 향상시킬 수 있으며, 광범위한 커뮤니티와 풍부한 생태계는 오늘날의 기술 스택에 여전히 중요합니다.

PHP의 약한 참고 자료는 무엇이며 언제 유용합니까?PHP의 약한 참고 자료는 무엇이며 언제 유용합니까?Apr 12, 2025 am 12:13 AM

PHP에서는 약한 참조가 약한 회의 클래스를 통해 구현되며 쓰레기 수집가가 물체를 되 찾는 것을 방해하지 않습니다. 약한 참조는 캐싱 시스템 및 이벤트 리스너와 같은 시나리오에 적합합니다. 물체의 생존을 보장 할 수 없으며 쓰레기 수집이 지연 될 수 있음에 주목해야합니다.

PHP의 __invoke 마법 방법을 설명하십시오.PHP의 __invoke 마법 방법을 설명하십시오.Apr 12, 2025 am 12:07 AM

\ _ \ _ 호출 메소드를 사용하면 객체를 함수처럼 호출 할 수 있습니다. 1. 객체를 호출 할 수 있도록 메소드를 호출하는 \ _ \ _ 정의하십시오. 2. $ obj (...) 구문을 사용할 때 PHP는 \ _ \ _ invoke 메소드를 실행합니다. 3. 로깅 및 계산기, 코드 유연성 및 가독성 향상과 같은 시나리오에 적합합니다.

동시성에 대해 PHP 8.1의 섬유를 설명하십시오.동시성에 대해 PHP 8.1의 섬유를 설명하십시오.Apr 12, 2025 am 12:05 AM

섬유는 PHP8.1에 도입되어 동시 처리 기능을 향상시켰다. 1) 섬유는 코 루틴과 유사한 가벼운 동시성 모델입니다. 2) 개발자는 작업의 실행 흐름을 수동으로 제어 할 수 있으며 I/O 집약적 작업을 처리하는 데 적합합니다. 3) 섬유를 사용하면보다 효율적이고 반응이 좋은 코드를 작성할 수 있습니다.

PHP 커뮤니티 : 자원, 지원 및 개발PHP 커뮤니티 : 자원, 지원 및 개발Apr 12, 2025 am 12:04 AM

PHP 커뮤니티는 개발자 성장을 돕기 위해 풍부한 자원과 지원을 제공합니다. 1) 자료에는 공식 문서, 튜토리얼, 블로그 및 Laravel 및 Symfony와 같은 오픈 소스 프로젝트가 포함됩니다. 2) 지원은 StackoverFlow, Reddit 및 Slack 채널을 통해 얻을 수 있습니다. 3) RFC에 따라 개발 동향을 배울 수 있습니다. 4) 적극적인 참여, 코드에 대한 기여 및 학습 공유를 통해 커뮤니티에 통합 될 수 있습니다.

PHP vs. Python : 차이점 이해PHP vs. Python : 차이점 이해Apr 11, 2025 am 12:15 AM

PHP와 Python은 각각 고유 한 장점이 있으며 선택은 프로젝트 요구 사항을 기반으로해야합니다. 1.PHP는 간단한 구문과 높은 실행 효율로 웹 개발에 적합합니다. 2. Python은 간결한 구문 및 풍부한 라이브러리를 갖춘 데이터 과학 및 기계 학습에 적합합니다.

PHP : 죽어 가거나 단순히 적응하고 있습니까?PHP : 죽어 가거나 단순히 적응하고 있습니까?Apr 11, 2025 am 12:13 AM

PHP는 죽지 않고 끊임없이 적응하고 진화합니다. 1) PHP는 1994 년부터 새로운 기술 트렌드에 적응하기 위해 여러 버전 반복을 겪었습니다. 2) 현재 전자 상거래, 컨텐츠 관리 시스템 및 기타 분야에서 널리 사용됩니다. 3) PHP8은 성능과 현대화를 개선하기 위해 JIT 컴파일러 및 기타 기능을 소개합니다. 4) Opcache를 사용하고 PSR-12 표준을 따라 성능 및 코드 품질을 최적화하십시오.

PHP의 미래 : 적응 및 혁신PHP의 미래 : 적응 및 혁신Apr 11, 2025 am 12:01 AM

PHP의 미래는 새로운 기술 트렌드에 적응하고 혁신적인 기능을 도입함으로써 달성 될 것입니다. 1) 클라우드 컴퓨팅, 컨테이너화 및 마이크로 서비스 아키텍처에 적응, Docker 및 Kubernetes 지원; 2) 성능 및 데이터 처리 효율을 향상시키기 위해 JIT 컴파일러 및 열거 유형을 도입합니다. 3) 지속적으로 성능을 최적화하고 모범 사례를 홍보합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.