雅虎邮箱发送失败及MIME协议

前段时间查了个雅虎邮箱发送失败的问题,提示“554 Transaction failed : Cannot send message due to possible abuse; please visit http://postmaster.yahoo.com/abuse_smtp.html for more information”

去官网和网上搜看了不少帖子,也没有个清晰的头绪,只能认为邮件被当作垃圾邮件了,可能格式上存在问题,但问题是测试其他邮箱却没有问题。

最后还是通过查看rfc文档,查看到可疑的地方,经修改没有问题了,原因是设置boundary边界参数中带了‘#’字符,而rfc文档中没有包含该字符,去除后就可以正常发送雅虎邮箱了,不过也不明白为啥其他邮箱测试不存在这个问题,只能认为雅虎邮箱检测比较严格了。

顺带了解了下MIME协议,下面根据《计算机网络》及网上搜索做了些摘录整理。


MIME概述

SMTP(RFC2821)有如下缺点:
1、不能传送可执行文件或其他的二进制对象
2、限于传送7位的ASCII码,许多其他非因为国家的文字就无法传送
3、拒绝超过一定长度的邮件
4、有些SMTP的实现没有完全按照SMTP的因特网标准

在这种情况下,提出了通用因特网邮件扩展MIME(基本内容定义于RFC 2045-2049)。MIME并没有改动或取代SMTP,只是继续使用原来的邮件格式,但增加了邮件主体的结构,并定义传送非ASCII码的编码规则。两者的关系如图所示:

雅虎邮箱发送失败及MIME协议_第1张图片


MIME主要包括以下三个部分内容
1)新增一些邮件头信息,用来协商MIME的一些参数
2)定义了许多邮件内容的格式
3)定义了传送编码,从而可以传送任意二进制文件

邮件头信息包含发件人、收件人、主题、MIME版本、邮件内容类型等重要信息,每条信息成为一个域,由域名后加‘:’和信息内容构成,可以是一行,较长的也可以多行。域的首行必须“顶头写”;续行则必须以空白字符打头。
下面是邮件头中常见的域及其意义
1)MIME-Version :现在版本号是1.0
2)Content-Description :可读字符串,说明此邮件主体是否是图像、音频或视频
3)Content-Id :邮件的唯一标识符
4)Content-Type :说明邮件主体的数据类型和子类型
5)Content-Transfer-Encoding :传输编码类型
6)Content-Disposition :段体的安排方式


Content-Transfer-Encoding包含的传输类型有:
1)Binary
2)7bit(缺省的编码方式,MIME对这种由ASCII码构成的邮件主体不进行任何转换)
3)8bit
4)X-Token
5)Base64

对于任意的二进制文件,可用base64编码;完整的base64定义可见 RFC1421和RFC2045。编码后的数据比原始数据略长,为原来的4/3。在电子邮件中,根据RFC822邮件格式标准规定,每76个字符,还需要加上一个回车换行。可以估算编 码后数据长度大约为原长的135.1%。

6)Quoted-Printable(适用于所传送的数据中只有少量的非ASCII码)

关于Content-Transfer-Encoding的详细说明可以查看此链接


Content-Type说明必须含有两个标识符,即内容类型(type)和子类型(subtype),中间用‘/’分开。MIME标准定义了7个基本内容类型和15种子类型,如图所示:

雅虎邮箱发送失败及MIME协议_第2张图片

MIME的内容类型中的multipart是很有用的,因为它使邮件增加了相当大的灵活性。他们之间的层次关系如图所示(来源):

雅虎邮箱发送失败及MIME协议_第3张图片

可以看出,如果在邮件中要添加附件,必须定义multipart/mixed段;如果存在内嵌资源,至少要定义multipart/related段;如果纯文本与超文本共存,至少要定义multipart/alternative段。


boundary

multipart诸类型的共同特征是,在段头指定“boundary”参数字符串,段体内的每个子段以此串定界。所有的子段都以“–”+boundary行开始,父段则以“–”+boundary+“–”行结束。段与段之间也以空行分隔。在邮件体是multipart类型的情况下,邮件体的开始部分(第一个“–”+boundary行之前)可以有一些附加的文本行,相当于注释,解码时应忽略。段间也可以有一些附加的文本行,不会显示出来(MIME协议分析)。

边界参数,它由一个字符集的1至70个字符组成,其规定如下:

boundary := 0*69 bcharsnospace
bchars := bcharsnospace / ” ”
bcharsnospace := DIGIT / ALPHA / “’” / “(” / “)” /
“+” / “_” / “,” / “-” / “.” /
“/” / “:” / “=” / “?”

更多内容查看RFC2046文档

你可能感兴趣的:(网络)