邮件smtp协议 mail

邮件协议只要有POP3/SMTP和IMAP:

主要介绍SMTP:

1.   SMTP (Simple Mail Transfer Protocol) : 电子邮件从客户机传输到服务器或从某一个服务器传输到另一个服务器使用的传输协议。 SMTP 是请求/响应协议,命令和响应都是基于 ASCII 文本,并以 CR 和 LF 符结束。响应包括一个表示返回状态的三位数字代码。SMTP 在 TCP 协议 25 端口监听连接请求。

ESMTP

ESMTP (Extended SMTP),顾名思义,扩展 SMTP 就是对标准 SMTP 协议进行的扩展。它与 SMTP 服务的区别仅仅是,使用 SMTP 发信不需要验证用户帐户,而用 ESMTP 发信时,服务器会要求用户提供用户名和密码以便验证身份。验证之后的邮件发送过程与 SMTP 方式一样。

2.SMTP命令

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

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

MAIL FROM 命令中指定的地址是发件人地址

RCPT TO 标识单个的邮件接收人;可有多个 RCPT TO;常在 MAIL 命令后面。

DATA 在单个或多个 RCPT 命令后,表示所有的邮件接收人已标识,并初始化数据传输,以 CRLF.CRLF 结束

VRFY 用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令

EXPN 验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用

HELP 查询服务器支持什么命令

NOOP 无操作,服务器应响应 OK

RSET 重置会话,当前传输被取消

QUIT 结束会话

Microsoft Windows® SMTP 服务 (SMTPSVC) 提供的 SMTP 命令:

SMTP 命令

SMTP 命令 命令功能

HELO

客户端为标识自己的身份而发送的命令(通常带域名)

EHLO

使服务器可以表明自己支持扩展简单邮件传输协议 (ESMTP) 命令。

MAIL FROM

标识邮件的发件人;以 MAIL FROM: 的形式使用。

RCPT TO

标识邮件的收件人;以 RCPT TO: 的形式使用。

TURN

允许客户端和服务器交换角色,并在相反的方向发送邮件,而不必建立新的连接。

ATRN

ATRN (Authenticated TURN) 命令可以选择将一个或多个域作为参数。如果该会话已通过身份验证,则 ATRN 命令一定会被拒绝。

SIZE

提供一种使 SMTP 服务器可以指出所支持的最大邮件大小的机制。兼容的服务器必须提供大小范围,以指出可以接受的最大邮件大小。客户端发送的邮件不应大于服务器所指出的这一大小。

ETRN

SMTP 的扩展。SMTP 服务器可以发送 ETRN 以请求另一台服务器发送它所拥有的任何电子邮件。

PIPELINING

提供发送命令流(而无需在每个命令之后都等待响应)的能力。

CHUNKING

替换 DATA 命令的 ESMTP 命令。该命令使 SMTP 主机不必持续地扫描数据的末尾,它发送带参数的 BDAT 命令,该参数包含邮件的总字节数。接收方服务器计算邮件的字节数,如果邮件大小等于 BDAT 命令发送的值时,则该服务器假定它收到了全部的邮件数据。

DATA

客户端发送的、用于启动邮件内容传输的命令。

DSN

启用传递状态通知的 ESMTP 命令。

RSET

使整个邮件的处理无效,并重置缓冲区。

VRFY

确认在邮件传递过程中可以使用邮箱;例如,vrfy ted 确认在本地服务器上驻留 Ted 的邮箱。该命令在 Exchange 实现中默认关闭。

HELP

返回 SMTP 服务所支持的命令列表。

QUIT

终止会话。

下表列出了 Exchange 使其可用于 SMTP 服务的扩展 SMTP 命令。

扩展的 SMTP 命令

扩展的 SMTP 命令 命令功能

X-EXPS GSSAPI

Microsoft Exchange Server 2003 和 Exchange 2000 Server 服务器用来进行身份验证的方法。

X-EXPS=LOGIN

Exchange 2000 和 Exchange 2003 服务器用来进行身份验证的方法。

X-EXCH50

在服务器到服务器通信的过程中,提供传播邮件属性的能力。

X-LINK2STATE

在 Exchange 中添加链接状态路由支持。

拓展:

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Exchange 常用的端口

下表列出了 Exchange 常用的端口。有关需要在内部或外部打开哪些端口的详细信息,请参阅 Using Microsoft Exchange 2000 Front-End Servers(英文)。

Exchange 使用的端口

协议 Port 描述

SMTP

TCP: 25

SMTP 服务使用 TCP 端口 25。

DNS

TCP/UDP: 53

DNS 侦听端口 53。域控制器使用此端口。

LSA

TCP: 691

Microsoft Exchange Routing Engine 服务 (RESvc) 在此端口上侦听路由链接状态信息。

