date: tue, mar 18 1998 15:36:24 gmt
message-id:
x-mailer:sendmail 8.9.0
subject: greetings
上面整个记录就将是收件人看到的完整的邮件信头。让我们逐行看一下信头中各行的含义:
received: from mail.domain1.com (mail.domain1.com [111.11.1.0] ) by mail.domain2.com (8.8.5/8.7.2) with esmtp id laa20869; tue, mar 18 1998 15:39:44 gmt
这封信是从一台自称为 mail.domain1.com 的机器上接收的;这台机器的ip 地址是[111.11.1.0],真实名字就是标称名字 mail.domain1.com; 接收方的机器名称是 mail.domain2.com, 运行的邮件服务器是 sendmail, 版本(8.8.5/8.7.2) 。接收方机器给邮件的编号是esmtp id laa20869, 接收到的时间是 tue, mar 18 1998 15:39:44 gmt。
received: from client1.domain1.com (client1.domain1.com [111.11.1.1]) by mail.domain1.com (8.8.5) id 004a21; tue, mar 18 1998 15:37:24 gmt
这条记录表明信件是由机器client1.domain1.com ( ip 地址是 [111.11.1.1]) 在tue, mar 18 1998 15:37:24 gmt交给mail.domain1.com,并赋给编号id 004a21。
from,to ,date和subject 都易于理解,分别指明发件人,收件人,信件编辑日期及信件主题。
message-id:
这是由发件方邮件服务器赋给这封邮件的编号。与其它编号不同,这个编号自始至终跟随邮件。
邮件编码:
一、为什么要编码?
在internet里,e-mail的传送是只能传送us-ascii格式的文字讯息,ascii是7位的,而非ascii格式的档案,在传送过程中若不先经过编码,先编成7位再传送,则在传送过程中会因为这7位元的限制而遭到拆解,拆解之后只会让收信方看到一堆乱七八糟不知所云的东西。经过编码后的资料,在传送过程中才可顺利传送,不会有“被截掉一个bit”的危险,但是收信方必须具有解码程序,将这份经过编码的东西还原,才能解读“天书”,看到寄信人要传送的真实信息。
二、mime/base64编码:
base64编码是用的最多的邮件编码格式,具体如下:
base64和quoted-printable都属于mime(多部分( multi-part)、多媒体电子邮件和 www 超文本的一种编码标准,用于传送诸如图形、声音和传真等非文本数据)。mime定义在rfc1341中。
base64是现今在互联网上应用最多的一种编码,几乎所有的电子邮件软件头把它作为默认的二进制编码,它已经成了现今电子邮件编码的代名词。
下面是base64的一个例子,从例子中,您也可以看到base64与电子邮件的的紧密联系:
content-type: text/plain;charset="cn-gb"
content-transfer-encoding: base64
cqkjicagikg2wtlc68vjt6i088irobcncgnx99xfom1vz2fvo6yw19tgu8a619w+o6h0zwxuzxq6
ly8ymdiumteyljiwljezmjoym6ops8nusagjdqojicagicagxkq438jtvp65pnf3ytkjumh0dha6
ly9tb2dhby5izw50axvulm5lda0kcqkjrw1hawx0bzptb2dhb0aznzeubmv0dqojicagkioqkioq
kioqkioqkioqkioqkioqkioqkioqkioqkioqkioqkioqkioqkioqicagicagicagicagicagdqoj
icagkicz/chlvmfs5mqyw7s2vlk7tpjx36oss/3by9fjvkpksso0tryyu8h0z8iqdqojicagkioq
kioqkioqkioqkioqkioqkioqkioqkioqkioqkioqkioqkioqkioqkioq
base64的算法很简单:它将字符流顺序放入一个24位的缓冲区,缺字符的地方补零。然后将缓冲区截断成为4个部分,高位在先,每个部分6位(6位二进制数可表示0~63),用下面的64个字符重新表示(0就是a,1就是b...):“abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789+/”。如果输入只有一个或两个字节,那么输出将用等号“=”补足。这可以隔断附加的信息造成编码的混乱。它每行一般为76个字符。
三、其他编码方式介绍:
1、qp编码:
quoted-printable简称qp, 一般用在email系统中。它通常用于少量文本方式的8位字符的编码,例如foxmail就用它做对主题和信体的编码。这种编码的应该是很好辨认的:它有大量的“=”。下面是它的一个例子:
mime-version: 1.0
content-transfer-encoding: quoted-printable
=a1=b6=c2=d2=c2=eb=cb=e3=b7=a8=b4=f3=c8=ab=a1=b7
=d7=f7=d5=df:xxxx=a3=ac=b0=d7=d4=c6=bb=c6=ba=d7=d5=be=a3=a8telnet://61.129.63.131:23=a3=a9
=b3=c9=d4=b1=a1=a3
=c4=aa=b8=df=c8=ed=bc=fe=b9=a4=d7=f7=ca=d2=a3=bahttp://docs.xuehu.com
emailto:yin_jie@163.net
*********************************************
* =b3=fd=c1=cb=bc=c7=d2=e4=ca=b2=c3=b4=b6=bc=b2=bb=b4=f8=d7=df=a3=ac=b3=fd=c1=cb=d7=e3=bc=a3=ca
=b2=c3=b4=b6=bc=b2=bb=c1=f4=cf=c2*
*********************************************
qp的算法可以说是最简单的也可以说是编码效率最低的(它的编码率是1:3),它是专门为了处理8位字符制定的。它的算法是:读一个字符,如果ascii码大于127,即字符的第8位是1的话,进行编码,否则忽略(有时也对7位字符编码)。
2. unicode
unicode应用中最典型的例子是:ie4以上版本对html的编码。它可以说是未来windows下唯一的字符集。但它还很不完善,而且win95和win98对它的支持还很有限,甚至它还没有一套完整的标准。不过,微软最新推出的office2000和马上就要推出的windows2000将全面支持unicode。unicode取代其他编码将会是必然的趋势。不过,在近一两年unicode并不会占主导地位,就是在占主导地位后,因为操作系统的差异,其他编码也不会立即消亡。它的中文资料可以在office2000和windows2000所带的文档中找到,它的官方网站是:
http://www.unicode.org/。
3. binhex
binhex 编码是 macintosh 计算机(也就是俗称的“苹果电脑”)上用可打印字符表示/传输二进制文件的一种编码方法。它的主要用途是在电子邮件程序中attach二进制文件。大部分的电子邮件程序不支持这种格式(eudora支持),但用winzip可以进行解码。它的资料请查阅macintosh计算机带的相关文档。
4.uuencode
uuencode 是将二进制文件以文本文件方式进行编码表示、以利于基于文本传输环境中进行二进制文件的传输/交换的编码方法之一, 在邮件系统/二进制新闻组中使用频率比较高,经常用于 attach 二进制文件。
这种编码的特征是:每一行开头用“m”标志
uuencode的算法很简单,编码时它将3个字符顺序放入一个 24 位的缓冲区,缺字符的地方补零,然后将缓冲区截断成为 4 个部分,高位在先,每个部分 6 位,用下面的64个字符重新表示:
"`!"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_"
在文件的开头有“begin xxx 被编码的文件名”,在文件的结尾有“end”,用来标志uue文件的开始和结束。编码时,每次读取源文件的45个字符,不足45个的用“null”补足为3的整数倍(如:23补为24),然后输入目标文件一个ascii为:“32+实际读取的字符数”的字符作为每一行的开始。读取的字符编码后输入目标文件,再输入一个“换行符”。如果源文件被编码完了,那么输入“`(ascii为96)”和一个“换行符”表示编码结束。
解码时它将4个字符分别转换为4个6位字符后,截取有用的后六位放入一个 24 位的缓冲区,即得3个二进制代码。
四、其他:
1、由于邮件编/解码要消耗大量的cup资源,所以邮件中不适合附加太大的附件程序,否则在阅读邮件和发送邮件时会导致资源消耗太多而死机。
2、由于邮件编码可能会增加容量,加上邮件头,所以实际邮件的大小比附加的附件加上邮件文本内容的大小和要大的多。
发邮件验证使用的esmtp
esmtp,英文全称是“extended smtp”,顾名思义,扩展smtp就是对标准smtp协议进行的扩展。它与smtp服务的区别仅仅是,使用smtp发信不需要验证用户帐户,而用esmtp发信时,服务器会要求用户提供用户名和密码以便验证身份。验证之后的邮件发送过程与smtp方式没有两样。
esmtp协议分析
为了实现身份认证功能,目前esmtp协议中增加了一部分内容,这就是身份认证。下面我们看看这段认证过程,以网易的邮箱为例(其中c表示客户端,s表示邮件服务器):
(1)c: auth login
(2)s: 334 dxnlcm5hbwu6
(3)c: d3lxx2pux3nkx2nu
(4)s: 334 ugfzc3dvcmq6
(5)c: 密码略去
(6)s: 235 authentication successful
详细说明:
(1)客户端向服务器发送认证指令。在这之前一般要使用ehlo命令,宣告开始进行esmtp验证。
(2)服务器返回base64编码串,334意味成功。编码字符串解码后为"username:",说明要求客户端发送用户名。
(3)客户端发送base64编码的用户名串,此处为"wyq_jn_sd_cn"。
(4)服务器返回base64编码串,334意味成功。编码字符串解码后为"password:",说明要求客户端发送用户口令。
(5)客户端发送base64编码的口令串,此处略去。
(6)服务器返回普通字符串,235意味成功,表示认证成功可以发送邮件了。
邮件的dns mx记录
mx记录来实现邮件路由,它规定了域名的邮件服务器要么处理,要么向前转发有关该域名的邮件.处理邮件是指将其传送给其地址所关联的个人,向前转发邮件是指通过smtp协议将其传送给其最终目的地.为了防止邮递路由,mx记录除了邮件交换器的域名外还有一个特殊参数:优先级值.优先级值是个从0 到65535的无符号整数,它给出邮件交换器的优先级别.
优先级值自身并不重要,关键在于它同其它邮件交换器的优先级值的相对大小,优先级值相对越小,优先级越高.邮件总是首先试图传递给优先级值相对最小的邮件交换器.失败后才试图传递给优先级值稍大的邮件交换器.邮件总是试遍了同一优先级的邮件交换器,失败后才试图传递给优先级稍低的邮件交换器.
注意你列为邮件交换器的主机必须拥有地址记录.
下面列出几个我用nslookup程序查询的记录:
lee@work:~$ nslookup
> set type=mx
> hnby.com.cn
server: 10.10.16.60
address: 10.10.16.60#53
non-authoritative answer:
*** can't find hnby.com.cn: no answer //没有邮件交换
authoritative answers can be found from:
hnby.com.cn
origin = dns.hnby.com.cn
mail addr = root.hnby.com.cn
serial = 2002120101
refresh = 900
retry = 600
expire = 86400
minimum = 3600
> set type=mx
> henan.gov.cn
server: 10.10.16.60
address: 10.10.16.60#53
non-authoritative answer:
*** can't find henan.gov.cn: no answer
authoritative answers can be found from:
henan.gov.cn
origin = ns.hazzptt.net.cn
mail addr = root.ns.hazzptt.net.cn
serial = 99968011
refresh = 28899
retry = 7200
expire = 604800
minimum = 86400
> set type=mx
> yahoo.com.cn
server: 10.10.16.60
address: 10.10.16.60#53
non-authoritative answer:
yahoo.com.cn mail exchanger = 10 mta-v1.mail.vip.cnb.yahoo.com. //雅虎中国的邮件交换服务
authoritative answers can be found from:
yahoo.com.cn nameserver = ns8.yahoo.com.
yahoo.com.cn nameserver = ns9.yahoo.com.
yahoo.com.cn nameserver = ns1.yahoo.com.
yahoo.com.cn nameserver = ns3.yahoo.com.
yahoo.com.cn nameserver = ns6.yahoo.com.
ns1.yahoo.com internet address = 66.218.71.63
ns3.yahoo.com internet address = 217.12.4.104
ns6.yahoo.com internet address = 202.43.223.170
> set type=mx
> yahoo.com
server: 10.10.16.60
address: 10.10.16.60#53
non-authoritative answer:
yahoo.com mail exchanger = 1 mx3.mail.yahoo.com.
yahoo.com mail exchanger = 1 mx1.mail.yahoo.com.
yahoo.com mail exchanger = 1 mx2.mail.yahoo.com.
authoritative answers can be found from:
yahoo.com nameserver = ns1.yahoo.com.
yahoo.com nameserver = ns2.yahoo.com.
yahoo.com nameserver = ns3.yahoo.com.
yahoo.com nameserver = ns4.yahoo.com.
yahoo.com nameserver = ns5.yahoo.com.
mx3.mail.yahoo.com internet address = 4.79.181.12
mx3.mail.yahoo.com internet address = 67.28.113.10
mx3.mail.yahoo.com internet address = 4.79.181.168
mx3.mail.yahoo.com internet address = 4.79.181.134
mx3.mail.yahoo.com internet address = 67.28.113.74
mx1.mail.yahoo.com internet address = 67.28.113.71
mx1.mail.yahoo.com internet address = 67.28.113.73
mx1.mail.yahoo.com internet address = 67.28.113.19
mx1.mail.yahoo.com internet address = 4.79.181.14
mx1.mail.yahoo.com internet address = 4.79.181.15
mx1.mail.yahoo.com internet address = 4.79.181.168
mx2.mail.yahoo.com internet address = 4.79.181.135
mx2.mail.yahoo.com internet address = 4.79.181.136
mx2.mail.yahoo.com internet address = 4.79.181.168
mx2.mail.yahoo.com internet address = 67.28.113.70
mx2.mail.yahoo.com internet address = 67.28.113.72
ns1.yahoo.com internet address = 66.218.71.63
ns2.yahoo.com internet address = 66.163.169.170
ns3.yahoo.com internet address = 217.12.4.104
ns4.yahoo.com internet address = 68.142.196.63
> set type=mx
> dahew.com.cn
server: 10.10.16.60
address: 10.10.16.60#53
*** can't find dahew.com.cn: no answer
> set type=mx
> dahew.com
server: 10.10.16.60
address: 10.10.16.60#53
non-authoritative answer:
dahew.com mail exchanger = 10 mail1.dahew.com.
authoritative answers can be found from:
dahew.com nameserver = ns1.dns-diy.com.
dahew.com nameserver = ns2.dns-diy.com.
mail1.dahew.com internet address = 219.156.123.177
ns1.dns-diy.com internet address = 210.51.187.81
ns1.dns-diy.com internet address = 218.16.225.50
ns1.dns-diy.com internet address = 60.191.252.66
ns2.dns-diy.com internet address = 218.107.207.123
ns2.dns-diy.com internet address = 218.85.134.143
ns2.dns-diy.com internet address = 64.84.29.59
注意:目前有不少的管理员不注意设置标准的mx记录,根据rfc 1035规定,mx只可以指向a记录,有的管理员偷懒,直接就设置成指向一个ip地址,造成本域的邮件接收有问题。如果你的域之前也有这方面的设置错误,请立即更正,将mx记录指定为一条a记录,然后将这条a记录指向你设置的ip地址,这样才能被正常解析接收邮件。