邮件基本概念及发送方式

2021-11-28

 一:邮件发送的基本介绍

  在工作中我相信大家会经常和邮件打交道,用邮件来进行信息的交流和汇报工作情况;但是在我们程序员眼里,邮件的用处还是挺广泛的,比如我们在注册账号完成时平台会发送一封邮件给我们,让我们点击邮件里的链接来激活当前注册的账号;其实邮件还可以实现验证码的发送、用户操作提醒、活动通知等功能

1:邮件基本介绍

邮件服务器:
    邮件服务器是一种用来负责电子邮件收发管理的设备,同时也是电子邮件系统中的核心内容,
    邮件服务器是有发送邮件SMTP服务器和接收邮件POP3服务器协同工作,并且为用户提供接收邮件的功能。
    邮件服务器比一般的免费邮箱更加安全,一直被企业公司使用

电子邮箱:
    电子邮箱也称为E-mail地址,比如xx@qq.com、xx@163.com。用户能通过E-mail地址标识自己发送的电子邮件,
    同时也可以通过这个地址接收别人发来的电子邮件。电子邮箱需要到邮件服务器进行申请,也就是说,电子邮箱其实就是用户在邮件
    服务器上申请的账户。邮件服务器会把接收到的邮件保存到为该账户所分配的邮箱空间中,用户通过用户名密码登录到邮件服务器查
    收该地址已经收到的邮件。一般来讲,邮件服务器为用户分配的邮箱空间是有限的。

邮件客户端:
    邮件客户端就是我们平常在上面进行邮件发送的网站或者应用,比如常见的FoxMail、雷鸟、outlook、163、mesign等;
    通常使用IMAP/APOP/POP3/SMTP协议收发电子邮件的软件都可以统称邮件客户端;因为这些客户端可以帮助用户把邮件发送给SMTP
   邮件服务器,也可以从POP3/IMAP邮件服务器读取用户的电子邮件 邮件传输协议: 电子邮件需要在邮件客户端和邮件服务器之间,以及两个邮件服务器之间进行邮件传递,那就必须遵守规则,这个规则就是邮件传输协议   SMTP协议(Simple Mail Transfer Protocol)简单邮件传输协议(默认端口25): 它定义了邮件客户端软件和SMTP邮件服务器之间,以及两台SMTP邮件服务器之间的通信规则 POP/POP3协议:(Post Office Protocol)邮件接收协议(默认端口110): 当用户计算机与支持POP协议的电子邮件服务器连接时,把存储在该服务器的电子邮箱中的邮件准确无误地下载到用户的计算机中。 POP3属于离线式协议,即不能对邮件进行在线操作,必须下载到本地才能进行处理。POP协议已发展到第三版,称作POP3。  POP3与SMTP一样都是请求响应协议,命令与响应也都是用NVT ASCII格式的文本表示。POP3响应由一个状态码和其后的附 加信息组成,只有两种状态码:"+OK"(正确)和"-ERR"(失败)   IMAP协议(Internet Message Access Protocol)Internet消息访问协议(默认端口143): 它是对POP3协议的一种扩展,也是定义了邮件客户端软件和IMAP邮件服务器的通信规则,它运行在TCP/IP协议之上,与POP3的主要区别
     是这个IMAP协议可以在线操作,可以不用把用户的所有邮件下载,可以通过客户端直接对服务器上的邮件在线操作

2:邮件发送的基本流程

  下面我简单列举用户A给用户B发送邮件的简单流程图,分别以网易邮箱和企鹅邮箱来演示

①:用户A(xx@163.com)在邮件客户端登录自己的邮箱账号密码;并通过邮件客户端编写一封邮件(收件人xx@qq.com),
   将写好的邮件交到163邮箱服务器里的SMTP服务器里
②:163邮箱服务器会对用户A发送的邮件进行解析,解析收件人的邮箱
    收件人的邮箱是163邮箱:
        直接把邮件存放到自己的163内部邮件服务器存储空间里
    收件人的邮箱为外部邮箱(QQ邮箱、新浪邮箱..):
        SMTP服务器使用SMTP的协议将当前的邮件在互联网中转发到指定位置的邮件服务器里的SMTP服务器