LDAP

TCP/UPD: 389

Microsoft Active Directory® 目录服务使用的轻型目录访问协议 (LDAP)、Active Directory 连接器以及 Microsoft Exchange Server 5.5 目录使用此端口。

LDAP/SSL

TCP/UDP: 636

安全套接字层 (SSL) 上的 LDAP 使用此端口。

LDAP

TCP/UDP: 379

站点复制服务 (SRS) 使用此端口。

LDAP

TCP/UDP: 390

这是推荐的备用端口,当 Active Directory 域控制器上运行的是 Exchange Server 5.5 时,用于配置 Exchange Server 5.5 LDAP 协议。

LDAP

TCP: 3268

全局编录。Windows 2000 和 Windows Server 2003 Active Directory 全局编录(域控制器“角色”)侦听 TCP 端口 3268。

LDAP/SSLPort

TCP: 3269

SSL 上的全局编录。连接到全局编录服务器的 TCP 端口 3269 的应用程序可以传输并接收 SSL 加密数据。

IMAP4

TCP: 143

Internet 邮件访问协议 (IMAP) 使用此端口。

IMAP4/SSL

TCP: 993

SSL 上的 IMAP4 使用此端口。

POP3

TCP: 110

邮局协议版本 3 (POP3) 使用此端口。

POP3/SSL

TCP: 995

SSL 上的 POP3 使用此端口。

NNTP

TCP: 119

网络新闻传输协议 (NNTP) 使用此端口。

NNTP/SSL

TCP: 563

SSL 上的 NNTP 使用此端口。

HTTP

TCP: 80

HTTP 使用此端口。

HTTP/SSL

TCP: 443

SSL 上的 HTTP 使用此端口。

引用自:https://docs.microsoft.com/zh-cn/previous-versions/exchange-server/exchange-server-2000//aa996114(v=exchg.65)

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

3.SMTP操作返回码的说明:

501  参数格式错误
502  命令不可实现
503  错误的命令序列
504  命令参数不可实现
211  系统状态或系统帮助响应
214  帮助信息
220  <domain>服务就绪
221  <domain>服务关闭
421  <domain>服务未就绪,关闭传输信道
250  要求的邮件操作完成
251  用户非本地,将转发向<forward-path>
450  要求的邮件操作未完成,邮箱不可用
550  要求的邮件操作未完成,邮箱不可用
451  放弃要求的操作;处理过程中出错
551  用户非本地,请尝试<forward-path>
452  系统存储不足,要求的操作未执行
552  过量的存储分配,要求的操作未执行
553  邮箱名不可用,要求的操作未执行
354  开始邮件输入,以"."结束
554  操作失败

================================================================================================================

4. smtp发信的收件人to cc和bcc

发一封信,包含smtp协议部分和信体部分。

协议部分,比如sent from,rcpt to等命令

信体中则才包含from,to,cc等头部。比如我们用foxmail收到一封信,你在foxmail里看到的这封信的所有内容就是信体部分,包含发件人,收件人,抄送,标题等。

当一封信有多个收件人,包含to,cc和bcc,smtp协议首先会把所有的收件人逐个进行rcpt to,然后信体部分包含to和cc的头部(注意不包含bcc的头部,这也是为什么信体中看不到暗送收件人的原因)

只有被rcpt to的收件人才会收到信件。

 举个例子

sender:[email protected]

to1:[email protected]

cc1:[email protected]

bcc1:[email protected]

这封信要被发出去,步骤是这样的:

1.smtp协议进行rcpt to命令,对象为所有收件人,[email protected],[email protected],[email protected]

2.信体部分,加上几个头部

to:[email protected]

cc:[email protected]

注意不会填加bcc头部。

3.然后加载信件主体部分再发出去。

4.收件人收信。因为收件人看到的信件是信体部分,所有看不到bcc的收件人。这样达到了暗送的目的。

code:

#!/usr/bin/env python
#coding=utf-8
import smtplib
import random
from email.MIMEMultipart import MIMEMultipart 
from email.MIMEBase import MIMEBase 
from email.MIMEText import MIMEText 
from email.Utils import COMMASPACE, formatdate 
from email import Encoders 
import os 
def sendMail(fromadd,to,cc,bcc, subject, text, files=[],server="localhost"): 
    fro = fromadd
    msg = MIMEMultipart()
    print 'FROM:',fro
    msg['From'] = fro 
    toAll = []
    if to[0]:
        print "To:",to
        msg['To'] = COMMASPACE.join(to)
        [toAll.append(i) for i in to]
    if cc[0]:
        print 'CC:',cc
        msg['Cc'] = COMMASPACE.join(cc)
        [toAll.append(i) for i in cc]
    if bcc[0]:
        print "Bcc",bcc
        [toAll.append(i) for i in bcc]
    msg['Date'] = formatdate(localtime=True) 
    msg['Subject'] = subject 
    msg.attach(MIMEText(text))
    for file in files:
        part = MIMEBase('application', "octet-stream") 
        part.set_payload( open(file,"rb").read() )
        Encoders.encode_base64(part)
        part.add_header('Content-Disposition', 'attachment; filename="%s"'% os.path.basename(file))
        msg.attach(part)
        smtp = smtplib.SMTP(server)
