如何使用Amazon的邮件服务SES

云服务提供商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》上有3条评论

  1. Pingback引用通告: Amazon SES筆記 « What's Going On

  2. Pingback引用通告: Amazon SES筆記 « What's Going On

  3. Pingback引用通告: Amazon SES筆記 « What's Going On

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>