③:QQ邮箱服务器通过SMTP协议接收到了163邮箱服务器发送过来的邮件,此时QQ邮箱服务器也会解析163发过来的邮件是否是自己的;
   此时发现发过来的邮件是自己的,那么QQ邮箱就会把接收过来的邮件存储在QQ邮箱内部的邮件存储空间里

④:用户B(xx@qq.com)在邮件客户端登录自己的邮箱账号密码;然后用户B想看她此时接收的邮件;这时就到第四步了,邮件客户端
   会使用POP3协议连接到QQ邮箱内的POP3服务器
⑤:POP3接收到了请求后,POP3服务器会去QQ邮箱内部的邮件存储服务器内获取到对应用户下的全部邮件并返回给POP3服务器
⑥:POP3服务器获取到用户B的邮件后会将用户B的邮件返会给指定用户的邮件客户端里

二:使用SMTP协议的163/QQ邮箱发送邮件

1:163/QQ邮箱准备

  去注册个163邮箱,注册完以后我们需要手动开启 IMAP/SMTP服务POP3/SMTP服务 正好对应着SMTP协议和POP3协议;开启后我们会得到邮箱客户端连接的授权密码,以后登录其它邮件客户端需要此授权码

网易邮箱:

QQ邮箱:

2:开启telnet客户端服务

  Win+R打开运行并输入OptionalFeatures即可打开【Windows功能】;然后找到 Telnet 客户端 多选框打勾就开启此服务了

若未开启Telnet客户端则执行会爆 "不是内部或外部命令"

3:邮件发送(SMTP)的基本命令

  SMTP协议(Simple Mail Transfer Protocol):简单邮件传输协议,它定义了邮件客户端软件和SMTP邮件服务器之间以及两台SMTP邮件服务器之间的通信规则。SMTP协议的通信双方采用一问一答的命令/响应形式进行对话,SMTP协议分为标准SMTP协议和扩展SMTP协议,标准SMTP协议是1982年在RFC821 文档中定义的,而扩展SMTP协议是1995年在RFC1869 文档中定义的。扩展SMTP协议在标准 SMTP协议基础上的改动非常小,主要增加了邮件安全方面的认证功能,现在我们说的SMTP协议基本上都是扩展SMTP协议。
RFC1869文档参考如下:https://tools.ietf.org/html/rfc1869

SMTP协议中一共定义了18条命令,但是发送一封电子邮件的过程通常只需要6条命令,我针对这6条简单介绍:
命令:ehlo<SP><domain><CRLF>
    ehlo命令是SMTP邮件发送程序与SMTP邮件接收程序建立连接后必须发送的第一条SMTP命令,参数<domain>表示SMTP邮件发送者的主机名,
    ehlo命令用于替代传统SMTP协议中的helo(对于部分邮箱还只能使用helo)命令
命令:auth<SP><para><CRLF>
    如果SMTP邮件接收程序需要SMTP邮件发送程序进行认证时,它会向SMTP邮件发送程序提示它所采用的认证方式,SMTP邮件发送程序接着
    应该使用这个命令回应SMTP邮件接收程序,参数<para>表示回应的认证方式,通常是SMTP邮件接收程序先前提示的认证方式
命令:mail<SP>from:<reverse-path><CRLF>
    此命令用于指定邮件发送者的邮箱地址,参数<reverse-path>表示发件人的邮箱地址
命令:rcpt<SP>to:<forword-path><CRLF>
    此命令用于指定邮件接收者的邮箱地址,参数<forword-path>表示收件人的邮箱地址,如果邮件要发送给多个接收者,
    那么应该使用多条rcpt<SP>to命令来分别指定每一个接收者的邮箱地址
命令:data<CRLF>
    此命令用于表示SMTP邮件发送程序准备开始传送邮件内容,在这个命令后面发送的所有数据都将被当做邮件内容,
    直到遇到"<CRLF>.<CRLF>"标识符,则表示邮件内容结束
命令:quit<CRLF>
    此命令表示要结束邮件发送过程,SMTP邮件接收程序接收到此命令后,将关闭与SMTP邮件服务器的连接

注:<SP>代表空格 <CRLF>代表回车换行

4:使用网易163/QQ邮箱发送邮件

  SMTP协议用来发送邮件