#        smtp.set_debuglevel(1)
        smtp.sendmail(fro,toAll,msg.as_string()) 
        smtp.close() 
if __name__ == '__main__' :
    server = '10.226.55.3'
    i = 0
#    while True:
    for id in xrange(1):
        a = random.randint(1,2)
        try:
            fromAdd = 'someone%[email protected]'%a
            toAdd = ['[email protected]',]
            ccAdd=['[email protected]','[email protected]']
            bccAdd=['[email protected]',]
            file = ['c:\\esg.7z',]
            sendMail(fromAdd,toAdd,ccAdd,toAll,'test','test',file,server)
        except Exception,e:
            print e
            i = 0
        print i+1
        i += 1
    print 'done!'

引用自:https://www.cnblogs.com/yd1227/archive/2011/01/19/1939096.html

================================================================================================

5 使用telnet 命令实现smtp 邮件的发送,具体操作如下:

220 tdcsw.com ESMTP Sendmail 9.13.9/8.16.8; Wed, 23 Dec 2019 18
:19:18 +0800
HELO tdcsw
250 tdcsw.com Hello x-128-101-1-240.ahc.umn.edu [128.101.1.240], pleased to meet you
MAIL FROM:[email protected]
250 2.1.0 [email protected]... Sender ok
RCPR TO:[email protected]
250 2.1.5 [email protected]... Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
SUBJECT:HELLO
HI:
HAR are you?
.
250 2.0.0 nBNAIIG4000507 Message accepted for delivery
quit
221 2.0.0 tdcsw.maintek.corpnet.asus closing connection
Connection to host lost.

--------------------------------------------------------------------------------------------------------------------------------------

举例:连接sohu邮件服务器

C:\Documentsand Settings\Administrator>telnet smtp.sohu.com 25---------连接服务器 25 端口

220 zwwww03 ESMTP ready                           ---------服务器响应

helo yangtao                                             ---------向服务器标识用户身份,发信不要认证

250 zwwww03                                         ---------服务器对标识用户身份的响应

【ehlo haha                         】           ---------ESMTP命令,发信需要认证。

【250-zwwww01                】          

【250 AUTH PLAIN LOGIN】

auth login                                                 ---------进行用户身份认证

334 VXNlcm5hbWU6                                ---------服务器响应:VXNlcm5hbWU6解码后为“username:”

aGFoYXl0YW9Ac29odS5jb20=                  ---------经过base64编码的用户名

334 UGFzc3dvcmQ6                                 ---------服务器响应:UGFzc3dvcmQ6解码后为“password:”

eWFuZzEyMjg=                                        ---------经过base64编码的密码

235 2.0.0 OK                                            ---------身份认证成功

【535 5.7.0 Invalidlogin or password】---------身份认证失败

mail from:              ---------mail from 地址[email protected] 真实。

250 2.1.0 Ok                                            ---------命令执行成功

rcpt to:<[email protected]       >                   ---------递送给地址[email protected]真实。

250 2.1.5 Ok                                            ---------命令执行成功

data                                                         ---------数据传输初始化

354 End data with .  ---------服务器响应,提示数据输入以“.”结束

from:[email protected]                                ---------输入邮件发送人,可欺骗

to:[email protected]                              ---------输入邮件接收人

date:Mon, 25 Oct 2004 14:24:27 +0800              ---------输入邮件时间

Subject: test mail                                       ---------输入邮件主题

                                                               ---------空一行输入邮件正文

HelloWorld!                                              ---------输入邮件正文内容

Hhhh                                                       

.                                                              ---------以“.”结束数据传输

250 2.0.0 Ok: queued as 3C8CF699F8D      ---------命令执行成功

Quit                                                         ---------断开和服务器的连接

221 2.0.0 Bye                                           ---------服务器返回断开响应

失去了跟主机的连接。

 

C:\Documentsand Settings\Administrator>

注:

auth=loginplain意思是认证方式包括login和plain方式

一般的邮件客户端都使用login方式认证,netscape的使用plain认证方式。

另外还有md5等认证方式,

login认证的时候,为了防止用户名和密码明文传输,使用base64加密传输的信息

你可能感兴趣的:(邮件email协议)