zoukankan      html  css  js  c++  java
  • 协议基础:SMTP:使用Telnet学习SMTP协议

    协议基础:SMTP:使用Telnet学习SMTP协议

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
    本文链接:https://blog.csdn.net/liumiaocn/article/details/81131420

    SMTP是简单邮件传输协议(Simple Mail Transfer Protocol)的缩写,这篇文章将通过如何使用telnet命令发生邮件结合RFC文档来学习一下SMTP协议的基础知识。

    OSI模型 & SMTP

    根据OSI7层或者5层的模型不同,各层常见的协议信息如下:
    这里写图片描述

    其实协议众多,这里借用一张来源与网络的整理结果用于展示OSI7层模型的常见协议的信息,包括应用层的SMTP/POP3/IMAP4

    这里写图片描述

    SMTP vs POP3 & IMAP4

    这里写图片描述
    SMTP和POP3以及IMAP都是用来做什么的,简单的来说,smtp主要负责发,pop3和imap主要负责收。
    一封邮件的发&收的流程是通过SMTP进行发送,使用POP3或者IMAP4进行接收的。
    这里写图片描述

    SMTP RFC文档

    SMTP的RFC初始版本是RFC 821,以下列出了SMTP相关的一部分RFC变化的列表

    RFC版本时间说明URL
    RFC 821 1982/08 初始版本 https://tools.ietf.org/html/rfc821
    RFC 974 1986/01 域名系统需求和实现相关 https://tools.ietf.org/html/rfc974
    RFC 1035 1987/11 域名系统需求和实现相关 https://tools.ietf.org/html/rfc1035
    RFC 1869 1995/11 ESMTP规格扩展 https://tools.ietf.org/html/rfc1869
    RFC 2841 2001/04 - https://tools.ietf.org/html/rfc2841
    RFC 5321 2008/10 - https://tools.ietf.org/html/rfc5321

    SMTP模型

    参看RFC5321,可以了解到SMTP的模型如下:
    这里写图片描述

    常用指令

    SMTP中包含一些基本的命令用于客户端和服务器端进行交互,现列出一些常见的指令:

    指令说明
    HELO 与服务器确认,通知其客户端使用的机器名称,一般邮件服务器不做限定
    AUTH 使用AUTH LOGIN与服务器进行登录验证
    MAIL FROM 发件人信息,填写与认证信息不同往往被定位为垃圾邮件或恶意邮件
    RCPT TO 收信人地址
    DATA 输入邮件基本信息
    FROM 邮件基本信息:发信人显示信息(此处可以伪造身份,但是非常容易被识别)
    FROM 邮件基本信息:服务器收件人显示信息
    SUBJECT 邮件基本信息:邮件标题,不填写也往往容易被定位为垃圾邮件
    QUIT 断开链接

    常见指令返回码说明

    返回码说明
    220 服务就绪
    250 请求动作成功完成
    235 认证通过
    221 处理中
    354 发送开始,往往与data指令结合
    500 指令错误
    550 命令无法执行

    基本流程

    SMTP客户端与SMTP服务器端一个常见的流程如下所示:

    SMTP客户端SMTP客户端SMTP服务器端SMTP服务器端HELO 机器名(SMTP服务器,这是我的机器名)250 OK我要登录:输入用户名/密码AUTH LOGIN334 返回码(eg:dXNlcm5hbWU6)邮箱登录名的base64编码334 返回码(eg:UGFzc3dvcmQ6)登录密码base64编码235 Authentication successful设定发信人地址MAIL FROM:<发信人地址eg:devopsadmin@163.com>250 Mail OK设定收信人地址RCPT TO:<收信人地址eg:liumiaocn@outlook.com>250 Mail OK我要写信了DATA354 End data with <CR><LF>.<CR><LF>设定From/To/Subject/信件内容,最后以.结束好的,给你发信250 Mail OK

    TELNET

    使用telnet可以使用SMTP指令与服务器端进行交互,不同的OS telnet的安装不同,比如:

    操作系统安装方式
    CENTOS yum install telnet
    MacOS brew install telnet
    Alpine apk add busybox-extras(Alpine 3.7版本以后,之前包含在busybox中)

    验证

    这里使用163的免费信箱进行mail发送试验,信息如下:

    项目说明
    发送方 devopsadmin@163.com
    接收方 liumiaocn@outlook.com
    邮件标题 confirm information

    邮件内容

    Hi, Michael
    
    I got your message.
    Looking forward to meeting you.
    
    Thanks & Best Regards.
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    操作日志

    [root@platform ~]# telnet smtp.163.com 25
    Trying 123.125.50.134...
    Connected to smtp.163.com.
    Escape character is '^]'.
    220 163.com Anti-spam GT for Coremail System (163com[20141201])
    HELO liumiao
    250 OK
    AUTH LOGIN
    334 dXNlcm5hbWU6
    ZGV2b3BzYWRtaW4=
    334 UGFzc3dvcmQ6
    密码的base64编码
    235 Authentication successful
    MAIL FROM:<devopsadmin@163.com>
    250 Mail OK
    RCPT TO:<liumiaocn@outlook.com>
    250 Mail OK
    DATA
    354 End data with <CR><LF>.<CR><LF>
    FROM: devopsadmin@163.com
    To: liumiaocn@outlook.com
    Subject: confirm information
    Hi, Michael
    
    I got your message.
    Looking forward to meeting you.
    
    Thanks & Best Regards.
    .
    250 Mail OK queued as smtp4,DtGowAAHhSrBwV5bL3XJAA--.5571S2 1532936690
    Connection closed by foreign host.
    [root@platform ~]#
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    邮件接收

    这里写图片描述

    操作说明

    注意事项

    输入AUTH LOGIN之后需要输入用户名和密码进行登录,登录时注意如下事项

    • 登录名称为@之前的内容的base64编码,比如devopsadmin@163.com为devopsadmin的base64编码
    • base64编码基本等于明码,但是使用的过程中请注意是否包含回测换行符号,比如devopsadmin的base64编码生成:echo -n “devopsadmin” |base64
    • 密码不是邮箱的密码,网易的话专门还有一个密码,请注意
    • 邮件发送往往服务器端需要做设定,请确认相关的邮件服务器
    • 垃圾邮件不同的邮件系统判断标准不同,一般正确将全部信息填完基本没有问题

    base64编码的换行

    请注意看一下如下代码包含换行与否的情况,认证通不过的时候,请注意检查

    [root@platform ~]# echo -n "devopsadmin" |base64
    ZGV2b3BzYWRtaW4=
    [root@platform ~]# echo "ZGV2b3BzYWRtaW4=" |base64 -d
    devopsadmin[root@platform ~]# 
    [root@platform ~]# 
    [root@platform ~]# echo "devopsadmin" |base64
    ZGV2b3BzYWRtaW4K
    [root@platform ~]# echo "ZGV2b3BzYWRtaW4K" |base64 -d
    devopsadmin
    [root@platform ~]# 
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    DATA段

    DATA段为mail的正文,在这里还可以设定FROM/TO,有些人会在这里试图改变设定来攥改发信的地址,比如那些垃圾邮件的发送者,基本上邮件系统都会在这里做防护。比如163的邮箱,反垃圾邮件的策略如下,对伪造邮件头或者其他方式的欺骗性手段都会进行判断:

    
    1、收件人事先没有提出要求或者同意接收且无法拒收的;
    
    2、使用或包括无效的或伪造的邮件头;
    
    3、使用或包括伪造的、无效的或者不存在的域名;
    
    4、利用任何技术伪造、隐藏或掩盖传输路径来源的识别信息;
    
    5、使用任何方式生成欺骗性地址信息;
    
    6、在没有获得第三方许可的情况下使用、中继或通过第三方的互联网设备;
    
    7、主题行或内容包含错误、误导或虚假的信息;
    
    8、违反了国家相关法律规定和网易服务条款。
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    比如DATA部分的FROM/TO/Subject等不正常设定,你很容易会收到包含554 DT:SPM的信息:

    554 DT:SPM 163 smtp4,DtGowABXwXYYqF5bzXrBAA--.5359S2 1532930131,please see http://mail.163.com/help/help_spam_16.htm?ip=61.152.164.43&hostid=smtp4&time=1532930131
    • 1

    以下为网易免费邮箱关于垃圾邮件相关的错误码:

      •554 DT:SPM 发送的邮件内容包含了未被许可的信息,或被系统识别为垃圾邮件。请检查是否有用户发送病毒或者垃圾邮件;
      •554 DT:SUM 信封发件人和信头发件人不匹配;
      •554 IP is rejected, smtp auth error limit exceed 该IP验证失败次数过多,被临时禁止连接。请检查验证信息设置;
      •554 HL:IHU 发信IP因发送垃圾邮件或存在异常的连接行为,被暂时挂起。请检测发信IP在历史上的发信情况和发信程序是否存在异常;
      •554 HL:IPB 该IP不在网易允许的发送地址列表里;
      •554 MI:STC 发件人当天内累计邮件数量超过限制,当天不再接受该发件人的投信。请降低发信频率;
      •554 MI:SPB 此用户不在网易允许的发信用户列表里;
      •554 IP in blacklist 该IP不在网易允许的发送地址列表里。
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    PS:技术不是用来发送垃圾邮件或者欺骗性的邮件的,而且很多免费的资源往往本身具有公益性质,请不要利用别人没有关闭的门窗让互联网变得更加污浊,学习的时候也请给自己发信不要打扰别人。

    参考文档

    https://tools.ietf.org/html/rfc5321
    http://help.163.com/09/1224/14/5RAB4VK500753VB8.html?servCode=6010330
    http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html

  • 相关阅读:
    PHP(运算符,语句,函数)
    数据库高级查询
    MySQL数据库常用函数
    mySQL数据库数据查询操作详解
    mySQL数据库设计范式及增删改查操作
    mySQL-创建表
    JavaScript-选项卡
    JavaScript做DIV下拉列表
    JavaScript-事件
    JavaScript函数-递归
  • 原文地址:https://www.cnblogs.com/flintlovesam/p/11833659.html
Copyright © 2011-2022 走看看