推荐 FastMail :优秀邮箱服务

网上介绍/推荐 FastMail 的大佬和文章已经比较多了,最近我的 FastMail 一年付费周期快到了要续费了,想了想这个服务简直6到起飞所以我再来推一波。之前的帖子可能无法说清楚 FastMail 的方方面面,我说点(可能)其他大佬(可能)没有提到的东西。

我自己使用 FastMail 截至目前接近两年。

起源

网上有一小撮人说使用个人域名的邮箱是增加逼格,好的!

我想问问如果这波人如果之前使用的是【雅虎中国】的邮箱 @yahoo.cn @yahoo.com.cn 的话这玩意儿被阿里巴巴关闭之后他们是挨个修改邮箱了么?

还有,假设你使用的是某个服务商的邮箱,比如网易邮箱,你每次登陆都要看烦人的广告这个你看了很多很多年。如果有一天网易出现了安全事故(又不是没出现过)你想搬家,你不再用网易了,你能么?过去很多年的数据导出就是个很大的问题,更不用说放弃网易邮箱后缀了,一旦放弃意味着你要修改所有你使用这个邮箱地址的其他服务,你想一下现在让你更换一个手机号你的第一反应是什么?同理。

使用域名邮箱的话,服务商服务不爽?搬家走人!服务商看着奄奄一息了?搬家走人!广告?抱歉一般都没有!用了多年想换换口味?搬家走人!开始收费/涨价了接受不了了?搬家走人!。。。?搬家走人!


概要

Gmail 千好万好中的大多数都适用于 FastMail 。而且!自从 1999年 以来专门做邮箱业务至今没有倒闭而且被众多大佬发帖推荐的邮箱服务商,地表一只手都数的过来(如果还有其他的请告诉我一下。)!

所有你对邮箱的期望,什么稳定,安全,快速,无广告,绑定域名,各种导入导出数据,别名,大容量,日历,通讯录,同步,推送,IMAP,二次认证,支持 Yubikey ,转发,过滤。。。只要你能想到的,基本上,都支持了。SPF,DKIM,DMARC 支持 。同时,十分注重安全和隐私,十分注重邮件相关标准。

SPF DMARC DKIM 这种一看名字就高端到不行的东西。(SFP 很多国内大厂都支持了,但是后面两个别人都已经支持了很多年了,有些还只是表象上支持而已(腾讯邮箱帮助页面是写上了,可是真的支持了么?))但是,SPF 已经不推荐设置了。你等国内邮箱支持 Yubikey ?恐怕你还得至少再活 500 年!


详细介绍

价格

