日度归档:2011 年 03 月 19 日

用C++写邮件服务器,用上DKIM,可以给陌生人发正常邮件了

研究完SMTP协议,也涉猎了不少RFC文档,粗粗略略了解到不少东西。一开始在自己电脑用telnet给对方直接发送电子邮件,只要发送方的邮箱地址不在对方的联系人中,都被直接视为垃圾邮件了。后来给在服务器上测试,给邮箱域名增加了SPF记录,但是效果不是很明显,还是大部分被视作垃圾邮件了。具体操作可以参见百度百科:SPF记录

奇怪的是,我发现不少网站的邮箱服务器也只有SPF记录,甚至有的没有设置SPF记录(例如dot.tk),都可以正常发送到我邮箱里。或许我的IP段不好吧。据说,支持DKIM数字证书的邮箱服务器更能有效地防止垃圾邮件,所以我决定让我的邮箱服务器也支持DKIM的签名。

我在服务器端使用GPL发布的PDKIM库实现的数字证书签名功能。说到数字证书,就想到RSA了,又想到Public Key和Private Key。这个Public Key是存放在DNS上某域名的TXT记录里,跟SPF记录的做法差不多。Private Key是邮箱服务器发信的时候,用来对邮件内容产生一个Hash字段的。

例如,我使用PDKIM产生的是:

DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mail.xiaoxia.org; 
    s=s1;h=Content-Transfer-Encoding:Content-Type:To:From:Subject; 
    h=qc1pcFZEKobZ5/u35TeoRGObVNBgyRTlkjjKiya6CZk=;
    b=o4a6wMV6C8Me9TJMvv7gb233or0Qam+R8dhwDkXUgArTGcbS0El8YyYM527MdJpQSnlT9QicPi
    MSKQOY8GEcCKC2J9WIHnpxlMfqv+e+7N+HnMUyBjYTdtu8Yu1LD0CQhf1iDywBmYquwue5ON+7hp1taF7lLnfsNwyyramzYrE=;

今天测试的时候,一直遇到问题,在PDKIM库中出现异常。今晚才发现问题所在,原来是我末尾少了一个”\r\n”导致的。给Gmail发送了一封邮件,显示DKIM数字签名已通过!!!


继续阅读