smtp_smtplib - CSDN
smtp 订阅
SMTP是一种提供可靠且有效的电子邮件传输的协议。SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知。SMTP独立于特定的传输子系统,且只需要可靠有序的数据流信道支持,SMTP的重要特性之一是其能跨越网络传输邮件,即“SMTP邮件中继”。使用SMTP,可实现相同网络处理进程之间的邮件传输,也可通过中继器或网关实现某处理进程与其他网络之间的邮件传输。 [1] 展开全文
SMTP是一种提供可靠且有效的电子邮件传输的协议。SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知。SMTP独立于特定的传输子系统,且只需要可靠有序的数据流信道支持,SMTP的重要特性之一是其能跨越网络传输邮件,即“SMTP邮件中继”。使用SMTP,可实现相同网络处理进程之间的邮件传输,也可通过中继器或网关实现某处理进程与其他网络之间的邮件传输。 [1]
信息
端    口
25
简    称
SMTP
作    用
传输系统之间的邮件信息
中文名
简单邮件传输协议
外文名
Simple Mail Transfer Protocol
SMTP简介
SMTP是一个相对简单的基于文本的协议。在其之上指定了一条消息的一个或多个接收者(在大多数情况下被确认是存在的),然后消息文本会被传输。可以很简单地通过telnet程序来测试一个SMTP服务器。SMTP使用TCP端口25。要为一个给定的域名决定一个SMTP服务器,需要使用MX (Mail eXchange)DNS。 [2]  在八十年代早期SMTP开始被广泛地使用。当时,它只是作为UUCP的补充,UUCP更适合于处理在间歇连接的机器间传送邮件。相反,SMTP在发送和接收的机器在持续连线的网络情况下工作得最好。 [2]  Sendmail是最早使用SMTP的邮件传输代理之一。到2001年至少有50个程序将SMTP实现为一个客户端(消息的发送者)或一个服务器(消息的接收者)。一些其他的流行的SMTP服务器程序包括了Philip Hazel的exim,IBM的Postfix,D. J. Bernstein的Qmail,以及Microsoft Exchange Server。 [2]  由于这个协议开始是基于纯ASCII文本的,它在二进制文件上处理得并不好。诸如MIME的标准被开发来编码二进制文件以使其通过SMTP来传输。今天,大多数SMTP服务器都支持8位MIME扩展,它使二进制文件的传输变得几乎和纯文本一样简单。 [2]  SMTP是一个“推”的协议,它不允许根据需要从远程服务器上“拉”来消息。要做到这点,邮件客户端必须使用POP3或IMAP。另一个SMTP服务器可以使用ETRN在SMTP上触发一个发送。 [2] 
收起全文
精华内容
参与话题
  • smtp的基本原理

    千次阅读 2009-08-21 15:34:00
    转自... smtp的基本结构 SMTP (Simple Mail Transfer Protocol)协议是为了保证电子邮件的可靠和高效传送。TCP/IP 协议的应用层中包含有SMTP协议,但事实上它与传输系统和机制无关,仅要

    转自http://www.corp-email.com/support/basic/128.html

    把文章摘抄在这里只是方便自己学习,马上要开展邮件测试了,先把基础打扎实咯.

     smtp的基本结构
    SMTP (Simple Mail Transfer Protocol)协议是为了保证电子邮件的可靠和高效传送。TCP/IP 协议的应用层中包含有SMTP协议,但事实上它与传输系统和机制无关,仅要求一个可靠的数据流通道。它可以工作在TCP上,也可以工作在NCP, NITS 等协议上。在TCP上,它使用端口25进行传输。
    smtp的一个重要特点是可以在可交互的通信系统中转发邮件。

    1.
    smtp的模型
    SMTP提供了一种邮件传输的机制,当收件方和发件方都在一个网络上时,可以把邮件直传给对方;当双方不在同一个网络上时,需要通过一个或几个中间服务器转发。SMTP首先由发件方提出申请,要求与接收方SMTP建立双向的通信渠道,收件方可以是最终收件人也可以是中间转发的服务器。收件方服务器确认可以建立连接后,双发就可以开始通信。下面是
    smtp的模型示意图。



    发件方SMTP向收件方发处MAIL命令,告知发件方的身份;如果收件方接受,就会回答OK。发件方再发出RCPT命令,告知收件人的身份,收件方SMTP确认是否接收或转发,如果同意就回答OK;接下来就可以进行数据传输了。通信过程中,发件方SMTP与收件方smtp 采用对话式的交互方式,发件方提出要求,收件方进行确认,确认后才进行下一步的动作。整个过程由发件方控制,有时需要确认几回才可以。



    为了保证回复命令的有效,smtp要求发件方必须提供接收方的服务器及邮箱。邮件的命令和答复有严格的语法定义,并且回复具有相应的数字代码。所有的命令由ASCII码组成。命令代码是大小写无关的,如MAIL和 mail ﹑mAIL是等效的。

    2.
    smtp的基本命令
    smtp定义了14个命令,它们是:

    HELO
    MAIL FROM:
    RCPT TO:
    DATA
    RSET
    SEND FROM:
    SOML FROM:
    SAML FROM:
    VRFY
    EXPN
    HELP [ ]
    NOOP
    QUIT
    TURN
    其中使得
    smtp工作的基本的命令有7个,分别为:HELO﹑MAIL﹑RCPT﹑DATA﹑REST﹑NOOP和QUIT.下面分别介绍如下。

    HELO--发件方问候收件方,后面是发件人的服务器地址或标识。收件方回答OK时标识自己的身份。问候和确认过程表明两台机器可以进行通信,同时状态参量被复位,缓冲区被清空。

    MAIL--这个命令用来开始传送邮件,它的后面跟随发件方邮件地址(返回邮件地址)。它也用来当邮件无法送达时,发送失败通知。为保证邮件的成功发送,发件方的地址应是被对方或中间转发方同意接受的。这个命令会清空有关的缓冲区,为新的邮件做准备。

    RCPT --这个命令告诉收件方收件人的邮箱。当有多个收件人时,需要多次使用该命令,每次只能指明一个人。如果接收方服务器不同意转发这个地址的邮件,它必须报550错误代码通知发件方。如果服务器同意转发,它要更改邮件发送路径,把最开始的目的地(该服务器)换成下一个服务器。

    DATA--收件方把该命令之后的数据作为发送的数据。数据被加入数据缓冲区中,以单独一行是"."的行结束数据。结束行对于接收方同时意味立即开始缓冲区内的数据传送,传送结束后清空缓冲区。如果传送接受,接收方回复OK。

    REST--这个命令用来通知收件方复位,所有已存入缓冲区的收件人数据,发件人数据和待传送的数据都必须清除,接收放必须回答OK.

    NOOP--这个命令不影响任何参数,只是要求接收放回答OK, 不会影响缓冲区的数据。

    QUIT--
    smtp要求接收放必须回答OK,然后中断传输;在收到这个命令并回答OK前,收件方不得中断连接,即使传输出现错误。发件方在发出这个命令并收到OK答复前,也不得中断连接。

    下面是
    smtp答复中用到的代码和含义:

    500 Syntax error, command unrecognized
    [This may include errors such as command line too long]
    501 Syntax error in parameters or arguments
    502 Command not implemented
    503 Bad sequence of commands
    504 Command parameter not implemented
    211 System status, or system help reply
    214 Help message
    [Information on how to use the receiver or the meaning of a
    particular non-standard command; this reply is useful only to the human user]
    220 Service ready
    221 Service closing transmission channel
    421 Service not available, closing transmission channel
    [This may be a reply to any command if the service knows it must shut down]
    250 Requested mail action okay, completed
    251 User not local; will forward to
    450 Requested mail action not taken: mailbox unavailable
    [E.g., mailbox busy]
    550 Requested action not taken: mailbox unavailable
    [E.g., mailbox not found, no access]
    451 Requested action aborted: error in processing
    551 User not local; please try
    452 Requested action not taken: insufficient system storage
    552 Requested mail action aborted: exceeded storage allocation
    553 Requested action not taken: mailbox name not allowed
    [E.g., mailbox syntax incorrect]
    354 Start mail input; end with .
    554 Transaction failed
    最后,让我们看一个RFC821中给出的例子。这封信是Smith在主机Alpha.ARPA 发给主机Beta.ARPA上的
    Jones,Green和 Brown.并且假定两台主机在同一个网络上。

    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: ...etc. etc. etc.
    S: .
    R: 250 OK
    邮件最后被对方接受。


    ◆ 电子邮件的工作原理


    电子邮件与普通邮件有类似的地方,发信者注明收件人的姓名与地址(即邮件地址),发送方服务器把邮件传到收件方服务器,收件方服务器再把邮件发到收件人的邮箱中。如下图所示:



    更进一步的解释涉及到以下几个概念:

    MUA -- Mail User Agent, 邮件用户代理,帮助用户读写邮件;

    MTA -- Mail Transport Agent, 邮件传输代理,负责把邮件由一个服务器传到另一个服务

    器或邮件投递代理;

    MDA -- Mail Delivery Agent, 邮件投递代理,把邮件放到用户的邮箱里。

    整个邮件传输过程如下:

    目前使用的
    smtp 协议是存储转发协议,意味着它允许邮件通过一系列的服务器发送到最终目的地。服务器在一个队列中存储到达的邮件,等待发送到下一个目的地。下一个目的地可以是本地用户,或者是另一个邮件服务器,如下图所示。



    如果下游的服务器暂时不可用,MTA 就暂时在队列中保存信件,并在以后尝试发送。



    ◆ 电子邮件的信头结构及分析

    1 .邮件的结构
    在最高层,邮件的结构是非常简单的,用户从终端机上看到的邮件格式一般为:

    1. From:
    user1@domain1.com

    2. To:
    user2@domain2.com

    3. Subject: Explaination of mail format

    4. Date: Thu, 1 Apr 1999. 10:00:00 GMT

    5. Hi, Jack

    7. This mail is to explain you the mail format

    8. - - - -

    9. Thanks

    10. Bob

    其中, 1~~4 行称作信件信头(message header) 6~~10行描述信件要表达的内容,称为信体 (message body)。第5行是空行,根据RFC822的要求,信头和信体之间必须加入一空行。[i]信头通常包含字段From, To, Subject 和Date,有的邮件还包含cc,bcc等字段。

    2. 邮件的信头

    事实上,邮件在传输过程中,服务器要把它打包成一个数据对象,包括上面的信件和一个信封。邮件的投递是依靠信封上的地址或信封信头(envelop address 或envelop header),而不是上面讲的信件上的地址。

    从表面上看,一封邮件是从发件人的机器直接传送到收件人的机器,但通常这并不正确,一封邮件发送和接受过程至少要经过四台计算机。参考下图所示。用户通常在自己的电脑前编写阅读邮件,我们把它叫做客户端 (client 1~~4 )。大部分组织里,都是用一台专门的机器处理邮件,称作邮件服务器 (SMTP1,
    smtp2). 如果用户是从家里拨号上网,那末邮件服务器是ISP 提供的。



    当某个用户在自己的电脑 Client1 前编写完一个邮件,然后把它发送到他的ISP 的邮件服务器SMTP1。此时她的机器已经完成了所有的工作,但邮件服务器SMTP1还必须想法把邮件发送到目的地。SMTP1 通过阅读信头或信封上的地址,找到收件认得邮件服务器smtp2, 然后与该服务器建立连接,把邮件发到收件人的服务器上,等待收件人来取阅。

    下面我们将通过一个例子说明整个邮件传送过程及邮件的信头变化。假设发件人的名字叫 Sender, email地址是
    sender@domain1.com使用的电脑名字叫 client1, IP 地址是 [111.11.1.1] (假设的地址)。 收件人的名字叫 receipt, email 地址是 receipt@domain2.com, 使用的电脑的名字叫 client2,IP 地址是 [222.22.2.2] (假设的地址)。当邮件编辑完传送给其邮件服务器mail.domain1.com 时,邮件的信头格式为:

    From:
    sender@domain1.com

    To:
    receipt@domain2.com

    Date: Tue, Mar 18 1998 15:36:24 GMT

    X-mailer:Sendmail 8.9.0

    Subject: Greetings

    当邮件服务器 mail.domain1.com 把邮件传到接收方的服务器 mail.domain2.com 时,接受方服务器会在信头上记录下有关的计算机信息,邮件的信头变成:

    Received: from client1.domain1.com (client1.domain1.com [111.11.1.1]) by mail.domain1.com (8.8.5) id 004A21; Tue, Mar 18 1998 15:3 7:24 GMT

    From:
    sender@domain1.com

    To:
    receipt@domain2.com

    Date: Tue, Mar 18 1998 15:36:24 GMT

    Message-Id:

    X-mailer:Sendmail 8.9.0

    Subject: Greetings

    当收件人服务器mail.domain2.com 把邮件接收并存初下来,等待收件人来阅读时,邮件的信头将会再加入一条记录:

    Received: from mail.domain1.com (mail.domain1.com [111.11.1.0] ) by mail.domain2.com (8.8.5/8.7.2) with E
    smtp id LAA20869; Tue, Mar 18 1998 15:39:44 GMT

    Received: from client1.domain1.com (client1.domain1.com [111.11.1.1]) by mail.domain1.com (8.8.5) id 004A21; Tue, Mar 18 1998 15:37:24 GMT

    From:
    sender@domain1.com

    To:
    receipt@domain2.com

    Date: Tue, Mar 18 1998 15:36:24 GMT

    Message-Id:

    X-mailer:Sendmail 8.9.0

    Subject: Greetings

    上面整个记录就将是收件人看到的完整的邮件信头。让我们逐行看一下信头中各行的含义:

    Received: from mail.domain1.com (mail.domain1.com [111.11.1.0] ) by mail.domain2.com (8.8.5/8.7.2) with E
    smtp id LAA20869; Tue, Mar 18 1998 15:39:44 GMT

    这封信是从一台自称为 mail.domain1.com 的机器上接收的;这台机器的IP 地址是[111.11.1.0],真实名字就是标称名字 mail.domain1.com; 接收方的机器名称是 mail.domain2.com, 运行的邮件服务器是 Sendmail, 版本(8.8.5/8.7.2) 。接收方机器给邮件的编号是E
    smtp id LAA20869, 接收到的时间是 Tue, Mar 18 1998 15:39:44 GMT。

    Received: from client1.domain1.com (client1.domain1.com [111.11.1.1]) by mail.domain1.com (8.8.5) id 004A21; Tue, Mar 18 1998 15:37:24 GMT

    这条记录表明信件是由机器client1.domain1.com ( IP 地址是 [111.11.1.1]) 在Tue, Mar 18 1998 15:37:24 GMT交给mail.domain1.com,并赋给编号id 004A21。

    From,TO ,Date和Subject 都易于理解,分别指明发件人,收件人,信件编辑日期及信件主题。

    Message-Id:

    这是由发件方邮件服务器赋给这封邮件的编号。与其它编号不同,这个编号自始至终跟随邮件。


    ◆ OPEN RELAY 的原理及测试

    1.OPEN RELAY 的原理

    由于技术的原因,在80年代前,网络还不是很健全,机器之间很少能直接对话发送邮件,人们必须得找出一条有效的连接通路来,然后信件沿着通路一步一步传送到目的地。
    smtp协议中就明确指出当邮件在不同的网络间传送时,需要借助中间服务器的RELAY。

    邮件在收件方和发件方之间会经过毫不相干的第三方服务器,这就是邮件转发 (RELAY)。 如下图所示:



    图中的 MAIL SERVER 是可以对要求转发的邮件进行限制的,如只转发来自某个域的邮件或来自于某些IP 得邮件。如果转发没有任何限制,就被称为 OPEN RELAY 或 THIRD PARTY RELAY。
    从历史上看,relay 曾经发挥过重要作用。而且当时这些工作主要靠手工来做,就像我们今天通过邮局发一封信一样。假如我想从沈阳发一封信件到深圳,我再信封上写好收信地址深圳,邮局就需要找到定义的运送路线: 沈阳,北京,郑州,长沙,广州,深圳。甚至还要长一些。其中很重要一点是每一个中继站都能很好的理解这封信将被送到哪里,下一个接收站是谁。在电子邮件里,这就相当于每个
    中继服务器清楚下一个服务起是谁,这就是邮件的转发。

    目前,正常邮件转发已经不再必要,相反,无限制转发常常被发送垃圾邮件的人利用,隐藏真实的邮件来源,让别人以为是从另外的ISP 发出的信件;同时,也把大量的处理工作转移到别人机器上。
    由于前面提到的历史的原因,最初的绝大多数邮件服务器都允许OPEN RELAY的。今天,大部分邮件服务器升级版本已经在缺省设置中关闭了OPEN RELAY, 如Sendmail 从8.9.3版本开始,Exchange Server从5.5版本开始关闭了open relay。有的服务器虽然没有相应的升级版本,也都提供了关闭open relay 的方法,如在NOTES SERVER的配置文件notes.ini 中加入一行:
    smtpMTA_REJECT_RELAYS=1。但由于很多服务器管理员的疏忽而没能及时的修补这些安全漏洞,被利用来转发垃圾邮件。

    2. 如何确认邮件服务器是否RELAY

    假设要测试的IP是202.112.0.0. 可以使用下列命令进行测试,文中的绿色斜题字为测试邮件服务器的反馈信息:

    #telnet 202.112.0.0 25
    Trying 202.112.0.0...
    Connected to 202.112.0.0.
    Escape character is '^]'.
    220 dns.ccert.edu.cn E
    smtp Sendmail 8.11.1/8.11.1; Sat, 30 Jun 2001 21:07:10 +0800
    helo mydomain
    250 dns.ccert.edu.cn Hello point.ccert.edu.cn [202.112.50.3], pleased to meet you
    mail from:nobody@yahoo.com
    250 2.1.0 nobody@#yahoo.com... Sender ok
    rcpt to:nobody@hotmail.com
    550 5.7.1 nobody@hotmail.com... Relaying denied

    最后的Relaying denied 表明该服务器已经安全设置,不会再relay无关邮件了。如果显示的结果是下面的样子,这表明服务器可以转发任何人的邮件。

    rcpt to:nobody@hotmail.com
    250 nobody@hotmail.com... Recipient ok
    data
    354 Enter mail, end with "." on a line by itself
    this is a test of the relay
    .
    250 VAA00289 Message accepted for delivery

    除了用上面的命令行的方法测试外,下面的链接提供了一个测试工具,只需输入IP即

    展开全文
  • SMTP协议简介

    千次阅读 2015-07-24 22:40:14
    smtp服务器是遵循smtp协议的发送邮件服务器,用来发送或中转发出的电子邮件(当接收时作为smtp服务端,当发送时做smtp客户端)。SMTP是一个推协议,它不允许根据需要从远程服务器上“拉”来消息。如果客户使用邮件...

    本文说明:

    SMTP相关了解,如有错误,麻烦指证,谢谢。更多信息请查看RFC2821。

     

    基础知识:

    SMTP(Simple Mail TransferProtocol)即简单邮件传输协议,它是一种TCP协议支持的提供可靠且有效电子邮件传输的应用层协议。smtp服务器是遵循smtp协议的发送邮件服务器,当接收时作为smtp服务端,当发送时做smtp客户端。SMTP是一个推协议,它不允许根据需要从远程服务器上“拉”来消息。如果客户使用邮件客户端收取邮件,需要使用POP3或IMAP协议,向邮件服务器拉取邮件数据,此时该服务器作为POP3或IMAP服务器。如下图所示:

     

     


    说明:

    1、上图读取邮件的箭头是指邮件的流向,该操作是由收件人主动发起的。

    2、用户代理就是用户与电子邮件系统的接口,大多数情况下就是运行在用户PC机上的一个程序,如Foxmail。

    3、发件人用户代理为何不直接将邮件发送给收件人的用户代理,而是通过邮件服务器来传输?

    因为用户电脑、手机性能有限,无法运行收发邮件的程序,并且无法不间断地运行并连接到互联网上. 因此只能将信件暂时存放在邮件服务器中,用户需要时就可以去下载信件。

    4、为什么用户收发邮件时感觉不到SMTP过程?

    如果用户使用用户代理软件,则这个复杂的过程被用户代理屏蔽了,用户只需要进行简单的发送操作就可完成邮件的发送. 如果用户使用Web方式,则所有过程都由邮件服务器完成。

    5、smtp一般不使用中间邮件服务器进行发送,如果接收方邮件服务器未准备好,发送方会保留邮件,稍后进行尝试。

     

    SMTP简单通讯过程

    通过telnet程序来测试一个SMTP服务器,并进行简单说明,如下所示:

    $telnet smtp.example.com 25    < -------------------------   进行了tcp连接

    220 smtp.example.com ESMTP Service(Lotus Domino Release 8.5.3FP6) ready a

    t Thu, 23 Jul 2015 20:48:17 +0800

    HELO zjf            <------------------------- HELO命令标记自己的身份

    250 smtp.example.com Hello zjf([10.10.34.22]), pleased to meet you

    auth login         <------------------------- 进行身份认证

    334 VXNlcm5hbWU6

    base64加密后的用户名

    334 UGFzc3dvcmQ6

    base64加密后的密码

    235 Authentication successful

    mail from:xxx@example.com        < ------------------------- 说明发件人邮箱

    250 xxx@example.com... SenderOK

    rcpt to:yyy@example.com    < ------------------------- (确认接收方是否已做好准备,防止邮件发送了,却发现无此人,或空间不足等造成资源浪费)

    250 yyy@example.com...Recipient OK

    DATA         <------------------------- 表示开始传送邮件的内容

    354 Please start mail input.

    <邮件内容>

    .        <------------------------- 两个回车换行中间用一个点隔开表示邮件内容结束

    250 Mail queued for delivery.  <-------------------------  邮件放入了发送服务器队列

    quit  <------------------------- 退出 

    221 Closing connection. Good bye.


    说明:

    1、25端口是SMTP的标准服务端口,数据不经过加密处理,以明文方式发送。

    当然也支持加密方式SSL/TLS,另有些发送邮箱服务器支持STARTTLS协议。下图是他们之间的区别(并没有详细描述中间的交互过程)



    需要注意的是:

    1)  不加密默认使用25端口;如明确使用SSL/TLS加密,则使用465端口

    2)  在启用STARTTLS协议的时候,使用25端口较好,虽然587主要是针对STARTTLS协议的,但支持该协议的并不一定开放该端口,如网易邮箱。

    3)  STARTTLS协议不是说只能用TLS加密,也可以使用SSL加密。


    2、标识自己的身份

    可通过HELO命令和EHLO命令标识自己的身份,两者的区别是:

    HELO命令可以不进行身份认证(除非服务器要求);

    EHLO命令则需要进行身份认证,并会返回更多的信息给客户端,如是否支持starttls协议。

    如下面所示:

    220 smtp.example.com ESMTP Service(Lotus Domino Release 8.5.3FP6) ready a

    t Thu, 23 Jul 2015 15:58:58 +0800

    EHLO zjf

    250-smtp.example.com Hello zjf([10.10.34.22]), pleased to meet you

    250-TLS

    250-HELP

    250-AUTH LOGIN

    250-STARTTLS           < ------------------------- 说明支持starttls协议

    250-SIZE 18432000

    250 PIPELINING

     

    可见要想知道一个邮件服务器是否支持ssl/tls、starttls,可通过telnet登入相应的端口号,和使用EHLO命令来查看。


    参考资料:

    1、《计算机网络》

    2、百科

    3、https://www.fastmail.com/help/technical/ssltlsstarttls.html


    展开全文
  • SMTP协议详解

    万次阅读 2018-06-04 22:34:45
    在以前接触的项目中,一直都是在做网站时用到了发送mail 的功能,在asp 和.net 中都有相关的发送mail 的类, 实现起来非常简单。最近这段时间因工作需要在C++ 中使用发送mail 的功能,上网搜了一大堆资料,终于得以...

    1. 简介

         SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,尽管邮件服务器可以用SMTP发送、接收邮件,但是邮件客户端只能用SMTP发送邮件,接收邮件一般用IMAP 或者 POP3 。邮件客户端使用TCP的25号端口与服务器通信。

        SMTP在1982年首次被定义在  RFC 821 ,在2008它被更新为扩展的SMTP协议,补充在文件 RFC 5321 ,扩展的协议是目前使用最广泛的协议。

    2. SMTP 模型


    SMTP被设计基于以下交流模型:当用户需要发邮件时候,邮件发送者(sender-SMTP)建立一个与邮件接收者(receiver-SMTP)通信的通道,发送者发送SMTP命令给接收者,接收者收到后对命令做回复。

    通信通道被建立后,发送者发送 MAIL 命令来指定发送者的邮件,如果接受者接收这个邮件,就回复 OK ,接着发送者发送 RCPT命令来指定接收者的邮箱,如果被接收同样回复OK,如果不接受则拒绝(不会终止整个通话)。接收者邮箱确定后,发送者用DATA命令指示要发送数据,并用一个 .  结束发送。如果数据被接收,会收到OK ,然后用QUIT结束会话。

    3. SMTP 步骤

    这里有三个步骤对于mail事务,第一步用 MAIL 命令给出发送者的身份,第二步用一个或者多个RCPT命令给出接收者信息,接着用DATA命令给出邮件数据。

    第一步是MAIL命令,<reverse-path>包含发送者邮箱( <SP>是空格,<CRLF>是回车换行

    • MAIL <SP> FROM:<reverse-path> <CRLF>

    这个命令告诉接收者,开始一个新的邮件事务,重置所有的状态表和缓存区,包括接受者信息和邮件数据,<reverse-path>被用于报告错误,如果命令被接受,返回250 OK

    第二步是 RCPT命令

    • RCPT <SP> TO:<forward-path> <CRLF>

    这个命令提供一个接收者邮箱,如果被接受返回250 OK,如果不能被识别,返回550 Failure,这个第二步可以被重复多次。

    第三步是 DATA命令

    • DATA <CRLF>

    如果被接受,返回354,并认为所有后续行都会邮件数据信息。当收到文本结束符时候,返回250OK

    邮件数据的末尾必须被指明,为了激活命令和回复的对话。通过发送只包含一个英文句号的行,来提示邮件数据结束。

    请注意: 邮件数据(mail data)包含邮件头部关键字,如Date, Subject, To, Cc, From

    下面的例子演示一下这些命令的使用(S: send发送,R:reply 回复)

    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 and Brown可以收到邮件,Green邮箱无效不能收到邮件。

    4. 传输通道的打开与关闭

    下面两个命令用于打开关闭传输通道

    • HELO <SP> <domain> <CRLF>
    • QUIT <CRLF>

    HELO命令用主机介绍它自己,可以被翻译为"Hello, I am<domain>".

    5.  SMTP命令汇总

    • HELO <SP> <domain> <CRLF>
    • EHLO <SP> <domain /address-literal > <CRLF>  新标准用于替换 HELO 命令
    • MAIL <SP> FROM:<reverse-path> <CRLF>
    • RCPT <SP> TO:<forward-path> <CRLF>
    • DATA <CRLF>
    • RSET <CRLF>
    • SEND <SP> FROM:<reverse-path> <CRLF>
    • SOML <SP> FROM:<reverse-path> <CRLF>
    • SAML <SP> FROM:<reverse-path> <CRLF>
    • VRFY <SP> <string> <CRLF>
    • EXPN <SP> <string> <CRLF>
    • HELP [<SP> <string>] <CRLF>
    • NOOP <CRLF>
    • QUIT <CRLF>
    • TURN <CRLF>

    命令语义:

    SMTP命令由四个不区分大小写的字母组成,如果命令带参数,则用空格与参数隔开,命令用回车换行结尾<CRLF>

    1. EHLO(Extended helloor  HELO(hello)
      这个命令用于说明自己是SMTP客户端身份,参数包含客户端的域名(domain)。其中EHLO是SMTP补充协议( RFC 5321 )中用于替换HELO命令的新命令,协议规定服务器支持EHLO命令的时候,尽量使用EHLO命令,为了兼容以前的版本,要求服务器继续支持HELO命令。如果收到回复OK,说明发送者和接收者处于初始状态,所有的状态表和缓存区都被清零。
    2. MAIL
      这个命令的参数是发送者邮箱<reverse-path>,参数中有 FROM 关键字,这个命令会清空之前的发送者邮箱(the reverse-path buffer)、接收者邮箱(forward-path buffer)和邮件数据(the mail data buffer)。
    3. RCPT (recipient)
      用于指定一个邮件接收者,参数中有TO 关键字,指定多个接收者通过重复使用这个命令。
    4. DATA 
      这个命令没有参数,告诉服务器接着要发送邮件内容。
      邮件内容包含邮件标题项(message header section )和邮件正文(message body),
      标题项(Header Fields )是以项目名(field name)为行的起点,接着是冒号(":"),跟着是内容(field body)以回车换行结束(CRLF),下面是标题项的例子
      1. From: Bob@example.com 
      2. To: Alice@example.com
      3. Cc: theboss@example.com 
      4. subject: subject 
      其中From、To、Cc、subject就是项目名,冒号后是内容。邮件的标题区与正文区需要用一个空行隔开。两者共同组成DATA命令的参数,正文区用只有一个点字符“.”的单行来结束。
    5. SEND 
      初始化邮件事务,邮件数据被转发到一个或多个终端。
    6. SOMLSEND OR MAIL)
      初始化邮件事务,邮件数据被转发到一个或多个终端或邮箱。
    7. SAML(SEND AND MAIL)
      初始化邮件事务,邮件数据被转发到一个或多个终端和邮箱。
    8. RSET(RESET)
      这个命令用来终止邮件事务(mail transaction),任何已经存储的发送者、接收者、邮件数据(mail data)信息都被丢弃,缓存区被清零。
    9. VRFY(VERIFY) 
      验证邮箱是否存在,如果参数是用户名,则返回一个全名(如果存在)。
    10. EXPN(EXPAND) 
      验证邮箱列表
    11. HELP
      返回帮助信息,带参数时候,返回指定的帮助信息。
    12. NOOP 
      这个命令指示服务器收到命令后不用回复 “OK”
    13. QUIT 
      关闭传输通道。
    14. TURN 
      交换邮件发送者和接收者的角色,这个命令用在建立连接成本高的时候,TCP连接不用这个命令。这个命令会产生安全问题,只有在服务器可以被授权作为客户端时候才能用。

    6.  新标准rfc5321弃用的命令



    这里是c++发邮件类(含附件带注释)
    https://blog.csdn.net/sinat_36219858/article/details/80439782
    这个是便于理解的函数式编程c++发邮件程序
    https://blog.csdn.net/sinat_36219858/article/details/71074776


    参考:http://www.cnblogs.com/sdgwc/p/3324368.html



    展开全文
  • SMTP协议介绍

    万次阅读 多人点赞 2017-04-03 18:21:15
    1、SMTP介绍 基本概念 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件 的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送...

    1、SMTP介绍

    • 基本概念

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件
    的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件
    时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程
    只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。SMTP
    是一种TCP协议支持的提供可靠且有效电子邮件传输的应用层协议。

    • 工作过程

    首先,运行在发送端邮件服务器主机上的SMTP客户,发起建立一个到运行在接收端邮件服务器主机上的
    SMTP服务器端口号25之间的TCP连接。如果接收邮件服务器当前不在工作,SMTP客户就等待一段时间后再
    尝试建立该连接。

    2、SMTP命令和应答

    这里写图片描述
    SMTP使用一些命令和应答,在MTA客户和MTA服务器之间进行之间传输报文。如下图所示,为SMTP主要的命令和应答:
    这里写图片描述

    3、邮件报文的封装和报文格式

    SMTP协议可以将互联网邮件报文封装在邮件对象中。SMTP协议的邮件对象由两个部分组成:信封和内容。

    • 信封实际上是一种SMTP命令。
    • 邮件报文是邮件对象中的内容,它又有首部和主体两个部分。
      如下图就是一个邮件对象的组成的示例:
      这里写图片描述

    下面是写进了RFC文档的对报文格式的定义:

    
     1. 所有报文都是由ASCII码组成
     2. 报文由报文行组成,各行之间用回车(CR)、换行(LF)符分隔
     3. 报文的长度不能超过998个字符
     4. 报文行的长度≤78个字符之内(不包括回车换行符)
     5. 报文中可包括多个首部字段和首部内容
     6. 报文可包括一个主体,主体必须用一个空行与其首部分隔
     7. 除非需要使用回车与换行符,否则报文中不使用回车与换行符
    

    4、邮件报文的传送过程

    • 连接建立
    SMTP客户和SMTP服务器首先要建立TCP连接。
    
     1. 从客户端使用熟知端口号25建立与服务器的TCP连接,SMTP服务器向该客户送回应答码220,并且还为客户端提供了服务器的域名
     2. 客户端收到应答码后,发送HELO命令,启动客户端和服务器之间的SMTP会话。该客户端发送的HELO用来向服务器提供客户端的标识信息
     3. 服务器端回应应答码250,通知客户端:请求建立邮件服务会话已经实现
    

    -报文发送

    在SMTP客户与SMTP服务器之间的连接建立之后,发信的用户就可以与一个或多个收信人交换邮件报文了。
    
     1. 客户用“MAIL FROM”向服务器报告发信人的邮箱与域名
     2. 服务器向客户回应应答码“250”,代表请求命令完成
     3. 客户用“RCPT TO”命令向服务器报告收信人的邮箱与域名
     4. 服务器向客户回应应答码“250”,代表请求命令完成
     5. 客户用“DTAT”命令对报文的传送进行初始化
     6. 服务器回应“354”,表示可以进行邮件输入了
     7. 客户用连续的行向服务器传送报文的内容,每行以两字符的行结束标识(CR与LF)终止。报文以只有一个“.”的行结束
     8. 服务器向客户回应应答码“250”,代表请求命令完成
    
    • 连接终止
    报文发送完毕后终止本次SMTP会话。
    
     - 客户端发送“QUIT”命令
     - 服务器收到命令后,回应应答码“221”,并结束会话
    

    下面,我们模拟上述三个步骤,对下面这个邮件报文进行传输:
    这里写图片描述

    • 建立连接
      这里写图片描述
    • 传输报文
      这里写图片描述
    • 终止连接
      这里写图片描述

    5、SMTP协议的扩展协议:MIME

    MIME不属于一个邮件传输协议,它只是对SMTP的一个扩展,不能替代SMTP协议,至于为啥要替换SMTP了。主要是因为SMTP协议在传输报文时,只能够传输7位的ASCII格式的报文,不支持那些不使用7位ASCII格式的语种,同时它也不支持语音和视频数据的传输,因此我们需要一个辅助性协议帮忙传输报文,它就是MIME。

    MIME协议定义了5种头部,用来加在原始的STMP头部,以便定义参数的转换。他们分别是:

    
     1. MIME-Version:MIME版本
     2. Content-Type:内容类型
     3. Content-Tansfer-Encoding:内容传输编码
     4. Content-ID:内容标识
     5. Content-Description:内容描述
    

    如下图所示,就是一个MIME邮件报文格式:
    这里写图片描述

    展开全文
  • SMTP服务器

    2020-07-30 23:33:32
    实现一个简单的SMTP服务器,允许标准的客户端,如outlook express发送邮件: (1)给出协议的交互日志。 (2)保存显示客户端发送邮件内容(显示客户端发送的文字和图片)。 (3)支持多用户。 (4)使用c系列语言...
  • SMTP协议详解及工作过程

    万次阅读 2016-06-13 16:51:23
    1、SMTP协议简介 SMTP称为简单邮件传输协议(Simple Mail Transfer Protocal),目标是向用户提供高效、可靠的邮件传输。它的一个重要特点是它能够在传送中接力传送邮件,即邮件可以通过不同网络上的主机接力式传送...
  • 协议基础:SMTP:使用Telnet学习SMTP协议

    万次阅读 多人点赞 2018-07-30 20:05:50
    SMTP是简单邮件传输协议的缩写,这篇文章将通过如何使用telnet命令发生邮件结合RFC文档来学习一下SMTP协议的基础知识。 OSI模型 &amp;amp;amp;amp; SMTP SMTP vs POP3 &amp;amp;amp;amp; IMAP SMTP和...
  • 常用邮箱SMTP服务器地址大全

    万次阅读 2018-01-31 14:46:46
    常用邮箱SMTP服务器地址大全    阿里云邮箱(mail.aliyun.com):  POP3服务器地址:pop3.aliyun.com(SSL加密端口:995;非加密端口:110)  SMTP服务器地址:smtp.aliyun.com(SSL加密端口:465;非...
  • SMTP的几个端口的比较

    万次阅读 2017-12-12 14:49:21
    1. SMTP Port 25: 25口是四个端口中最老的。这是在33年前,在1982过时的RFC 821中首次引入该协议时分配给SMTP的端口号。尽管它时间长和其他端口数字的到来,端口25仍然非常广泛使用。 然而,由于这个端口经常...
  • 邮箱smtp服务器及端口收集

    万次阅读 2014-10-28 20:32:02
    网易  163邮箱  POP3:pop.126.com ... SMTPsmtp.126.com ... SMTP端口号:25  126邮箱  POP3:pop.126.com  SMTPsmtp.126.com  SMTP端口号:25 新浪 
  • 各种常见邮箱端口

    万次阅读 2017-12-15 20:36:37
    网易 163邮箱 POP3:pop.126.com SMTPsmtp.126.com SMTP端口号:25 126邮箱 POP3:pop.126.com SMTPsmtp.126.com SMTP端口号:25新浪 免费邮箱 POP3:pop.sina.com SMTPsmtp.si
  • 各大型邮箱smtp服务器及端口收集

    万次阅读 2012-02-24 09:29:20
    各大型邮箱smtp服务器及端口收集: >新浪邮箱smtp服务器 外发服务器:smtp.vip.sina.com 收件服务器:pop3.vip.sina.com 新浪免费邮件 外发服务器:smtp.sina.com.cn 收件服务器:pop3.sina.com.cn   >163...
  • 常用邮箱SMTP、POP3域名及其端口号

    万次阅读 2019-04-28 10:43:46
    下面列举一下常用邮箱的POP3、SMTP及其端口号。 网易163邮箱 POP3:pop.163.com SMTPsmtp.163.com SMTP端口号:25 网易vip.163邮箱 POP3:pop.vip.163.com SMTPsmtp.vip.163.com SMTP端口号:25 ...
  • 邮箱smtpserver及port收集

    万次阅读 2019-01-06 02:38:18
    网易  163邮箱  POP3:pop.126.com  SMTPsmtp.126.com ... SMTPport号:25  126邮箱  POP3:pop.126.com  SMTPsmtp.126.com  SMTPport号:25 ...
  • 笔记搭建一个个人网站——邮箱配置   下载插件 https://wordpress.org/plugins/link-manager/ ...主要是配置SMTP 然后发送测试即可。 配置如下图1,摘自网络 蛤蟆配置的最新插件如下图2 需要注意的
  • javax.mail.MessagingException: Unknown SMTP host: smtp.163.com; nested exception is: java.net.UnknownHostException: smtp.163.com  这个就是服务器解析的问题,配置一下 在/etc/hosts里配置一下就是可以...
  • 很多网友程序中都要配置邮箱的,可以让系统自动发送...邮件自动群发通内部已经内置了很多常用的SMTP地址,会根据你录入的账户邮件地址自动选择,如果没有将为你推荐一个。 一般的SMTP服务器地址是【www.qdcysm.com石
  • 常用邮箱smtp的设置

    万次阅读 2012-04-28 20:46:13
    smtp地址 smtp.tom.com pop3地址 pop.tom.com 163.com smtp地址 smtp.163.com pop3地址 pop.163.com 126.com smtp地址 smtp.126.com pop3地
  • 邮件自动群发通内部已经内置了很多常用的SMTP地址,会根据你录入的账户邮件地址自动选择,如果没有将为你推荐一个。 一般的SMTP服务器地址是在邮箱地址前增加smtp,比如 email@126.com 的SMTP地址是 smtp.126.com。...
  • 服务器发送邮件出现Could not connect to SMTP host错误 解决办法 功夫不负有心人,最后了解到,除了google的smtp服务器收到请求“smtp”会接受,其他服务器比如qq 163什么的必须要收到“smtp”请求(大写),郁闷...
1 2 3 4 5 ... 20
收藏数 187,837
精华内容 75,134
关键字:

smtp