• 一步一步从原理跟我学邮件收取及发送 13.mime格式与常见字符编码


        在前面的本系列文章中我们已经学会了邮件的发送和收取。但在收取中我们看到的是一串串的乱码,回忆前面的发送过程,我们会奇怪:我们前面的邮件是明文啊。为什么明文的邮件明明也可以正常工作,还要弄乱码似的字符串编码呢?让我们先来看一下前面发送过的邮件内容:

    From: "test1@newbt.net" <test1@newbt.net>
    To: "clq@newbt.net" <clq@newbt.net>
    Subject: test
    Date: Sun, 21 Jan 2018 11:48:15 GMT
    
    Hello World.

        从中我们可以看到,其实可以直接在"记事本"中把邮件直接写出来。这是因为电子邮件的格式是 mime 而最简单的 mime 格式并不复杂。mime 当然也是有 rfc 文档进行说明的,不过明显太过复杂,我们先不要管它,先直接直观的看看眼前的这个邮件的格式。前面几行比较简单,我们猜也能猜出来,无非是说明了邮件的发件人、收件人这样的信息。后面的内容也简单啊,不就是邮件内容嘛!但是这里就有一个 mime 初学者非常容易出错的地方,后面的内容不仅仅是电子邮件的内容那么简单。实际上它包含了分隔符。什么分隔符号?你会问。我要说这封邮件里包含了两部分:一部分是头信息,包括发件人、收件人、标题、日期;另一部分是内容 "Hello World." 你能从上面的内容中找到它们的分隔符号是什么吗?大部分的同学仔细看过都会说,我看得出来是两部分,但是分隔符号是什么我真不知道。这个就是直观感受和程序处理的区别了,一眼看过去我们似乎能知道是两部分,但具体的就要知道格式的标准了。在这里,它的标准说明是:分隔符号是一个空行,不过在程序中它应该或者说必须描述为 "字符串流中的第一个空行前是头信息" 我不能说之后的就是内容,虽然这封信里看起来是这样。只能说对于这封信来说后面的内容是具体的信息,可以用下图表示:


    在继续往下说以前我们要明白 mime 实际上在 http 中和 email 中是不太一样的,学过 http 的 mime 内容的同学要注意了:mime 在电子邮件中要比 http 中复杂得多,虽然它们是同一个标准

        这里要再提出一个问题,如果我们要写一个中文的标题应该怎么写?你会说,改 subject 那里为"中文标题"就可以啦。如果我们这样做的话,确实对方可以收到一封中文的邮件。但我要说的是这样做是错误的。

    (错误的中文标题做法)

    我们前面的文章已经说过了,中文的内容在传统上是要使用编码的,所以正确的标题应该是下面的这样:


    这里使用的编码方式就是前面说过的 base64。不过在邮件编码中还有一种更传统的,那就是"quoted-printable"编码,例如以下的这封 facebook 的信件内容就是这种编码的。


    所以我们就明白了,要处理好电子邮件的 mime 那么就要先处理好这些编码格式,幸好常用的编码就这两种,而 base64 我们前面又掌握了。所以我们只要再学会"quoted-printable"编码就可以了。

    其实"quoted-printable"说来也很简单,基本上就是我们常用的 http 的网址的编码,即将一个不可打印字符按16进制转换成基本字符串,然后在前面加上"="号就可以了,所以一个普通字符转换后要变成三个字符,是比较占空间的。不过现在是地球村时代,我们要特别注意字符集的处理,具体处理我们下一篇用纯C的代码来做一个示例。好了这一次的内容就到这里了。

    注:查看电子邮件源码的话,直接在163 这样的站点上是看不到的,可以搜索一下 foxmail4.2 (最新版本我没试过);也可以用笔者的 eemail ,不过早期版本 mime 标题部分不完善,请到以下地址下载最新版本:

    http://newbt.net/ms/vdisk/show_bbs.php?id={B7106D5A-A5CB-3CFE-DFEB-4A4909A9B13A}&pid=43

    这篇的内容稍少,不过不先搞清楚"quoted-printable"编码是不行的,所以还是得有这一章节。

    --------------------------------------------------

    版权声明:

    本系列文章已授权百家号 "clq的程序员学前班" . 文章编排上略有差异.

  • 相关阅读:
    cf C. Vasya and Robot
    zoj 3805 Machine
    cf B. Vasya and Public Transport
    cf D. Queue
    cf C. Find Maximum
    cf B. Two Heaps
    cf C. Jeff and Rounding
    cf B. Jeff and Periods
    cf A. Jeff and Digits
    I Think I Need a Houseboat
  • 原文地址:https://www.cnblogs.com/-clq/p/8472538.html
Copyright © 2020-2023  润新知