发送邮箱基本流程: ①:和网易邮箱的SMTP服务器建立连接(smtp.163.com为SMTP服务器地址,25为SMTP服务器端口) telnet smtp.163.com 25
   若使用QQ邮箱登录则是 telnet smtp.qq.com 587 ②:使用ehlo命令告知发送者的用户名 ehlo tom ③:选择登录认证方式 auth login ④:分别输入加密后的用户名和密码 eHh4QDE2My5jb20= 注:对应邮箱 xxx@163.com YnF3ZWhod2VyMzI= 注:对应邮箱的授权密码 bqwehhwer32(开启的SMTP服务时的那个授权码) ⑤:指明发件人邮箱和收件人邮箱 mail from:<xxx@163.com> rcpt to:<xxx@qq.com> ⑥:编写发送的邮箱内容(必须按照规范) data -->回车 from:<xxx@163.com> 注:发件人 to:<xxx@qq.com> 注:收件人 subject:hello world 注:subject邮件头主题 注:空行 Hello! My little baby. 注:邮件内容 . 注:点代表结束输入-->
再回车结束 ⑦:结束连接 quit

三:使用POP3协议的163/QQ邮箱接收邮件

1:邮件接收(POP3)的基本命令

命令:user<SP>username<CRLF>
    是P0P3客户端程序与P0P3邮件服务器建立连接后发送的第一条命令,参数username表示收件人的账户名称(不用base64)
命令:pass<SP>password<CRLF>
    是在user命令成功执行后,POP3客户端程序接着发送的命令,参数password表示账户的密码(不用base64)
命令:apop<SP>name,digest<CRLF>
    用于替代user和pass命令,它以MD5数字摘要的形式向POP3邮件服务器提供账户和密码
    https://datatracker.ietf.org/doc/html/rfc1321
命令:stat<CRLF>
    stat命令用于查询邮箱中的统计信息,后面的两个数字分别表示邮件数目和占用字节大小
命令:uidl<SP>msg#<CRLF>
    uidl命令用于查询某封邮件的唯一标识符,参数msg#表示邮件的序号,是一个从1开始的编号
