SMTP协议研究

SMTP简介

SMTP称为简单邮件传输协议(Simple Mail Transfer Protocal),目标是向用户提供高效、可靠的邮件传输。它的一个重要特点是它能够在传送中接力传送邮件,即邮件可以通过不同网络上的主机接力式传送。通常它工作在两种情况下:一是邮件从客户机传输到服务器;二是从某一个服务器传输到另一个服务器。SMTP是一个请求/响应协议,它一般监听25号端口,加密协议一般使用465端口,用于接收用户的Mail请求,并与远端Mail服务器建立SMTP连接。

在实际应用中,一般使用SMTP协议发送邮件,一般使用POP3,IMAP协议接收邮件

SMTP协议工作机制

SMTP通常有两种工作模式。发送SMTP和接收SMTP。具体工作方式为:发送SMTP在接收到用户的邮件请求后,判断此邮件是否为本地邮件,若是本地邮件,直接投送到用户的邮箱,否则向DNS查询远端邮件服务器的MX记录,并建立与远端接收SMTP之间的一个双向传送通道,此后SMTP命令由发送SMTP发出,由接收SMTP接收,而应答则反方向传送。一旦传送通道建立,SMTP发送者发送MAIL命令指明邮件发送者。如果SMTP接收者可以接收邮件则返回OK应答。SMTP发送者再发出RCPT命令确认邮件是否接收到。如果SMTP接收者接收,则返回OK应答;如果不能接收到,则发出拒绝接收应答(但不中止整个邮件操作),双方将如此反复多次。当接收者收到全部邮件后会接收到特别的序列,如果接收者成功处理了邮件,则返回OK应答。

邮箱的发送流程

先来了解一下邮件的概念

电子邮件和我们生活中发送的邮件很像,也可以映射为信封、称谓、时间、正文等。

20170403164927322

其中信封的部分就是通过SMTP命令指定的,首部和主体就是写在邮件正文中的。

具体怎么来指定这些信息,就要通过SMTP命令了,具体操作流程如下:

telnet smtp.126.com 25 #与邮箱服务器简历链接
#220 126.com Anti-spam GT for Coremail System (126com[20140526])

EHLO localhost   #新协议中用来替代HELO命令
#250-mail
#250-PIPELINING
#250-AUTH LOGIN PLAIN
#250-AUTH=LOGIN PLAIN
#250-coremail 1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UF9xA92UCa0xDrUUUUj
#250-STARTTLS
#250 8BITMIME

AUTH LOGIN   #开始认证
#334 dXNlcm5hbWU6

ZXhhbXBsZQ==    #base64编码的用户名,example@126.com为例,这里就是base64(example)
#334 UGFzc3dvcmQ6、

ZXhhbXBsZQ==   #base64编码的密码
#235 Authentication successful

MAIL FROM:<example@126.com> #指定发送者,这个命令会重置发送者、接收者和邮件数据
#250 Mail OK

RCPT TO:<example@126.com>  #指定接收者,这个命令可以执行多次,设置多个接收者
#250 Mail OK

DATA  #这个命令没有参数,指定下面为邮件的正文
#354 End data with <CR><LF>.<CR><LF>

FROM:example@126.com   #邮件的正文中也要包含邮件首部信息,from,to,cc,subject
TO:example@126.com
CC:example@126.com
SUBJECT:this is SUBJECT   

this is body first line  #邮件首部信息与邮件主体要用空行分隔
this is second line
.   #邮件已单独的一个"."结束
#250 Mail OK queued as smtp2,DMmowAAnXgAI2wxgIaTcLQ--.8086S2 1611455494

QUIT  #断开连接
#221 Bye

上面的 MAILRCPT 两个命令就是在设置信封,让服务器知道邮件是发给谁的。

DATA命令就是在设置邮件的正文,正文中又包含了首部和主体两部分的信息

SMTP协议的主要命令和响应

SMTP主要命令

命令 含义
EHLO(Extended hello)/HELO(hello) 这个命令用于说明自己是SMTP客户端身份,参数包含客户端的域名(domain)。其中EHLO是SMTP补充协议( RFC 5321 )中用于替换HELO命令的新命令,协议规定服务器支持EHLO命令的时候,尽量使用EHLO命令,为了兼容以前的版本,要求服务器继续支持HELO命令。如果收到回复OK,说明发送者和接收者处于初始状态,所有的状态表和缓存区都被清零。
MAIL 这个命令的参数是发送者邮箱<reverse-path>,参数中有 FROM 关键字,这个命令会清空之前的发送者邮箱(the reverse-path buffer)、接收者邮箱(forward-path buffer)和邮件数据(the mail data buffer)。
RCPT(recipient) 用于指定一个邮件接收者,参数中有TO 关键字,指定多个接收者通过重复使用这个命令。
DATA 这个命令没有参数,告诉服务器接着要发送邮件内容。
邮件内容包含邮件标题项(message header section )和邮件正文(message body),
标题项(Header Fields )是以项目名(field name)为行的起点,接着是冒号(":"),跟着是内容(field body)以回车换行结束
FROM:example@126.com
TO:example@126.com
CC:example@126.com
SUBJECT:邮件主题
最后正文结束的地方,以单独的"."为一行,表示邮件正文结束
QUIT 关闭传输通道
AUTH LOGIN 登录认证

SMTP主要应答码

响应码 说明
220 服务就绪
221 服务关闭传输通道
250 请求指定完成
251 用户不是本地用户,报文被转发
354 开始邮件输入
450 邮箱不可用
500 语法错误,不识别的命令
502 命令未实现
552 所有请求动作异常终止
553 请求的动作为发生,邮箱名不允许使用

SMTP协议的扩展协议:MIME

SMTP协议在传输报文时,只能够传输7位的ASCII格式的报文,不支持那些不使用7位ASCII格式的语种,同时它也不支持语音和视频数据的传输,因此我们需要一个辅助性协议帮忙传输报文,它就是MIME。

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

头部 含义
MIME-Version MIME版本
Content-Type 内容格式
Content-Tansfer-Encoding 内容传输编码
Content-ID 内容标识
Content-Description 内容描述

MIME的使用方式

#和之前与服务器建立连接的方式一致,只是在执行DATA命令以后,发送的邮件正文有所不同,正文的示例如下:
From: <example@126.com>
To: <example@126.com>
Subject:this is subject
Date: Sun, 26 Nov 2006 19:01:04+0800
MIME-Version: 1.0
Content-Type:multipart/alternative;boundary="this_is_boundary"

This is a multi-part message in MIME format.

--this_is_boundary
Content-Type: text/plain;charset="gb2312"
Content-Transfer-Encoding:base64

123123123

--this_is_boundary
Content-Type: text/html;charset="gb2312"
Content-Transfer-Encoding:base64

PEI+MTIzMTIzMTIzPC9CPg==

--this_is_boundary
Content-Type: image/jpeg; name="image005.jpg"
Content-Transfer-Encoding:base64

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

--this_is_boundary--
.

注意在第一个Content-Type中设置 boundary,后面可以根据boundary分隔多个内容部分,

每个分隔符号为"--"+boundary

最后一个结束的位置为"--"+boundary+"--"

这个和html上传多文件的时候很像。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容