zoukankan      html  css  js  c++  java
  • [转]SMTP协议

    SMTP 协议简介


      SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,是一种提供可靠且有效电子邮件传输的协议。SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于传输系统之间的邮件信息并提供与来信有关的通知。
      SMTP目前已是事实上的在Internet传输E-Mail的标准,是一个相对简单的基于文本的协议。在其之上指定了一条消息的一个或多个接收者(在大多数情况下被确定是存在的),然后消息文本就传输了。可以很简单地通过Telnet程序来测试一个SMTP服务器,SMTP使用TCP端口25。要为一个给定的域名决定一个SMTP服务器,需要使用MX(Mail eXchange)DNS。
      在20世纪80年代早期SMTP开始被广泛地使用。当时它只是作为UUCP的补充,UUCP更适合于处理在间歇连接的机器间传送邮件。相反SMTP在发送和接收的机器始终都联网的情况下工作得最好。
      SMTP独立于特定的传输子系统,且只需要可靠有序的数据流信道支持。SMTP重要特性之一是其能跨越网络传输邮件,即“SMTP邮件中继”。通常,一个网络可以由公用因特网上TCP可相互间访问的主机、防火墙分隔的TCP/IP网络上TCP可相互访问的主机,以及其他LAN/WAN中的主机利用非TCP传输层协议组成。使用SMTP,可实现相同网络上处理机之间的邮件传输,也可通过中继器或网关是实现某处理机与其他网络之间的邮件传输。
      在这种方式下,邮件的发送可能经过从发送端到接收端路径上的大量中间中继器或网关主机。域名服务系统(DNS)的邮件交换服务器可以用来识别出传输邮件的下一跳IP地址。
      Sendmail是最早实现SMTP的邮件传输代理之一。到2001年至少有50个程序将SMTP 实现为一个客户端(消息的发送者)或一个服务器(消息的接受者)。一些其他的流行的SMTP服务器包括Philip Hazel 的exim,IBM的Postfix,D.J.Bernstein的Qmail,以及Microsoft Exchange Server.
      由于这个协议开始是基于纯ASCⅡ文本的,在二进制文件上处理得并不好。后来开发了用来编码二进制文件的标准,如MIME,以使其通过SMTP来传输。今天,大多数SMTP服务器都支持8位MIME扩展,它使二进制文件的传输变得几乎和纯文本一样简单。
      ( 注意:SMTP是一个"推"的协议,它不允许根据需要从远程服务器上“拉”来消息。要做到这点,邮件客户端必须使用POP3或IMAP上。另一个,SMTP服务器可以使用ETRN(Extended Turn,扩展回车)命令在SMTP上触发一个发送。)
      垃圾邮件仍然是个重要的问题。原始的SMTP协议的局限之一在于它没有为发送方进行认证的功能。因此定义了SMTP-AUTH 扩展。由于SMTP 巨大安装基础的网络效应,广阔地修改SMTP或者完全替代它被认为是不现实的。Internet Mail 2000 就是这样一个为替换而做的建议。IRTF 的反垃圾邮件研究小组正在研究一些提供简单、灵活、轻量级的、可升级的源端认证的建议。最有可能被接受的建议是Sender Policy Framework 协议。
      

    SMTP协议命令和工作原理


      
      SMTP命令是发送于SMTP主机之间的ASCⅡ信息,可能使用到的命令如下表所示。
       SMTP基本命令集:

    命令       描述
    ------------------------------
    HELO      向服务器标识用户身份发送者能欺骗,说谎,但一般情况下服务器都能检测到。

    MAIL      初始化邮件传输
              mail form :
    RCPT      标识单个的邮件接收人;常在MAIL命令后面  可有多个rcpt to:
    DATA      在单个或多个RCPT命令后,表示所有的邮件接收人已标识,并初始化数据传输结束。
    VRFY      用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令
    EXPN      验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用
    HELP      查询服务器支持什么命令
    NOOP      无操作,服务器应响应OK
    QUIT      结束会话
    RSET      重置会话,当前传输被取消

      SMTP是工作在两种情况下:一是电子邮件从客户机传输到服务器:二是从某一个服务器传输到另一个服务器。SMTP也是个请求/响应协议,命令和响应都是基于ASCⅡ文本,并以CR和LF符结束。响应包括一个表示返回状态的三位数字代码。SMTP在TCP协议25号端口监听连续请求。
      连接和发送过程如下:
      (1)建立TCP 连接。
      (2)客户端发送HELO命令以标识发件人自己的身份,然后客户端发送MAIL命令;服务器端正希望以OK作为响应,表明准备接收。
      (3)客户端发送RCPT命令,以标识该电子邮件的计划接收人,可以有多个RCPT行;服务器端则表示是否愿意为收件人接收邮件。
      (4)协商结束,发送邮件,用命令DATA发送。
      (5)以“.”号表示结束输入内容一起发送出去,结束此次发送,用QUIT命令退出。

      SMTP协议的邮件路由过程。
      

    smtp服务器基于‘域名服务dns中计划收件人的域名来路由电子邮件。smtp服务器基于dns中的mx记录
    来路由电子邮件,mx记录注册了域名和相关的smtp中继主机,属于该域的电子邮件都应向该主机发送。

    若smtp服务器mail.abc.com收到一封信要发到shuser@sh.abc.com:

    a.sendmail请求dns给出主机sh.abc.com的cname记录,如有,假若cname到shmail.abc.com,则再次
    请求shmail.abc.com的cname记录,直到没有为止
    b.假定被cname到shmail.abc.com,然后sendmail请求@abc.com域的dns给出shmail.abc.com的mx记录,
       shmail    mx   5   shmail.abc.com
                      10   shmail2.abc.com
    c. sendmail最后请求dns给出shmail.abc.com的a记录,即ip地址,若返回值为1.2.3.4
    d. sendmail与1.2.3.4连接,传送这封给shuser@sh.abc.com的信到1.2.3.4这台服务器的smtp后台程序


    补充说明:

    1. mail from命令中指定的地址是称作 envelope from地址,不需要和发送者自己的地址是一致的。
       rcpt to 与之等同,指明的接收者地址称为envelope to地址,而与实际的to:行是什么无关。
    2.为什么没有rcpt cc和rcpt bcc:?
       所有的接收者协商都通过rcpt to命令来实现,如果是bcc,则协商发送后在对方接收时被删掉信封接收者
    3.邮件被分为信封部分,信头部分和信体部分
       envelope from, envelope to 与message from:, message to:完全不相干。
       evnelope是由服务器主机间smtp后台提供的,而message from/to是由用户提供的。有无冒号也是区别。

    4. 怎样由信封部分检查是否一封信是否是伪造的?
    a. received行的关联性。
       现在的smtp邮件传输系统,在信封部分除了两端的内部主机处理的之个,考虑两个公司防火墙之间
       的部分,若两台防火墙机器分别为a和b,但接收者检查信封received:行时发现经过了c.则是伪造的。
    b. received:行中的主机和ip地址对是否对应如:
       receibed: from galangal.org (turmeric.com [104.128.23.115] by mail .bieberdorf.edu....
    c. 被人手动添加在最后面的received行:
        received: from galangal.org ([104.128.23.115]) by mail .bieberdorf.edu (8.8.5)
        received: from lemongrass.org by galangal.org (8.7.3)
        received: from graprao.com by lemongrass.org (8.6.4)


    本篇文章来源于 中国协议分析网|www.cnpaf.net 原文链接:http://www.cnpaf.net/Class/SMTP/200810/23042.html
  • 相关阅读:
    java实现获取当前年月日 小时 分钟 秒 毫秒
    四种常见的 POST 提交数据方式(application/x-www-form-urlencoded,multipart/form-data,application/json,text/xml)
    Cannot send, channel has already failed:
    Java 枚举(enum) 详解7种常见的用法
    C语言指针详解(经典,非常详细)
    ActiveMQ进阶配置
    Frame size of 257 MB larger than max allowed 100 MB
    SpringJMS解析--监听器
    SpringJMS解析-JmsTemplate
    delphi 修改代码补全的快捷键(由Ctrl+Space 改为 Ctrl + alt + Space)
  • 原文地址:https://www.cnblogs.com/chhuic/p/1579433.html
Copyright © 2011-2022 走看看