命令:list<SP>[msg#]<CRLF>
    用于列出邮箱中的邮件信息,参数msg#是一个可选参数,表示邮件的序号。当不指定参
    数时,列出所有的邮件信息;指定参数,那么只列出指定邮件信息
命令:retr<SP>msg#<CRLF>
    retr命令用于获取某封邮件的内容,参数msg#表示邮件的序号
命令:dele<SP>msg#<CRLF>
    dele命令用于在某封邮件上设置删除标记,参数msg#表示邮件的序号。当POP3服务器执行dele命
    令时,只是设置删除标记,并不直接删除邮件。当POP3服务器执行quit命令退出时,POP3服务器
    才会删除所有被标记的邮件
命令:rset<CRLF>
    rset命令用于清除所有邮件的删除标记
命令:top<SP>msg#<SP>n<CRLF>
    top命令用于获取序号为msg的邮件的前n行内容(正文)
命令:noop<CRLF>
    用于检查POP3客户端与POP3服务器的连接情况
命令:quit<CRLF>
    quit命令表示要结束邮件接收过程,执行此命令,POP3服务器会删除所有标记了删除了的邮件,
    并关闭与POP3客户端的网络连接

2:使用163/QQ邮箱接收邮件

  POP3协议用来接收邮件

接收邮箱基本流程操作: ①:和网易邮箱的POP3服务器建立连接(pop3.163.com为POP3服务器地址,110为POP3服务器端口) telnet pop.163.com 110 若使用QQ邮箱登录则是 telnet pop.qq.com 110 注:若pop3无法连接则使用pop连接 ②:发送一条命令建立连接,此时需要写出要登录邮箱的用户名(非base64) user antladdie ④:告知服务器当前用户的密码,注意的是授权码(非base64) pass QWERTYUIOPPOIUYT 163邮箱登录成功会返回+OK 2 message(s) [4500 byte(s)] 代表有两封邮件,总大小4500字节

四:常用邮箱服务器的POP3/SMTP地址端口

邮箱名称                        POP3服务器地址                           SMTP服务器地址
QQ邮箱              pop.qq.com(端口:110)                        smtp.qq.com(端口:25)
QQ企业邮箱           pop.exmail.qq.com (SSL启用 端口:995)       smtp.exmail.qq.com(SSL启用 端口:587/465163.com             pop.163.com(端口:110)                     smtp.163.com(端口:25)
sina.com            pop3.sina.com.cn(端口:110)                smtp.sina.com.cn(端口:25)
sina.cn             pop3.sina.com(端口:110)                   smtp.sina.com(端口:25)
sinaVIP             pop3.vip.sina.com (端口:110)              smtp.vip.sina.com (端口:25)
sohu.com            pop3.sohu.com(端口:110)                   smtp.sohu.com(端口:25)
126邮箱              pop.126.com(端口:110)                      smtp.126.com(端口:25)
139邮箱:            POP.139.com(端口:110)                       SMTP.139.com(端口:25)
yahoo.com           pop.mail.yahoo.com(110)                          smtp.mail.yahoo.com(465)
yahoo.com.cn        pop.mail.yahoo.com.cn(端口:995)           smtp.mail.yahoo.com.cn(端口:587
HotMail             pop3.live.com(端口:995)                   smtp.live.com(端口:587)
gmail(google.com)   pop.gmail.com(SSL启用端口:995)              smtp.gmail.com(SSL启用 端口:587263.net             pop3.263.net(端口:110)                    smtp.263.net(端口:25263.net.cn          pop.263.net.cn(端口:110)                  smtp.263.net.cn(端口:25)
x263.net            pop.x263.net(端口:110)                    smtp.x263.net(端口:25)
21cn.com            pop.21cn.com(端口:110)                    smtp.21cn.com(端口:25)
Foxmail             POP.foxmail.com(端口:110)                 SMTP.foxmail.com(端口:25)
china.com:          pop.china.com(端口:110)                   smtp.china.com(端口:25)
tom.com             pop.tom.com(端口:110)                     smtp.tom.com(端口:25)
etang.com           pop.etang.com                               smtp.etang.com

五:常见失败编码速查

421   421 HL:REP 
  该IP发送行为异常,存在接收者大量不存在情况,被临时禁止连接。请检查是否有用户发送病毒或者垃圾邮件,并核对发送列表有效性;   421 HL:ICC
  该IP同时并发连接数过大,超过了网易的限制,被临时禁止连接。请检查是否有用户发送病毒或者垃圾邮件,并降低IP并发连接数量;   421 HL:IFC
  该IP短期内发送了大量信件,超过了网易的限制,被临时禁止连接。请检查是否有用户发送病毒或者垃圾邮件,并降低发送频率;   421 HL:MEP
  该IP发送行为异常,存在大量伪造发送域域名行为,被临时禁止连接。请检查是否有用户发送病毒或者垃圾邮件,并使用真实有效的域名发送; 450   450 MI:CEL 发送方出现过多的错误指令。请检查发信程序;   450 MI:DMC 当前连接发送的邮件数量超出限制。请减少每次连接中投递的邮件数量;   450 MI:CCL 发送方发送超出正常的指令数量。请检查发信程序;   450 RP:DRC 当前连接发送的收件人数量超出限制。请控制每次连接投递的邮件数量;   450 RP:CCL 发送方发送超出正常的指令数量。请检查发信程序;   450 DT:RBL 发信IP位于一个或多个RBL里。请参考http://www.rbls.org/关于RBL的相关信息;   450 WM:BLI 该IP不在网易允许的发送地址列表里;   450 WM:BLU 此用户不在网易允许的发信用户列表里; 451   451 DT:SPM ,please try again 邮件正文带有垃圾邮件特征或发送环境缺乏规范性,被临时拒收。请保持邮件队列,两分钟后重投邮件。需调整邮件内容或优化发送环境   451 Requested mail action not taken: too much fail authentication 登录失败次数过多,被临时禁止登录。请检查密码与帐号验证设置;   451 RP:CEL 发送方出现过多的错误指令。请检查发信程序;   451 MI:DMC 当前连接发送的邮件数量超出限制。请控制每次连接中投递的邮件数量;   451 MI:SFQ 发信人在15分钟内的发信数量超过限制,请控制发信频率;   451 RP:QRC 发信方短期内累计的收件人数量超过限制,该发件人被临时禁止发信。请降低该用户发信频率;   •451 Requested action aborted: local error in processing 系统暂时出现故障,请稍后再次尝试发送; 500   500 Error: bad syntaxU 发送的smtp命令语法有误;   550 MI:NHD HELO命令不允许为空;   550 MI:IMF 发信人电子邮件地址不合规范。请参考http://www.rfc-editor.org/关于电子邮件规范的定义;   550 MI:SPF 发信IP未被发送域的SPF许可。请参考http://www.openspf.org/关于SPF规范的定义;   550 MI:DMA 该邮件未被发信域的DMARC许可。请参考http://dmarc.org/关于DMARC规范的定义;   550 MI:STC 发件人当天的连接数量超出了限定数量,当天不再接受该发件人的邮件。请控制连接次数;   550 RP:FRL 网易邮箱不开放匿名转发(Open relay);   550 RP:RCL 群发收件人数量超过了限额,请减少每封邮件的收件人数量;   550 RP:TRC 发件人当天内累计的收件人数量超过限制,当天不再接受该发件人的邮件。请降低该用户发信频率;   550 DT:SPM 邮件正文带有很多垃圾邮件特征或发送环境缺乏规范性。需调整邮件内容或优化发送环境;   550 Invalid User 请求的用户不存在;   550 User in blacklist 该用户不被允许给网易用户发信;   550 User suspended 请求的用户处于禁用或者冻结状态;   550 Requested mail action not taken: too much recipient 群发数量超过了限额; 552   552 Illegal Attachment 不允许发送该类型的附件, 包括以.uu .pif .scr .mim .hqx .bhx .cmd .vbs .bat .com .vbe .vb .js .wsh等结尾的附件;   552 Requested mail action aborted: exceeded mailsize limit 发送的信件大小超过了网易邮箱允许接收的最大限制; -553   553 Requested action not taken: NULL sender is not allowed 不允许发件人为空,请使用真实发件人发送;   553 Requested action not taken: Local user only SMTP类型的机器只允许发信人是本站用户;   553 Requested action not taken: no smtp MX only MX类型的机器不允许发信人是本站用户;   553 authentication is required SMTP需要身份验证,请检查客户端设置; -554   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不在网易允许的发送地址列表里。

六:常用Multipart类型

  每个邮件的详细中都会存在一个Content-Type属性,从中我们可以看出此时的邮件类型

MIME邮件中各种不同类型的内容是分段存储的,各个段的排列方式、位置信息都通过Content-Type域的multipart类型来定义。
multipart类型主要有三种子类型:mixed、alternative、related
①:multipart/mixed类型:
    如果一封邮件中含有附件,那邮件的Content-Type域中必须定义multipart/mixed类型,邮件通过multipart/mixed类型中定义
    的boundary标识将附件内容同邮件其它内容分成不同的段。基本格式如下:
    Content-Type:multipart/mixed;
                 boundary="{分段标识}"
②:multipart/alternative类型:
    MIME邮件可以传送超文本内容,但出于兼容性的考虑,一般在发送超文本格式内容的同时会同时发送一个纯文本内容的副本,如果邮件中同时存在
    纯文本和超文本内容,则邮件需要在Content-Type域中定义multipart/alternative类型,邮件通过其boundary中分段标识将纯文本、超文
    本和邮件的其它内容分成不同的段。基本格式如下:
    Content-Type:multipart/alternative;
                 boundary="{分段标识}"
③:multipart/related类型:
    MIME邮件中可以携带各种附件外,还可以将其它内容以内嵌资源的方式存储在邮件中。比如我们在发送html格式的邮件内容时,可能使用图像作
    为html的背景,html文本会被存储在alternative段中,而作为背景的图像则会存储在multipart/related类型定义的段中。基本格式如下:
    Content-Type:multipart/related;
                 type="multipart/alternative";
                 boundary="{分段标识}"
multipart类型的boundary属性
  multipart的子类型中都定义了各自的boundary属性,邮件使用这些boundary中定义的字符串作为标识,将邮件内容分成不同的段,段体内
  的每个子段以“--”+boundary行开始,父段则以“--”+boundary+“--”行结束,不同段之间用空行分隔。

  在看完上面的一篇文章后可以手工使用telnet来发送SMTP邮件和接收POP3邮件,后面我将会使用JAVA代码带大家彻底在公司中使用代码完成邮件发送,如果上面一篇文章认真看完,那我相信您对后面使用代码来发送邮件的流程会了如指掌。