SMTP 是一种提供可靠且有效电子邮件传输的协议。 SMTP 是建模在 FTP 文件传输服务上的一种邮件服务,主要用于传输系统之间的邮件信息并提供来信有关的通知。
SMTP 独立于特定的传输子系统,且只需要可靠有序的数据流信道支持。 SMTP 重要特性之一是其能跨越网络传输邮件,即“ SMTP 邮件中继”。通常,一个网络可以由公用互联网上 TCP 可相互访问的主机、防火墙分隔的 TCP/IP 网络上 TCP 可相互访问的主机,及其它 LAN/WAN 中的主机利用非 TCP 传输层协议组成。使用 SMTP ,可实现相同网络上处理机之间的邮件传输,也可通过中继器或网关实现某处理机与其它网络之间的邮件传输。
在这种方式下,邮件的发送可能经过从发送端到接收端路径上的大量中间中继器或网关主机。域名服务系统(DNS)的邮件交换服务器可以用来识别出传输邮件的下一跳 IP 地址。
SMTP端口号是多少?
25 25是SMTP端口,110是POP端口。
SMTP是一种请求响应协议,客户端发送命令,服务器返回响应,两者通过这种方式进行交互,以完成邮件传输过程的三个阶段:建立连接、传输数据和终止连接。
客户端主动连接到服务器的25端口,建立TCP连接。服务器会发送一个应答码为220的问候报文,表示已经准备就绪。
客户端向服务器发送HELO命令,用以标识发送方的身份,HELO命令的参数必须是一个合法的主机名。如果服务器接受了连接请求,会给客户端返回一个代码为250的应答,表示可以开始报文传输。
客户端发送MAIL命令标识邮件的发送方,通过FROM参数指定发送方的电子邮件地址。如果服务器准备接收邮件,则返回代码为250的OK应答。
客户端发送RCPT命令标识邮件的接收方,通过TO参数指定接收方的电子邮件地址,如果有多个接收人,可以发送多个RCPT命令。如果服务器能够识别接收人,则会返回代码为250的OK应答,否则返回代码为550的失败应答。
客户端与服务器之间的协商结束,客户端发送DATA命令指示将要发送邮件数据,服务器端返回应答码为354的响应进行确认,表示可以开始邮件输入。客户端将邮件内容按行发送,邮件的末尾由客户端指定,是只有一个小数点(邮件数据结束指示器)的一行,服务器检测到邮件数据结束指示器后,返回代码为250的OK应答。
客户端发送QUIT命令终止连接。
SMTP命令和FTP命令一样,都是使用NVT ASCII格式的文本,以明文传输的。SMTP简捷的原因之一是它使用的命令少,SMTP的最小实现仅需要8种命令就够了。
常用SMTP命令一览表
命令 描述
HELO 用于启动邮件传输过程
MAIL FORM 用于初始化邮件传输
RCPT TO 用于标识单个邮件接收人,在MAIL命令后面可有多个RCPT命令
DATA 用于将邮件报文发送给服务器
QUIT 用于终止客户端与服务器之间的连接
RSET 用于中止当前的邮件事务并使两端复位
VRFY 用于验证指定的用户/邮箱是否存在,即验证接收方地址是否正确 NOOP 空操作命令
HELO命令:该命令是客户用来标识自己而使用的,其变量是客户主机的域名。例如 HELO:smtp.bjut.edu.cn
MAIL FROM命令:该命令是客户用来标识发信人而使用的,它的变量是发信人的电子邮件地址。例如 MAIL FROM:
[email protected],cn
RCPT TO命令:该命令是客户用来标识预期的收信人而使用的,它的变量是收信人的电子邮件地址。若有多个收信人,则命令要重复使用。例如 RCPT TO:
[email protected]
DATA命令:该命令是客户用来发送真正的报文。在DATA命令后面所有的行都被当作是邮件报文。报文的终止是只包含一个点的行。例如
DATA This is the message to be sent to the company QUIT命令:结束报文。例如 QUIT
RSET命令:该命令使当前的邮件事务异常中止,所存储的关于发信人收信人的信息都被删除,连接将被复位。例如 RSET
VRFY命令:该命令用来验证收信人的地址,它作为变量发送出去。发送端可以请接收端证实一个名字是否标识一个有效的收信人。例如 VRFY:
[email protected] NOOP命令:该命令由客户使用,用来检查收信人的状态,它需要收信人的回答。例如 NOOP 对于这些命令的顺序有一定的限制。对话的第一个命令必须是HELLO命令,此命令在此后的会话中也可以使用。如果HELLO命令的参数不可接受,必须由返回一个501失败应答,同时接收到的SMTP必须保持在与刚才一致的状态下。
saka.dlut.edu.cn# telnet mail.foo.com 25
Trying 192.168.1.4...
Connected to here.foo.com.Escape character is '^]'.
220 here.foo.com ESMTP Sendmail 8.8.8/8.8.8; Sat, 14 Mar 1998 21:28:41 -0500 (EST)
HELO
saka.dlut.edu.cn
250 here.foo.com
Hello [email protected] [192.168.1.3], pleased to meet you
MAIL FROM: [email protected]
250 [email protected]...
Sender ok
RCPT TO: [email protected] hollingd...
Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
Hi dave - this message is a test of SMTP.250 VAA07541 Message accepted for delivery
DATA
354 Enter mail, end with "." on a line by itself
Hi dave - this message is a test of SMTP....foo...250 VAA0771 Message accepted for delivery
•
最终信息:Hi dave - this message is a test of SMTP..foo.
POP3的连接过程
1) POP3命令及执行过程
假设用C表示客户端(Client),S表示服务器端(Server)。
客户端首先使用TCP与POP3服务器建立连接,连接成功后,服务器发送一个单行的确认信息,然后要求客户端发送用户名和密码进行确认,下面是客户端发送的命令:
①发送用户名。
格式:USER <用户名>
服务器返回:+OK用户名正确;-ERR用户名错误。
示例:C:USER
[email protected] S:+OK welcome on this server.
②发送密码 用户名确认成功后,客户端再发送密码。
语法形式:PASS <密码> 功能:将客户的密码发送给服务器。 服务器返回:+OK 表示密码正确; -ERR 表示密码错误。
示例:C:PASS ***** S:+OK myname logged in at 19:04 2) 服务器对用户名和密码验证成功后,客户端就可以发送POP3命令要求服务器执行相应的操作。对于每个命令,服务器都会返回应答信息。常用命令有:
①STAT命令 格式:STAT 功能:从服务器中获邮件总数和总字节数。 服务器返回:邮件总数和总字节数。
示例:C:STAT S:+OK 2 320
②LIST命令 格式:LIST 功能:从服务中获得邮件列表和大小。 服务器返回:列出邮件列表和大小。
示例:C:LIST S:+OK 2 messages (320 octets) S:1 120 S:2 200 S: . 注意,“.”单独占一行。
③RETR命令 格式:RETR <邮件的序号> 功能:从服务器中获得一个邮件。 服务器返回:+OK成功;-ERR错误。
示例:C: RETR 1 S:+OK 120 octets S:<服务器发送信件1内容> S: . 注意,“.”单独占一行。
④DELE命令 语法形式:DELE <邮件的序号> 功能:服务器将邮件标记为删除,当执行QUIT命令时才真正删除。 服务器返回:+OK成功;-ERR错误。
示例:C:DELE 1 S:+OK 1 Deleted
⑤QUIT命令 格式:QUIT 功能:关闭与服务器的连接。 服务器返回:+OK;-ERR。 示例:C:QUIT S:+OK 然后服务器自动断开与该客户端的连接。