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

时间:2021-09-06 09:28:14

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

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

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

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

这里要再提出一个问题,如果我们要写一个中文的标题应该怎么写?你会说,改 subject 那里为"中文标题"就可以啦。如果我们这样做的话,确实对方可以收到一封中文的邮件。但我要说的是这样做是错误的。
一步一步从原理跟我学邮件收取及发送 13.mime格式与常见字符编码
(错误的中文标题做法)

我们前面的文章已经说过了,中文的内容在传统上是要使用编码的,所以正确的标题应该是下面的这样:
一步一步从原理跟我学邮件收取及发送 13.mime格式与常见字符编码

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

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

所以我们就明白了,要处理好电子邮件的 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的程序员学前班" . 文章编排上略有差异.

一步一步从原理跟我学邮件收取及发送 13.mime格式与常见字符编码的更多相关文章

  1. 一步一步从原理跟我学邮件收取及发送 2&period;邮箱的登录和绕不开的base64

    一步一步从原理跟我学邮件收取及发送 2.邮箱的登录和绕不开的base64 好了,经过本系列上一篇文章 "1.网络命令的发送",假设大家已经掌握了 email 电子邮件的命令发送的方 ...

  2. 一步一步从原理跟我学邮件收取及发送 3&period;telnet命令行发一封信

    首先要感谢博客园管理员的及时回复,本系列的第二篇文章得以恢复到首页,这是对作者的莫大鼓励.说实在的本来我真的挺受打击的.好在管理员说只是排版上有些问题,要用代码块修饰下相关的信息.说来惭愧因为常年编码 ...

  3. 一步一步从原理跟我学邮件收取及发送 5&period;C语言的socket示例

    说到 C 语言版本的程序,首先要解决的问题就是兼容性. 作为 20 年开发有 10 多年是在服务端的程序员,我深刻地感受到服务端平台的两极分化之严重,linux 派对 windows 那是超级的不屑一 ...

  4. 一步一步从原理跟我学邮件收取及发送 4&period;不同平台下的socket

    既然是面向程序员的文章那当然不能只说说原理,一定要有实际动手的操作.    其实作为我个人的经历来说,对于网络编程,这是最重要的一章! 作为一位混迹业内近20年的快退休的程序员,我学习过很多的开发语言 ...

  5. 一步一步从原理跟我学邮件收取及发送 8&period;EHLO 命令详解

    我们在上一篇中解决了接收一行命令的问题后,就可以来具体的分析邮件发送过程中涉及到的 SMTP 协议内容了. 首先来看通讯过程中的第一个内容:服务器在客户端连接上来后会主动发送一个问好的信息,所以这第一 ...

  6. 一步一步从原理跟我学邮件收取及发送 10&period;四句代码说清base64

    经过前几篇的文章,大家应该都能预感到一定要讲解 base64 函数的内容了.是的,马上要到程序登录的代码,base64 是必须要实现的. base64 很早以前我就接触了,在项目中也很喜欢用.但每换一 ...

  7. 一步一步从原理跟我学邮件收取及发送 11&period;完整的发送示例与go语言

    经过了这个系列的前几篇文章的学习,现在要写出一个完整的 smtp 邮件发送过程简直易如反掌.    例如我们可以轻松地写出以下的纯 C 语言代码(引用的其他C语言文件请看文末的 github 地址): ...

  8. 一步一步从原理跟我学邮件收取及发送 9&period;多行结果与socket的阻塞

    前几篇的文章发表后,有网友留言说没有涉及到阻塞的问题吗?在 socket 的编程当中,这确实是个很重要的问题.结合目前我们文章的内容进度,我们来看看为什么说阻塞概念很重要. 接着上篇的内容,当我们发送 ...

  9. 一步一步从原理跟我学邮件收取及发送 12&period;telnet命令行收一封信pop3

    本系列上一篇文章中我们就说到了,这一次我们要说 pop3 收信了.虽然我觉得应该先说完 mime 格式,不过估计大家已经不耐烦了 -- 怎么老在说发送啊?我们要看收取!    好吧,来啦,来啦!收取邮 ...

随机推荐

  1. centos6&period;5 redmine 安装

    安装成功redmine信息 Redmine 2.6.0.stable   Environment:   Redmine version                2.6.0.stable   Ru ...

  2. Baidu set to lose leading role in digital advertising &lowbar;china daily

    advertising: n,广告 Online search giant Baidu Inc is set to loset its top spot in the nation's booming ...

  3. DIRECTORY&lowbar;SEPARATOR 和 PATH&lowbar;SEPARATOR的区别

    DIRECTORY_SEPARATOR:目录分隔符,linux上就是’/’    windows上是’\’ PATH_SEPARATOR:路径分隔符,include多个路径使用,在win下,当你要in ...

  4. 7 款令人赞叹的 HTML5 动画应用

    1.HTML5 3D图片阴影翻转动画 这是一款很酷的HTML5 3D动画特效,这款3D特效可以为你的图片增加阴影的效果,而且可以让图片在鼠标滑过的时候出现3D翻转的动画效果. 在线演示 源码下载 2. ...

  5. DOS - COPY

    copy,中文含义为"复制",一个很容易见名知意的命令,它的作用是复制文件,用法十分简单:copy 源文件 目的路径.   假设,你需要把d:\test\test.txt这个文件复 ...

  6. 无法启动outlook mapi

    office2013 管理员权限,在命令行中定位到office15文件夹,然后运行命令"outlook /importprf ..prf"

  7. &lbrack;SQL Server优化&rsqb;善用系统监视器,确定系统瓶颈

    原文:[SQL Server优化]善用系统监视器,确定系统瓶颈 来自: http://hi.baidu.com/solorez/blog/item/f82038fa0e71b78d9e51468c.h ...

  8. RAID基础知识总结

    1.RAID RAID:Redundant Arrays of Inexpensive(Independent)Disks,即独立磁盘冗余阵列,简称磁盘阵列.简单地说就是把多个独立的硬盘组合起来,从而 ...

  9. USACO Section 2&period;1 The Castle

    /* ID: lucien23 PROG: castle LANG: C++ */ /********************************************************* ...

  10. cookie特殊字符在游览器被转义

    环境:vue2.x axios 1.如果只是前端自己用,那么可以用 encodeURIComponent(string) 存 ,用decodeURIComponent(string)取. 2.遇到一种 ...