云服务提供商Amazon有一项邮件服务,叫做SES(Simple Email Service),如果不想搭建自己的邮件系统,使用这个服务是很不错的一个选择。本文记录如何使用这项服务。
首先需要去Amazon AWS注册一个账号,然后就可以使用这项服务了,首先需要验证几个邮箱进行测试用,可以是用PHP或者Java、Perl等语言编写程序发送邮件,测试完成后,就可以申请转到生产环境,审批申请的时间是一个工作日内,具体官网上都有介绍,比较简单。
SES提供了三种API方式进行交互,一种是SendMail,一种是SendRawMail,还有是传统的SMTP方式,可以按需使用。
如果使用JAVA和SES通信,需要使用官方的SDK,即aws-java-sdk-1.3.5.jar这个包,还需要Apache的httpclient包,也就是httpcore-4.1.4.jar和httpclient-4.1.3.jar这两个jar包。
在测试过程中发现SES代发的邮件会被一些邮件服务商评断为垃圾邮件,进入了垃圾箱,比如163。为了解决这个问题,可以给邮件服务增加SPF、SenderID和DKIM验证,测试证明前两者基本被163忽略,而能解决问题的就是DKIM,有了这个DKIM,Gmail在显示邮件信息的时候甚至会把默认出现的amazon代发的头部信息去掉,很棒。关于DKIM,我以前的一篇文章曾经介绍过,不过那是和Postfix整合的,这次是要通过应用程序来调用,要注意的是,使用DKIM功能必需使用SendRawMail接口来发邮件。
增加SPF和SenderID的方法就是在DNS上增加以下TXT记录:
v=spf1 include:amazonses.com ?all
spf2.0/pra include:amazonses.com ?all
增加DKIM功能,需要先生成密钥:
[root@dev banping]# openssl genrsa -out banping.private 1024
[root@dev banping]# openssl rsa -in banping.private -out banping.public -pubout -outform PEM
然后把public key添加到DNS记录里:
主机记录:s1._domainkey.mail
内容:k=rsa;t=y;p=……(public key内容)
对于如何使用private key进行签名,可以使用Apache James项目提供的一个包JDKIM,需要apache-jdkim-library-0.2.jar、apache-jdkim-mailets-0.2.jar、apache-mime4j-core-0.7.jar和apache-mime4j-dom-0.7.jar四个JAR文件。
特别要注意的是,JDKIM不能使用原始的Private key,必需经过格式转换和编码,我今天大部分时间都花在了处理这个问题上,因为官方文档并没有说这些,或者说了我没发现,后来看JDKIM的源码才发现了问题所在:
[root@dev banping]# openssl pkcs8 -topk8 -inform PEM -in banping.private -outform DER -nocrypt -out rsapriv.der
[root@dev banping]# base64 rsapriv.der
把base64转码后的输出作为private key参数传给JDKIM的对应函数就可以了,同时,DNS里记录的信息要和这里加密的头信息保持一致,比如在DKIM_HEADER_TEMPLATE里记录:
s=s1; d=mail.banping.com
否则邮件接收方在验证DNS信息的时候不匹配,认证会无法通过。还有就是发件人无法显示中文,会乱码,邮件标题和内容里的中文乱码的问题,可以通过设置utf-8解决。
update 20120330 :如果你的用于发送邮箱配置了腾讯的企业邮箱,那么发送到QQ邮箱的邮件列表会显示Amazon的发件地址,同时会提示此邮件地址未验证之类的信息,解决的办法是不要使用腾讯的企业邮箱。

[...] Amazon-SES-API-reference Amazon-SES-Developer-Guide Amazon-DOC 有用連結 [...]