官网页面很清楚了。可以免费试用一个月,国内手机如果无法注册请直接联系客服邮箱帮你注册一个账号。试用账号限制了可潜在造成滥用的功能,比如限制了邮件发送数量无法创建静态网站无法使用转发规则。年付有优惠具体请看价格页面。另外,使用个人邀请 (https://www.fastmail.com/?STKI=16759801) 首年可以打九折!就是标准版首年 $45 。

容量额度

25GB,如果邮箱容量用完了,购买容量等于购买了一次当前套餐。单个用户最大容量 300GB。

安全

用户数据,访问权限,加密收发,图片载入等等等等,他们写了一篇文章《How FastMail provides a secure service》来介绍。FastMail 至今没有出现过安全事故。

速度

用过都说快,移动端客户端,邮箱页面和你打开官网一样都很快。中国大陆访问没有障碍。

客户端

支持 iOS iPad 安卓 客户端。速度没的说。

主题

主题不是和QQ邮箱一样一身华丽的衣服,而是基于颜色的,总体来看界面有点高端大气(科幻片镜头里的黑客使用的电脑屏幕那种调调。)

语言

多国语言默认英语,简体中文?有,但是翻译似乎不全面,而且翻译也不是很地道。不推荐使用!

支付方式

支持 Visa MasterCard American Express PayPal 和 比特币。但是!没有说只接受信用卡,如果你有 Visa MasterCard 借记卡(中国银行长城跨境通国际借记卡了解一下?)理论上也是可以的但是我没有试,又但是!没说不接受虚拟卡,我也没试过。支持 PayPal 中国版(绑定银联卡是可以的)。有过 Gift Card 叫做 Gift Certificate 但是现在不支持了!

续费策略

对于个人,我推荐使用 Standard Plan 否则的话不能绑定域名。注意这个续费策略有点不同于我们接触的大多数:你元旦买了一年服务,过了半年你想再续费一年,那么你仍然需要支付一年的费用你的使用期限延长一年,没错吧?这是我们接触到的绝大多数的订阅服务(什么 QQ会员啊 爱奇艺会员啊 等等等等的)策略。但是!!! FastMail 不是这样的,如果你过半年后要续费一年,那么你续费的一年从你续费的当天开始计算,时间上时间只延长了半年而你的费用也只需要支付半年即可。即:续费时长从今天开始计算!

域名

可以绑定多个域名,也可以用系统给你的多达 120+ 域名创建别名邮箱,你无论使用什么域名,你在任何时候都只有一个收件箱。当然你可以建立文件夹使用 rules 把内容分开。是不是有 Gmail 熟悉的感觉?

导入导出

支持各种,邮箱,联系人,日历的导入和导出。邮件导入服务是我见过最靠谱最6的没有之一。邮箱搬家无忧零障碍。

DNS

支持托管你的域名的 DNS,当然相比专业的 DNS 服务商来说就有点欠缺了但是对个人使用足够没有问题。

邮件路由

支持设置子域名策略和邮件路由策略。比如如何处理 [email protected] 这种邮件。详细内容 帮助页面

账户恢复

密保邮箱,密保手机,还有 Recovery Code 备用!

二次验证

支持各种你想得到的软件,硬件,短信验证。支持 Yubikey !!! 足见专业!他们自己也说安全是他们的重中之重。帮助页面

App Passwords

使用任何客户端都必须创建一个临时密码而不是用自己的邮箱密码。什么时候,谁用,给什么权限(仅邮件?给联系人?只有 IMAP?等等)都可控!

邮件读写

支持从自带网盘和 Dropbox 上传文件,本地上传当然也支持了。

文件夹

支持层次组织,支持拖放排序。什么重命名之类的~不在话下!

规则

支持收件规则,支持转发规则,支持邮件组织规则。无与伦比强大,你想得到的基本都有!你想不到的也有~你还可以自己编辑过滤脚本!!!

垃圾邮件保护

这还用说,当然!什么“Forwarding hosts”什么“Backscatter”的都支持啦~你常见的贝叶斯分类器?当然!什么设置自定义阈值当然也支持!

自动回复

自动回复必须和垃圾邮件保护一起配合使用!是不是很酷炫?就这点就秒杀别人几条街了。为什么呢?可以自己思考下。

联系人

分组,共享,导入导出你知道的想得到的都支持。

日历

支持添加订阅,支持一切 CalDAV 日历,可以和 Google Calendar 同步。

Notes

附带一个记事本功能,类似 Google Keep 这种。默认纯文本,支持富文本。当然没有 Evernote 和 Dropbox Paper 强大。

Files

网盘!叫做 FastMail Files ,有点强大!但是没有 Dropbox 强大了。除了基本的保存上传下载文件这种以外,还支持各种域名映射,可以做静态网站使用,有个自带的相册模板可以嗖一下生成一个简单的相册。而且!静态网站还支持自动管理续期使用 Let’s Encrypt 签发证书的 HTTPS 呢!这部分后来可能会专门写个帖子介绍一下。

帮助文档

相当全面,相当专业,English Only.

博客

https://fastmail.blog/ 是他们的官方博客,专业!English Only. 我偶尔会翻译一些有意思的文章(能力学识有限,有错误也不要喷我。)

客服

专业不废话响应速度快。可以直接用你的邮箱给 [email protected] 发邮件就等于快速开了个工单!而且,支持推特上对话帮助~


最后

缺点

有没有发现不支持 PGP 呢?他们又专门写了一篇文章《Why we don’t offer PGP》 来解释。

FastMail Files 不支持 IPv6

写信不支持 MarkDown (有谁支持麻烦告诉我一下)

对比

了解完了是不是觉得简直强大专业了一脸?回头一想我们的网易邮箱腾讯邮箱简直……注册一个月免费试试吧~别忘了使用我的个人邀请 (https://www.fastmail.com/?STKI=16759801) 在你付费的时候打九折~

那么问题来了,你觉得是 Gmail 强大呢还是 FastMail 更酷呢?

改进

发送给QQ邮箱的问题有大佬说已经没有了,我自己也没遇到;

使用科学上网和中国手机注册的问题有大佬说也没有了,这个我自己没有试。

其他中文资源

How TOTP (authenticator apps) work

这篇文章翻译自 FastMail 官方博客
原文:https://blog.fastmail.com/2016/07/22/how-totp-authenticator-apps-work/

这是 mini-series 关于安全的第五篇文章,为了标记一下我们的登陆和认证系统即将到来的安全更新(upcoming security upgrade)。所有新的改进将在 2016年7月25日 发布。


下周我们将推出一项更新以便使用二次验证来更容易地确保你的账户安全。

如果你打开了二次认证,那么每次你在一个新的计算机上登陆的时候你将在你的普通的密码之外额外多一次验证的步骤。

通过完成这个额外的步骤它证明你有难以被攻击者获取的东西:一个特定的安全设备,或者你的手机上安装的某个软件产生的一串安全密码。

注意:当你登陆系统的时候,你可以选择信任这台计算机,这样的话就不用每次进行二次验证了。

你可以添加任意多不同的安全设备到你的 FastMail 账户;然后可以使用任何一个去验证你的账户。我们将提供三种的不同类型:

⦁ TOTP(Time-Based One-Time Password / 基于时间的一次性密码)
⦁ FIDO U2F (Universal 2nd Factor from the Fast IDentity Online alliance); and
⦁ Yubico OTP (a proprietary one-time password scheme from Yubico / 来自 Yubico 公司的一个专有的一次性密码方案).

一旦你设置了他们中的一个,你也可以通过你的任意密码保护手机短信得到一个一次性验证码来完成二次认证。

在这篇文章中,我们试图以一种容易理解的方式解释 TOTP 底层的工作方式,附带简略介绍它的优缺点。敬请期待后续关于 U2F 和 Yubico OTP 的更多文章!

How TOTP (authenticator apps) work

TOTP 代表 基于时间的一次性密码(Time-Based One-Time Password)。它是一个已经被标准化了的基于共享密钥(意思是,被我们的服务器和你的手机共享,不是指其他人!)产生一个定期改变的代码的方法。由于它是一个标准,所以你可以在手机上使用许多不同的支持它的(大多数是免费的)认证软件。一些最流行的有 Google Authenticator, Authy, Duo1Password

当你配置 TOTP 的时候,我们的服务器产生一个安全密钥 — 一串随机数字和字母。然后你保存这个 key 到你的手机,通常是用手机上的认证软件扫描二维码(2D bar code)(如果你的手机没有摄像头的话你可以手动输入)。

现在你的手机和我们的服务器都有一份这个安全密钥了。当你想登陆服务的时候,你需要证明你有安全密钥。怎么证明呢,你的认证软件结合当前时间(to the nearest 30 seconds)产生一个访问码。它没有使用类似“secure hash function”(对于加密头它使用的是 HMACE-SHA-1,如你所知).通俗地说,它把时间和你地密钥混合起来产生了一个唯一的输出(如果时间或者密钥有一点细微的不同则输出完全不同),但是不可逆的(输出的随机码对猜测密钥没有帮助)。为了简化输出,访问码被缩短成了六位数字。

当提示你输入的时候则把访问码输入文本框:

服务器重复验证直到你输入的访问码和服务器产生的访问码匹配,则你登陆成功!

Strengths and weaknesses

使用免费的 iPhone, Android, Blackberry 甚至 Windows Phone 应用程序,TOTP 是一种快捷廉价和容易启用的二次认证方式。它也是被支持最广泛的方法 — 你可以用同样的程序来给你的 FastMail, Google, Dropbox, GitHub 和其他的网站/服务。

它的工作原理很简单(在加密方面)而且安全。甚至攻击者看到了这个一次性密码,他们也完全不能猜测下一次产生的是什么。唯一的可行(猜测下一次产生的是什么)的方法是使用密钥,当然它被安全地保存在你地手机和我们地服务器里。

由于一次性密码是根据当前时间产生的,所以你的手机和服务器必须大致在相同的时间去计算。这很少会出问题,因为所有的手机都使用网络来同步时间(别担心,时区问题是被忽略的!)。一次性密码大概有 60秒 的有效期(to allow for clock skew),所以理论上如果某人拦截了一次性密码和你的密码的话他们有一小段窗口期来使用它们(a replay attack)。

没有保护措施来抵御攻击者诱骗你在一个不是 FastMail 的网站(a phishing attack)来输入这个一次性密码。记住在你输入安全凭证之前查看你是否在真实的 FastMail 网站(check you’re on the real FastMail website)的办法很简单。

由于安全密钥在你的手机里而不是一个专门的安全设备,如果你的手机遭受恶意软件的话安全密钥可能被窃取。对攻击者来说,这是更难的事情,相比没有启用二次认证而言。


敬请期待明天关于 U2F 安全令牌如何工作的文章。

有关于安全方面的问题或建议?使用推特话题 #securitymatters @FastMail

PGP tools with FastMail

这篇文章翻译自 FastMail 官方博客
原文:https://blog.fastmail.com/2016/12/23/pgp-tools-with-fastmail/

这是 2016 FastMail Advent Calendar 系列的第 23 篇也是倒数第二篇文章。敬请期待明天的最后一篇更新。


我们之前的 advent 系列文章里,介绍过 为什么 FastMail 不支持 PGP( why FastMail doesn’t have PGP support),并且我们提到过最佳的使用 PGP 的方式是通过命令行工具或 IMAP 客户端软件。

正如我们之前承诺的,一个适用于 FastMail 的关于(部分)开源的 PGP 客户端说明现在可以参阅了!我们强烈推荐使用开源加密软件,最好 reproducible builds .

不清楚类似 PGP 的加密如何工作的?这里是一个引导你进入使用 PGP 加密你的邮件(PGP to encrypt email)的基础的加密概述(overview of encryption)。如果你打算认真对待你的隐私问题,我们推荐进一步阅读以理解加密软件的风险,它带来的好处以及它们的可用性。

虽然我们在这方面已经做了一些基础的研究工作,但我们不能承诺这一定就适用于你的特定情况。

Browser plugins

Mailvelope

WebPG

Native clients

MacOS

GPGTools

  • 支持平台:macOS
  • 可以用于系统自带邮件客户端,但是当前不兼容 macOS Sierra(10.12版本),临时方案(workaround).
  • 使用说明

iOS(iPhone/iPad)

当前没有可用的开源 iOS 软件,但是这些软件可以使用(基于 Open PGP 实现)如果你正在寻找替代方案的话。

iPGMail

PGPEverywhere

Windows/Linux

安装一个带有插件功能的客户端以便启用 PGP 功能

  • 雷鸟(多平台支持)
  • Postbox(Windows,非开源软件)

Plugins:

Android

openKeychain

Command Line

我们推荐以命令行方式使用 GNU Privacy Guard.支持很多平台,开源代码和可执行文件

Chris 是我们的一名测试人员,他在他的工作笔记本上配置了 gpg 用它来安全传输数据到家里的电脑而不用带着私钥去工作。下面是他给出的一系列包括 aliases 在内的配置步骤:

生成密钥:gpg --gen-key(会问一些问题)
导出密钥:gpg --armor --output ~/example.fm.key --export [email protected]
这个步骤大致如下:

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1

mQENBFhbajUBCADO7Rp0dVuVb2JWv86zvnqUC32NuarYXIeCpesvqIxU8wqr7hh5
R4IwZyVEcBYTyVaMWVhjGmxGCBhvauKb8ZivRwuUw0bHwVKCfjI+uWjB27lVwRLE
9zxNa2NA8svzY8EgImo48KO2/YA4Rw9ozMLxM/KkmRnmnoo5oDk1jXe7I0ILOPb1
6pQVDT/PJRrb+QXc7AMCD/Jj61PgFnPBGqLvICTTKwoeIE8dfFu7l0hwOTSloDv7
KiiM4+Xwz2Lptt7eJAlpKImCzeH96/yPK4IfkAId2IJCC5GfChG2aovNFBrhPsMv
9jWVNDvFvoLTyYqM5V2slaa/U6qTkWiyV3tpABEBAAG0NUNocmlzIEV4YW1wbGUg
KFRoaXMgaXMgYSBkZW1vIGtleSkgPGNocmlzQGV4YW1wbGUuZm0+iQE4BBMBAgAi
BQJYW2o1AhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRAZ87lBaIIEbq/d
B/0Z2K9gF+e65B9da2Gim0bpEH8MNmHJlkcHgIxheMyQ7s8ClrqRRnGZRFEBw55F
x7VGphBjav8H2czp3LKE5OrAyoT1z+kCmXZff7iHII2YIK0zzU3DsyUTpM2AOZKL
fQ5d9nZMJY7Jg7BbDM+N1SJsw6+nRuyG0FnZfF57Qk+h1p2rZn/jadno/XeargeZ
I2TI7GhkBg4ujB0k6Cpvr8gq394TohDcCPEYUBDI5m/5FkyHkUFO8SUGQu0fJ9/t
xX1J91z9EW0xbcjIsmg7TtIpbM3UocoSz++svSjYz2mU546gz/76688nSrYKJ+Os
IZ+wmJdOBc3Du28QbffXGRahuQENBFhbajUBCAC+rldeh9LKxoRblhUfaCxttOQ8
PeqSlNC5IvPikTnjWtkThbVCsM3OYITh18Q66WSSK+2AkWlHdSH6HdaA6zNP7wqZ
iAWf7LP1maLg/a/e8zbC3rTL5LXrtkln0IIje6aXtyq4bLGDuLQEJBo7eBqetr27
Cb5pCatDBkOmxpQxzFQmnYfCMyC8Dm6Z2GIrLj6u5Zb0GIrNoBqhPFxD1MRsromU
ERwWYNQjKodEllv/DMt3yAn2CQRlABxPFem16cDqFEGD/UhcJQrvpVrMbHpANWqh
nLgcBPLhXcmJ5Zd0JhtkwapZ/mLqZkTWWmGGQRdE9RlbKoYsT1yNVeX0RntRABEB
AAGJAR8EGAECAAkFAlhbajUCGwwACgkQGfO5QWiCBG5MYwf/ff7WBragmfCXOaTz
LjERK1nScXzlTZ5ZeEUQTcoujbQvSuFBTw0XtiKWNN3imGhmhorjmQyMFjCmIys2
YCur+c3Jmh6BO8q0xRJwS0jxtNjkObSx2+ICBi6gTTkrBb3ya6Uy2k4BhVfQArlv
5UZeMcxZB8Gh8S0pC4S9s4dTBn1+i4aKSJSGITleDtSj4ZfrZ2JI/mMaJSpk1BKg
JtTb9s+AcWpurV5HW5HCb8PKQsLndPJH5cH0xqIjW8Ha6dbsXmlCfpTNaAoOkQDC
rqWyA3a+f4o/kgq/0cOlJHponcxWmbvTXIBwMtR0O91E5pqp4/no9SmSWefLd0yM
zbOJdA==
=K7Ec
-----END PGP PUBLIC KEY BLOCK-----

在另一台机器上,比如你的工作机(其他任何你想发送消息/文件的地方),导入密钥:gpg --import-key ~/example.fm.key 然后添加下面的内容到你 ~/.bashrc 文件:

alias ToChris='gpg --encrypt --recipient="[email protected]" --armour'
alias scramble="gpg --output encrypted.gpg --encrypt --recipient [email protected] "

由于工作机没有你的密码或私钥,你可以使用如下命令行来创建加密的消息/文件:

echo "This is a private message. Remember to feed Ninja" | ToChris
-----BEGIN PGP MESSAGE-----
Version: GnuPG v1

hQEMA9bIhjnGSgZUAQf+N6nr/t0uGi8HRYAhaxNteWgWR0uwkDPvec6tjHj0gk50
wtBGm1agVAIRWBg5e6w2wkfk2RqQ+ecqPCV4SpgBxdFkcEhsbYOSd81hS2jtQZtH
EUjHK/s0ANqeN8L5a9j6NynwRYjrnFpGWKsSA+Ubd4xUb2vIktXi+BnwNsXdfRw9
A27LZch69w2pr4zHjAyZO/PIq/SEuQ8Xu/+xhR+bq7gHBGOo9sokOle7yTDXnNdR
VsTJaFev4K3didFsNPQWENC6dQ3gHds8qMYGMR4Nt5hIfIfrulyQItjYi/z5LGBq
i6f7y2jSB27wUaGr4EY6vZMyjHpoIlSK0eq4h9bvRNJrAQhcLoEzDxD83oECGXTD
8KIEc78TYlIPgPyGZ3O7GanBxg9tX0UWnjZ8ohk+QStgDiZdivkGOUL1UfByQE7B
qwvgjYrTzu9JJll9LUDjTR0ow4OLaJdIIdPq7uRoBEyhX23mfZIFAruoc3w=
=mjJW
-----END PGP MESSAGE-----

然后你可以发送 GPG 消息其他人便不能阅读了(比如,复制粘贴到 FastMail 网页客户端并且作为邮件正文)

如下命令创建可以作为邮件附件的 encrypted.gpg 文件:scramble <filename>

Key parties

有许多关于 准备签名密钥(prepare for a key signing party) 的网络资料。部分是有关于学术会议的,你可以和其他人在你的领域建立一个可信的 web .需要注意的是要知道正在操作什么类型(which kind of key party)的密钥。

Example GPG bootstrapping

下面是 Bron 演示的创建密钥完整密钥并且替换过期密钥以及用它来签名文档的完整过程:

[email protected]:~$ gpg --list-keys [email protected]
pub   rsa2048 2015-09-20 [SC] [expired: 2016-09-19]
      0FBAC288980E770A5A789BA1410D67927CA469F8
uid           [ expired] Bron Gondwana <[email protected]>

看看自从我上次签名东西已经过了多久了!

[email protected]:~$ gpg --gen-key
gpg (GnuPG) 2.1.15; Copyright (C) 2016 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

gpg: starting migration from earlier GnuPG versions
gpg: porting secret keys from '/home/brong/.gnupg/secring.gpg' to gpg-agent
gpg: key 410D67927CA469F8: secret key imported
gpg: migration succeeded
Note: Use "gpg --full-gen-key" for a full featured key generation dialog.

GnuPG needs to construct a user ID to identify your key.

Real name: Bron Gondwana
Email address: [email protected]
You selected this USER-ID:
    "Bron Gondwana <[email protected]>"

Change (N)ame, (E)mail, or (O)kay/(Q)uit? O
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

这个时候弹出了一个对话框让我选择一个密码。

We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
gpg: key D92B20BCF922A993 marked as ultimately trusted
gpg: directory '/home/brong/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/home/brong/.gnupg/openpgp-revocs.d/8D8DEE2A5F30EF2E617BB2BBD92B20BCF922A993.rev'
public and secret key created and signed.

pub   rsa2048 2016-12-22 [SC]
      8D8DEE2A5F30EF2E617BB2BBD92B20BCF922A993
uid                      Bron Gondwana <[email protected]>
sub   rsa2048 2016-12-22 [E]

[email protected]:~$

现在我有了一个新密钥。让我们来上传到公钥服务器(keyservers)吧:

[email protected]:~$ gpg --send-keys 8D8DEE2A5F30EF2E617BB2BBD92B20BCF922A993
gpg: sending key D92B20BCF922A993 to hkp://keys.gnupg.net
[email protected]:~$
[email protected]:~$ echo "So you can all encrypt things to me now, and verify my signature (assuming you trust a fingerprint from a blog)" | gpg --clearsign
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

So you can all encrypt things to me now, and verify my signature (assuming you trust a fingerprint from a blog)
-----BEGIN PGP SIGNATURE-----

iQEcBAEBCAAGBQJYW7nPAAoJENkrILz5IqmT554IAL6cg6+ILkrKeLQlzDtA7pZ9
IluYJCt+HpvGw4wXnOmxLyWa/PkWvHUwAAQ9GpgZq7ZB8Sv4HPkm4sRz3zRvcsfR
gpfp5YmYk/i8Oj482jYp1lsngTCEeHkLNWrvXZyoiVUzWbfhYOzrkIDRwgNUCXuF
i/pgYT4K36d6OdfKbI4jsC62sJT20H8qjO9/I5o0gcmb+axv/kSuO87jvGySMXT5
EAYtogDd+jCL1FB0iyu01oUUoTRqgayMUWChJeofVZ9sehqyhXNoYNp4+/+jusmG
nblWeEYZ2S9d5jBNcHgd5cWQDwlBCJKnx1O8Qj9VO+hkBJBB7wHMAIyei8VsIbM=
=QT0N
-----END PGP SIGNATURE-----

现在你可以说我些的这个没有任何一个我的同事可以编辑而且是绝对私密的了(And you can tell that I wrote this and none of my colleagues can edit that text and put words in my mouth)(除非他们用我的电子邮件创建了不同的密钥伪造了这篇文章中关于创建密钥的部分!!!)

命令行方式是最安全的使用 PGP 的方法,这种方式下你的电子邮件客户端和加密软件是完全分开独立运行的,只有密文或签名后的密文被传输到了你要从你的安全计算机外发的邮件中。

What we talk about when we talk about push


这篇文章翻译自 FastMail 官方博客
原文:https://blog.fastmail.com/2016/12/21/what-we-talk-about-when-we-talk-about-push/
这是 2016 FastMail Advent Calendar 系列的第 21 篇文章。敬请期待明天的更新。


当一些人考虑注册成为我们的用户时经常会问我们:“你们的产品支持推送吗?”。简单地回答是“支持”,但令人疑惑的当他们问这个问题的时候他们到底是什么意思?这点让这个问题变得有点复杂了。
当说起电子邮件的时候,大多数人通常理解的“推送”是新的邮件到达一台移动设备的时候他们获得几乎实时( near-realtime )的通知。这看起来是一个相当简单的概念,但实现起来却需要电子邮件服务器(比如 FastMail )和客户端/软件( iOS 邮件客户端,FastMail 移动客户端或者是 Thunderbird(雷鸟)之类的桌面客户端)之间的精心协作,而且依赖于所使用的机制,设备所使用的操作系统(比如 iOS 或 安卓)和操作系统的供应商(苹果,谷歌)。没有这些环节的配合,实时通知是不能实现的。
所有的这些意思是说没有一个简单的回答“你们支持推送吗?”囊括的这些所有情况。我们通常说“支持”是因为对我们的大多数客户来说这就是他们想要的答案。
邮件客户端可以使用各种机制来通知用户新邮件来了,每种都有各自的优缺点。

IMAP

单纯的传统意义上的 IMAP 客户端(桌面客户端和移动客户端)有较少的几个消息通知机制。

Polling

迄今为止对客户端来说最简单的查看是否有新邮件的方式是不断地去查询服务器。如果客户端每分钟都查询一次服务器的话则看起来和实时消息通知差不多。
这种方法最大的缺点就是网络负载和(除过像台式机这种总是插着电源的设备)电池寿命。
如果查询服务器过程很复杂的话网络负载就是一个大问题。最差的情况下,你必须查询服务器上整个信箱的状态并且和设备上保存的上次查询得到的记录做对比。较新的 IMAP 有一些机制(比如 CONDSTORE and QRESYNC )可以让客户端获得当前服务器上的收件箱编码后的令牌(token)。下一次当客户端查询服务器的时候,客户端可以对令牌说“把从我上次离开后的变更”。如果客户端和服务器都支持这个特性的话,通常情况下没有什么改变的话网络负载不会有压力。
电池寿命是个大问题由于系统要定期唤醒并且使用网络去向服务器查询变化情况。这其实是一种对电能的浪费因为大多数情况下你都不会有新邮件,然后设备又转而休眠了,这其实没有多大实际的意义。

IDLE

为了避免上面说所的这种不必要的轮询(定时多次向服务器查询状态),IMAP 有一种叫做 IDLE 的机制。客户端可以在服务上打开一个文件夹并在其中“idle”。这样可以保持和服务器的连接而且可以让客户端进入休眠状态。当服务器上有了需要变化需要通知的话,服务器通过这个连接给客户端发送一条消息,这将从休眠状态激活设备以便客户端查询服务器上的变更。
通常会出现的情况是对一些没有指定推送渠道或是推送机制的设备来说, IDLE 是可用的但仍存在一些问题使得它的效果不是那么理想。
主要的是 IDLE 只允许客户端请求对单个文件夹的变动。如果客户端需要通知多个文件夹的变动那么则必须有多个 IMAP 连接,每个文件夹分别一个。如果有些服务器同时限制单个用户的连接数的话对导致许多问题而且会使客户端变得复杂起来。
还有个问题,特别是移动设备来说, IDLE 是工作在 TCP 协议栈之上的。当设备网络情况发生改变的时候(这可能包括在移动基站之间的切换)会导致问题出现,可能会破坏连接。由于 TCP 协议栈的工作机制,不可能总能让一个设备判断连接是否还在继续,客户端依靠定期去“ping”(通常需要定期唤醒)或当网络发生变化的时候指望设备通知已经不那么可靠了。
很多情况下 IDLE 是靠谱的而且兼容大多数的 IMAP 客户端,但这是最基本的推送通知的做法。

NOTIFY

为了解决上述的一个文件夹对应一个连接的问题(one-folder-per-connection problem),IMAP 引进了另一种叫做 NOTIFY 的机制。它允许客户端请求它感兴趣的一组复杂的内容(包括文件夹列表和变更类型列表,比如“新邮件”或者是“已删除的邮件”)然后一次性通知这些内容。
这是推送机制发展的正确一步,但是还是存在使用 TCP 协议栈会遇到的那个问题。它是一个相当复杂的协议而且难于和当前的需求兼容,这就是我期望没有客户端或服务器支持它的原因。Cyrus(FastMail 使用的邮件服务器软件)不兼容它而且可能一直不会兼容。

Device push services

大多数(也许是全部)移动设备和移动设备系统供应商都会在他们的系统中提供一个推送服务。这一点不仅局限于 iOS安卓 Windows Blackberry 甚至 Ubuntu 和现在已经停止维护的 Firefox OS 都有推送服务。
理论上来说这些服务原理都是一样的,应用软件到操作系统那里请求一些包括设备和应用软件的标识符(a combination device & app identifier)的推送令牌。软件发送令牌请求到它们想推送服务的网路服务。当服务有内容要推送的时候,服务会发送一条携带令牌的消息。推送服务把消息保存在一个队列中,直到设备来请求这些消息的时候才传递这些消息。系统使用令牌中的软件标识符唤醒相对应的软件然后传递消息给它。然后软件继续相应的后续操作。
实际上,系统通常通过一条新消息来实现这点。通常会涉及到几组轮询但是网络层的信号也可以触发这些轮询,比如网络波动变更。这在本质上和软件去轮询没有什么区别,但是操作系统可以更有效率因为系统有软件运行和软件的网络需求的所有的上下文环境而且(由于操作系统管控硬件的原因)其他的硬件也可能对这项任务会有帮助。

FastMail’s Android app

我们的安卓应用程序沿着工作主线已经能很好地工作了。软件启动的时候,软件到 FastMail 那里注册推送令牌。当用户的信箱发生了改变的时候,我们发送消息给谷歌云消息推送服务(Google’s Cloud Messaging push service)(或者如果是非谷歌设备的话,推送到亚马逊设备消息服务(Amazon’s Device Messaging services))。这最终导致设备被系统唤醒,然后请求服务器获取最新的消息然后显示通知。
这种机制的一个缺点是可能导致从推送服务来的消息造成丢失。谷歌的推送服务被明确设计为不保证交付,而且会及时(通常几分钟内)删除无非送达设备的消息。这发生在设备离线或者关机的状态下。基于这个原因,我们的应用也让系统在网络波动和电源事件发生的时候唤醒,这也导致它可以请求服务器上的变更。这样的话,貌似不会有消息丢失发生。

FastMail’s iOS app

我们的 iOS 应用工作方式略有不同。一个有意思的的特性是 iOS 的推送系统可以一次推送包含消息,图标,声音,角标(“badge”(应用图标上的未读统计数字))和行为,然后操作系统将显示在通知栏中。这种方式下应用程序将根本不会被唤醒。当通知到达的时候 iOS 系统自己显示通知和做相应的相应。对于我们的程序来说,行为就是完全打开程序并打开新邮件(我们给我们发送的消息编了一个消息编号)。
这样有点不灵活,因为我们只能以苹果定义的推送格式来发送数据,而且可能会有隐私问题,因为我们通过第三方服务(如果你使用了苹果的硬件的话虽然你已经信任了苹果所以这似乎也没有什么)发送了邮件的部分内容。这样最大的好处是你不会增加电量消耗因为软件就从来没有被唤醒而且也没有使用网络请求变更。这样什么都不做就是最大的高效了!!!
自从 iOS 8 以后一个推送的消息唤醒一个应用程序变得可能,就像安卓和其他平台一样。我们的 iOS 应用以后的更新已经引入了这个新特性。

iOS Mail

iOS 系统自带的邮件客户端可能是个更好的 IMAP 客户端了。然而苹果选择不兼容 IDLE 模式,可能是由于电池续航问题。相反的,苹果会轮询,但最小间隔是15分钟。这种方式不错,而且让电池的负载是可控的,但是实时性不够高,大多数情况下是在人为(选择去查看)之后。当和 iCloud 服务结合使用的话,iOS Mail 可以又实时地通知,就是大多数人理解地实时推送了。
它的工作原理和 FastMail 的安卓客户端非常相似。当发现 IMAP 服务器提供对苹果的推送机制的支持的时候,应用程序向服务器发送它感兴趣的文件夹列表和推送令牌。就像之前说的,当又内容变更时 IMAP 服务器通过苹果的推送服务发送消息,这将会唤醒邮件客户端然后使得 IMAP 请求变更。
IMAP 客户端的一个有点是它不用保持 TCP 连接的打开状态。甚至它终止(Even if it drops)也可能是因为这几个小时没有新邮件,仅仅需要重新连接然后请求变更即可。
当然了,iOS 邮件客户端的这种机制被支持这种扩展的服务器限制了。去年 苹果特别友善地给了我们实现这种机制需要地一切( Apple were kind enough to give us everything we need to implement this feature for FastMail),并且它迅速成了我们最受欢迎的特性之一。

Exchange ActiveSync

最早支持“邮件推送”的普遍人为是微软的 Exchange ActiveSync,所以它需要提一下。最早在 2004 年它就被用在 Windows Mobile 上用来和 Exchange 服务器同步,现在任能经常见到,特别是在安卓设备上(which support it out-of-the-box)。关于 ActiveSync 有许多可说的地方,但是作为一项推送技术而言它没有什么特别的。
它和其他的推送主要的不同是它没有一个“vendor-provided”推送服务。从根本上来说, ActiveSync “服务”在设备上没有定期地轮询任何配置过的 Exchange 服务器去查询新邮件和给任何它感兴趣的应用程序发信号。虽然没有像操作系统直接处理那样高效,但是在安卓和 Windows 上也非常接近了,它允许长期驻留后台。

Calendars and contacts

十月(2016年10月)我们也同样加入了对 iOS 和 macOS 上联系人和日历的推送(push for calendars and contacts on iOS and macOS)的支持。在推送方面,它们工作的和 IMAP 一样好 — 应用程序请求日历和通讯录同通知的请求并产生一个令牌。服务器使用这个令牌通知传递消息的推送服务。操作系统唤醒应用程序然后它返回到服务器去请求更新的内容。对比 CalDAV/CardDAV 和 IMAP,它们有一些结构方面的差异,但是大多数情况下它使用和其他相同的代码和数据模型。

The future

悲哀的是,邮件“推送”的现状非常乱。什么都可以实现 IMAP IDLE 并且得到一些近似推送的东西,但是要获得很好的体验是很困难的(但不是不可能)。真正地做好(and battery-friendly)推送地方式,是你要很依赖于特定的推动方式。
我们当前正在尝试一些可能会也可能不会改变这种现状的事情:

  • JMAP 定义了一个推送协议,使用 Server-Sent Events 或者和移动运营商差不多的推送。JMAP 推送的工作方式是在登陆的时候,客户端给服务端发送一个推送的 URL,而不像其他那种特定的推送令牌(”push token”.)。当服务器上有改变的时候服务器只是简单地发送“服务器有改动”这样地消息(符合 JMAP 的数据格式)给那个URL。消息从推送服务到客户端的细节不在JMAP的范围之内,但在理论上它意味着用户可以选择使用推送服务(可能甚至是自己的)。
  • 我们曾经考虑过(但是目前没有实施的计划)一个可以做同样的事情的 IMAP 扩展 –允许客户端发送一个 URL 来发送变更。
  • 我们目前正努力额外的通知筛选机制,可以发送新的邮件通知给各种服务,包括 pushover.net slack.com 和 ifttt.com 。和应用程序推送不同的是,它们是基于过滤器的,但是它们是另一种了解您在使用邮件应用程序之外的接受信息的一种尝试。

时间将会说明这些尝试何去何从。这些是需要不同的客户端和服务端参与以便观察效果的事儿。这不是我们独立可以完成的事,但如果你是邮件客户端作者而且你想获得比 IMAP IDLE 更好的推送效果的话,可以和我们聊聊。

SPF, DKIM & DMARC email anti-spoofing technology history and future

这篇文章翻译自 FastMail 官方博客
原文:https://blog.fastmail.com/2016/12/24/spf-dkim-dmarc/
这是第二十四篇也是 2016 FastMail Advent Calendar 系列的最后一篇文章。谢谢大家阅读也一如既往地感谢大家使用 FastMail

看看这封邮件是从谁发给谁的呢?

From: PayPal <[email protected]>
To: Rob Mueller <[email protected]>
Subject: Receipt for your donation to Wikimedia Foundation, Inc.

事实上,这些邮件头根本没有告诉你这封邮件真正地是从哪儿发到哪儿的。主要有两个彼此分开的电子邮件标准。RFC5322(旧版RFC822/RFC2822)规定了电子邮件格式,包括邮件头比如 发件人/收件人/邮件标题 和电子邮件正文。然而,它并没有规定电子邮件如何在不同的电子邮件系统之间传递。RFC5321(旧版RFC821/RFC2821)中规定了 简单邮件传输协议(SMTP),它详细地规定了电子邮件在不同系统之间的传递方式。
这种标准分开设计的结果是:邮件消息的格式不需要和邮件的发件人或收件人有任何关系。意思是,你在电子邮件中看到的 发件人/收件人/抄送 这些邮件头也许和这封邮件在 SMTP 传递过程中使用的真正的发件人或者真正的收件人没有关系。
当电子邮件标准制定的时候,互联网是一些人们互相之间认识的一些大学的计算机组成的网络。标准制定的假定情况是邮件用户和其他发送者是互信的。
所以,发件人 字段应该就是这个电子邮件地址的主人。当你要指定收件人的时候,收件人地址应该写在收件人字段并且以 SMTP 为协议发送给收件人(通过 SMTP 的 RCPT TO 命令)。这种分离邮件格式和传递也允许类似秘送(Bcc, blind carbon copy)。任何秘送字段中的地址将不会出现在邮件头中,但是SMTP可以用来把邮件发送到正确地目的地。
随着时间的推移,这种互信的友善的网络环境变得越来越不那么可信了。我们现在的网络环境更多的是恶意和不可信的。我们现在迫切需要保护我们的系统远离垃圾邮件和钓鱼邮件的侵害,因为他们大多数都是为了欺诈用户。
从使用 实时黑名单 (RBLs Realtime Blackhole Lists)判断已知的垃圾邮件发送服务器到邮件内容分析确定是否为垃圾邮件,已有多种层次的垃圾邮件控制手段。在这里,我们将讨论主流的反垃圾邮件技术。

SPF

反欺诈邮件最早期的一个成果是 SPF(Sender Policy Framework 发送方策略框架),SPF 的主导思想是指定通过域名的邮件发送方,通过 DNS 记录来指明特定的域名允许发送邮件的服务器。比如,只允许服务器 x,y和z 发送 @fastmail.com 的邮件。
不幸的是,SPF存在许多问题。起初,SPF只能用于 SMTP 发送协议的域名,也就是 MAIL FROM 这样的信封地址。甚至没有电子邮件软件显示这个地址。(它的主要用途是当邮件发送失败的时候发送错误/退回邮件而使用。)如今,没有必要非得 MAIL FROM 地址匹配发件人字段。所以实际上,邮件反欺诈的对象其实是一个跟本没有人看到过的地址(the only thing youʼre protecting against is the spoofing of an email address no one ever sees)
在这种理论之下,它却是有效地防范了大量的垃圾邮件。它减少了退信(backscatter email),退信就是当你不能收到仿冒邮件的时候看到的邮件。
实际的情况是,只有在如果人们确实挡住了 SMTP 阶段的 SPF 检查的邮件时才有效。很少由于 SPF 有许多问提而有效。它完全打破了传统的邮件转发。当系统转发一封邮件的时候,系统假定 MAIL FROM 被保存用来当邮件转发失败的时候退回给发送者。不幸的是,这意味着某人从 Hotmail 发送了一封邮件给 FastMail,然后你从 FastMail 转发到了 Gmail,在从 FastMail 转发到 Gmail 这个过程中就有了问提。其中 MAIL FROM 地址是一个 @hotmail.com 的域名,但是 SPF 将表明的是 FastMail 是不能被允许用来发送以 @hotmail.com 为域的邮件的。
有种方法 发送者重写策略(SRS, Sender Rewriting Scheme)试图完善这个问提,但是它过于复杂。它让 SFP 提供的保护被相对地降低了,并没有太多地方选择使用 SRS。这种方案以本着对发送方对邮件的签名的尊重就这样终止了。如果 SPF 检查通过,那么或许这封邮件是 MAIL FROM 中的域的合法的邮件。如果 SPF 检查失败,好吧,也不能说明很多问提。有可能这是一封被转发的邮件,也可能是 SPF 记录没有配置,或者许多其他的可能。

DKIM

DKIM(DomainKeys Identified Mail 域名密钥识别邮件标准)是一个明显相比 SPF 符合和有意思的标准。它允许域所有者(同样的,通过 DNS 记录的方式)加密地签名邮件的部分内容以便收件人验证它们是否被修改了。
DKIM is a bit fiddly at the edges and took a while to get traction,但是现在它已经被广泛使用了。发送到 FastMail 的邮件大约有 80% 都是经过 DKIM 签名的。
让我们来看看开始的时候那封邮件中添加的 DKIM 签名:

DKIM-Signature: v=1; a=rsa-sha256; d=paypal.com.au; s=pp-dkim1; c=relaxed/relaxed;
    q=dns/txt; [email protected]; t=1480474251;
    h=From:From:Subject:Date:To:MIME-Version:Content-Type;
    bh=Vn79RZZBrNIu4HFwGMOOAezyw/2Ag+w+avW1yscPcUw=;
    b=...
From: PayPal <[email protected]>
To: Rob Mueller <[email protected]>
Subject: Receipt for your donation to Wikimedia Foundation, Inc.

使用公钥加密和 DNS 查询,邮件接收者可以判断域“paypal.com.au”签名了邮件正文和一些邮件头(这个例子中有 发件人,标题,日期,收件人 等等)。如果签名有效,则认为这封邮件的邮件头和正文在传输过程中没有被修改过。
虽然这很有效,但是仍然有一个很大的问题。
那些以 @paypal.com.au 结尾的没有经过签名的邮件呢?或许不是 PayPal 的每个部门的邮件都正确设置了 DKIM 签名。那我们是否觉得这些没有签名的邮件就是不可信的呢?
并且,我如何知道我能信任这封经过签名的邮件?在这个例子中,paypal.com.au 很可能是属于 Australian division of PayPal Holdings 公司,但是,paypal-admin.com 呢?这并没有明确我应该信任哪个域不信任哪个域。在这个例子中,发件人字段匹配域的 DKIM 签名,但事实情况不一定如此。你可以给任何域都签名 DKIM 信息。这并不能阻止骗子使用签署了 paypal-admin.com 的 DKIM 签名的 @paypal.com.au 发件人地址。
尽管如此,DKIM 提供了正确的信息。它可以使邮件接收方去 associate 域名(或者多个,由于同一封邮件拥有多个 DKIM 签名是可以的并且很多情况下是有用的)和它签名的邮件。随着时间的推移,邮件接收者可以为域和/或和它关联的 IPs 建立一个可信的衡量,发件人地址,和其他邮件特性。这对区别“可信的”邮件和“不可信”的邮件是有帮助的。

DMARC

DMARC (Domain-based Message Authentication, Reporting & Conformance) 试图解决 SPF 和 DKIM 二者遗留的可信问提。仍然,通过 DNS 记录,域所有者可以定义邮件接收者接受到邮件后的行为。就 DMARC 来说,我们通过查看发件人字段认为邮件来自一个特定的域:–当你收到邮件的时候看到的地址。
基本上,在你设置一个 DMARC 记录后邮件接收者应该:

  1. 检查发件人字段的域是否匹配 DKIM 签名的域(这个过程叫做 校验(alignment))以及 DKIM 签名是否有效;
  2. 检查发件人域头字段是否匹配 SMTP 的 MAIL FROM 域以及发件人的 IP 地址是否被 SPF 所允许;

如果有其一(either)检查通过,则这封邮件的 DMARC 则通过检查。如果都检查失败, DMARC 的 DNS 记录规定了接收方应该采取的行为,包括隔离邮件(发送到你的垃圾邮件箱)或者拒收。此外, DMARC 记录可以指定一个电子邮件地址来接受 DMARC 报告。 DMARC 还允许发送方指定 DMARC 记录生效的邮件百分比,所以可以以一种逐渐地可控地方式进行 DMARC 的配置。
回到我们的例子邮件中:

DKIM-Signature: v=1; a=rsa-sha256; d=paypal.com.au; s=pp-dkim1; c=relaxed/relaxed;
    q=dns/txt; [email protected]; t=1480474251;
    h=From:From:Subject:Date:To:MIME-Version:Content-Type;
    bh=Vn79RZZBrNIu4HFwGMOOAezyw/2Ag+w+avW1yscPcUw=;
    b=...
From: PayPal <[email protected]>
To: Rob Mueller <[email protected]>
Subject: Receipt for your donation to Wikimedia Foundation, Inc.

在这个例子中,发件人域是 paypal.com.au 我们来看看是否被配置了 DMARC 规则。

$ dig +short _dmarc.paypal.com.au TXT
"v=DMARC1; p=reject; rua=mailto:[email protected]; ruf=mailto:[email protected],mailto:[email protected]"

是的,得到了 DMARC 配置信息。我们来进行分析!发件人域是否匹配 DKIM 签名域 paypal.com.au?匹配,我们完成了校验。如果这封邮件没有被 DKIM 签名,或者如果它被签名了但是被签名的是 paypal-admin.com(假设被不法之徒签名了),这样的话将不会完成校验,因此 DMARC 校验将会失败。在这点上,我们已经了解过 DMARC 规则了,它指定了 p=reject 我们应该拒收这封仿冒邮件。
在这个例子中(我没有写出完整的 DKIM 签名,但我可以告诉你签名是有效的),这封电子邮件通过了 DMARC 验证。所以我们可以接受它。通过校验,我们清楚了发件人地址的域也和 DKIM 签名中的域是匹配的。这一点可以让用户确信当他们看到一个发件人:@paypal.com.au 地址的时候,他们知道这确实是一封来自 paypal.com.au 的邮件而不是仿冒邮件。
这就是为何 DMARC 被认为是反仿冒邮件的未来。意思就是发件人的域不能被仿冒(至少域有 DKIM 签名并且发布了 DMARC 规则)。所有的这一切,某种程度上仅仅是保证了发件人地址的域不会被仿冒。(All that, just to ensure the domain in the From address canʼt be forged, in some cases.)
不幸的是,按照套路来说,这个特性当然也会带来一些问提。
DMARC 允许你使用 SPF 或 DKIM 来验证一封邮件。如果你没有 DKIM 签名但是仅仅 依赖 SPF 的话,如果一封邮件从一个邮件服务商转发到另一个邮件服务商,DMARC 校验将会失败。如果你设置了 p=reject 规则的话,这个转发将会失败。不像 SPF 中那样校验失败更像是一种“弱签名”, DMARC 规则是假定告知接收者更严格的规则,使退信是一种更大的可能性。
解决方案:如果你有 DMARC 规则则确保总是用 DKIM 签名了邮件。如果你的邮件被转发,SPF 规则将被破坏,但是 DKIM 签名应该仍是可用的(should survive)。SRS 对 DMARC 没有帮助,因为用你自己的域替换 MAIL FROM 意味着 MAIL FROM 的域将不匹配发件人头标签中的域。这会导致校验失败,会导致 DMARC 校验失败。
我说仍是可用的(should survive),因为,再次地,并不是所有地电子邮件服务商都完美支持。这个理论之下,转发保证了你地邮件地完整结构。不幸的是,并不总是如此。甚至大的电子邮件服务商也会不经意间略微地改变电子邮件的内容/结构(基于微软 Exchange 的邮件系统(包括 outlook.com)和苹果 iCloud 在这方面做的更差一些)。甚至一个微小的修改都会导致 DKIM 签名失败,而且,结合 DMARC 的 p=reject 规则的话,会导致这封转发邮件被目标服务商拒收。
解决方案如下:

  1. 给这些邮件服务商反馈 bug 让他们完善他们的转发系统以便在传输过程中邮件保持完整性。DKIM 目前已经是一个标准了,电子邮件服务商应该确保他们的转发不破坏邮件签名。
  2. 转而使用 POP 协议从远端获取邮件。我们不对通过 POP 方式获取的远端邮件做 SPF/DKIM/DMARC 检查。
  3. 不要使用邮件转发。不管邮件从哪里来,改变你的邮件服务商所在的邮件地址让它直接指向 FastMail 的邮件地址,避免转发。

DMARC 还有个大问题:邮件列表。邮件列表被认为是个邮件转发的特例:你发了一封邮件,这封邮件被转发给了其他地址(邮件列表中的地址)。然而,邮件列表转发邮件的时候普遍都会修改邮件,在每一封邮件的底部加入一些取消订阅邮件的链接或者标准标准签名和/或在标题加入[list-id]标签。
DKIM 签名标题和正文是非常普遍的。改变它们就会破坏 DKIM 签名。所以,那么当邮件列表软件尝试转发邮件给所有的列表用户的时候,收取邮件的系统将会破坏 DKIM 签名从而导致邮件被拒收。(有件具有代表性的事情是 许多年前雅虎和AOL邮件系统都启用 p=reject (Yahoo and AOL both enabled p=reject on their user webmail service domains a few years ago!
幸亏,有个相对直接的解决方案。邮件列表软件可以重写邮件的发件人,并且重新对这个域进行 DKIM 签名。这一点和其他解决方案( couple of other solutions )可以在 DMARC 网站上有说明。目前,大多数邮件列表软件系统已经实现了对这些解决方案的兼容,那些还没有解决这个问题的邮件列表系统将不得不面对类似 Gmail明年的某个时候将启用 p=reject 规则。(Gmail enables p=reject on gmail.com sometime early next year )这样的问题。不能从世界上最大的邮件系统转发邮件将明显对你的邮件列表造成影响。
这些认证体系对 FastMail 来说影响个我们收邮件和我们发邮件方面的工作。

SPF, DKIM & DMARC for email received at FastMail

当前,FastMail 对通过 SMTP 协议收取的远端服务器的邮件进行 SPF, DKIM 和 DMARC 检查(但不影响 POP 协议收取的邮件)。
SPF 和/或 DKIM 验证通过或失败仅仅会影响这封邮件的垃圾邮件指数(spam score).我们不想对来自一个重要的域的邮件因为 DKIM 签名验证失败而歧视,我们也不会因为垃圾邮件黑名单中的域通过的 DKIM 签名而把它移除黑名单加入白名单。 DKIM 签名只是当作邮件上下文信息对待,并不是对它进行白名单/黑名单判定的重要依据。
DMARC呢,是域的所有者对来自于他自己的域的邮件的处理方式的一个表述。对于使用了 p=quarantine 规则的域,我们对失败的邮件一个比较高的垃圾邮件指数(spam score)来确保它能到达用户的垃圾邮件文件夹。对于使用了 p=reject 规则的域,我们当前不在 SMTP 阶段拒收但是仍然给它一个比较高的指数然后隔离。未来我们希望加入一些已知的会导致问题的服务条款来改变这一点。
我们给所有收到的邮件加入了一个标准的 Authentication-Results 邮件头标签用来说明 SPF, DKIM 和 DMARC 规则的生效情况。不可思议的是现有的软件在这方面并没有做到很好的优化(not well maintained )或者存在 bug,所以我们发起了一个开源项目希望别人使用( open source solution we hope others will use
再次回到我们的例子当中。下面是那个 PayPal 邮件相应的 Authentication-Results 头标签。

Authentication-Results: mx2.messagingengine.com;
    dkim=pass (2048-bit rsa key) header.d=paypal.com.au [email protected] header.b=PVkLotf/;
    dmarc=pass header.from=paypal.com.au;
    spf=pass [email protected] smtp.helo=mx2.slc.paypal.com
DKIM-Signature: v=1; a=rsa-sha256; d=paypal.com.au; s=pp-dkim1; c=relaxed/relaxed;
    q=dns/txt; [email protected]; t=1480474251;
    h=From:From:Subject:Date:To:MIME-Version:Content-Type;
    bh=Vn79RZZBrNIu4HFwGMOOAezyw/2Ag+w+avW1yscPcUw=;
    b=...
From: PayPal <[email protected]>
To: Rob Mueller <[email protected]>
Subject: Receipt for your donation to Wikimedia Foundation, Inc.

大家可以看到 SPF,DKIM 和 DMARC 都通过了验证。
邮件头信息被 FastMail 系统的其他部分使用。举个例子,如果你把地址 [email protected] 加入了通讯录以便使它进入白名单。如果这类邮件的 DMARC 验证失败的话我们将忽略它的白名单属性。这保证了坏人不能用创建一个以 [email protected] 为发件人的诈骗邮件,因为你已经将它加入白名单了。

SPF, DKIM & DMARC for FastMail and user domains

所有的 FastMail 域名当前都有较为宽泛的 SPF 规则(如此设计是为了兼顾老的系统,看下文的 DMARC)并且我们对所有发出的邮件都采用 DKIM 签名。事实上我们签名两个域名,一个是发件人地址的域还有就是众所周知的 messagingengine.com。这和那些用 DKIM 签名来判断邮件来源的系统的反馈环路设计( Feedback Loops )有关。
对于使用自定义域,如果你在我们这里托管 DNS 的话(host the DNS for your domain ),我们仍然有较为宽泛的 SPF 规则和 DKIM 签名。如果你使用了其他 DNS 服务商解析的话,你需要确保在你的 DNS 解析李设置了正确的 DKIM 签名(DKIM record at your DNS provider ) 。一旦我们检测到 DKIM 记录,我们就会使用它来签署你通过我们发出的邮件。
当前,FastMail 自己的域没有 DMARC 规则,也没有对自定义域发布默认的规则。这意味着用户可以用 @fastmail.com 从任何地方发送邮件。这种做法是有点过时了。当 FastMail 16年前刚创立的时候,这些身份认证标准还都不存在。人们使用各种复杂的他们想发送邮件的各种发件人信息来发送邮件。(老的联网传真/扫描仪是这种做法的典型代表。)
随着时间的推移,这种情况变得越来越少,并且越来越多的人们期望电子邮件是通过了 DKIM 签名并且/或者通过了 SPF 验证并且/或者有 DMARC 规则。未来的某个时候,很可能我们的域名也会启用 p=reject 规则。要发送以 @fastmail.com/@sent.com/等等为发件人的邮件,你必须通过我们的系统发送。这种方式可以通过 SMTP 可以完美认证,如今一些基础的东西都已经完美支持了。

Ongoing problems

虽然通过 DMARC 我们可以验证发件人域名是否被允许发送邮件还可以验证邮件内容,是个很有效的方法欺诈邮件的特性,但反欺诈仍然有很长的路。虽然我们在这方面很有经验但是用户一般不会持怀疑态度去检查邮件。我们经常看到这样的欺诈邮件:

From: No Reply <[email protected]> 
To:[email protected] 
Subject: Urgent! Your account is going to be closed!

Click [here](http://example.com) right now or your account will be closed

很多用户就点开了链接,在一个伪造的页面上输入了登陆信息(甚至包括那些看起来都不是 FastMail 的页面的页面),我们每天都能遇到各种各样的账号被盗。不幸的是,试图教用户(educate users )貌似并不奏效。
电子邮件的一个主要的有点是它是一个真正的开放的消息系统。世界上的任何人都可以创建一个电子邮件账号和其他的邮件系统开始通讯。它不是一个受制于某个个体公司或者网站的围城。这种开放也是最大的弱点,这意味着合法的发件人和仿冒邮件发送者是同等的。这意味着未来电子邮件的发展将继续它在合法收件人和仿冒邮件发送者之间的这种竞争,试图判定每一封邮件是合法的有很多很多种因素。不幸的是,这意味着误判是在所难免而且一直会有的(仿冒邮件合法地进入了收件箱或者合法的邮件被标记为仿冒邮件)。世界上没有一个“完美的”邮件系统,无论系统里被投递进来了什么,我们都将努力变得更好。

Email authentication in the future

虽然邮件列表和 p=reject 规则不兼容这个主要的问题已经被大部分解决了,它产生了一个新的问题那就是收件方对邮件列表的域名的信任问题。这刺激了垃圾邮件发送者把目标转向邮件列表,希望更宽松的垃圾邮件判定规则以便把垃圾邮件发送到信任邮件列表域名的那些邮件系统中。一个新的叫做 (ARC,Authenticated Received Chain)的标准让邮件接收者以同等的情况去返回去信任他们能看到信任结果的前置的接受系统并且把先前多个阶段的投递路径的域名相关联。
我们愿意看到的是域名和一些现实世界相关联。其中一个重任被 SSL 扩展验证证书(SSL Extended Validation (EV) Certificate )系统担任了。申请 EV 证书需要提供实际的合法的身份证明。当你在访问一些使用了 EV 证书的网站时你可以在浏览器中看到。比如我们的网站使用了 EV 证书https://www.fastmail.com),浏览器在地址栏会现实“FastMail Pty Ltd”。清楚地在合法地发件人旁边显示 PayPal 的“PayPal, Inc”或其他财务类网站对用户来说看起来是个 significant win(modulo the slightly sad results we already found regarding users falling for phishing emails 。
不幸的是,这方面没有标准并且也没有其他关于这方面的起色的事情,and it’s not entirely obvious how to do this without support from the senders.一个不需要发件人参与的方法是从发件人地址中提取域名并且试图使用 https:// 去连接。但是这样会有其他一些副作用,比如 PayPal 用国别域名签名 DKIM 信息(比如 paypal.com.au),但是如果你在浏览器中访问 http://paypal.com.au ,将会跳转到 https://www.paypal.com 。我们不能简单地仅仅跟网站跳转因为不法分子可以建立一个 paypal-scam.com 的网站并且指向 https://paypal.com .Working out what redirects should actually be followed is entirely non-trivial.

Coda

这篇文章比我计划的内容要多了许多,它指出了如何在现代的电子邮件系统上下文中完成电子邮件认证这个主题。FastMail 努力试图让这些不但能让其他系统的发件人而且也能让自定义域的发件人“just work”。如果你把 DNS 托管在我们这里的话,我们为你自动配置 SPF 和 DKIM 签名规则。我们当前没有设置 DMARC 记录(还有其他不同的邮件发送方式),but we hope in the future to allow easier construction and rollout of DMARC records for user domains.