如何使用云来发送邮件

3.4 版本
维护中的版本

生产环境下的邮件发送准备,不同于你在开发过程中的设置,因为你希望邮件的数量、发送成功率或是邮件发送服务器的地址“不受限制”。因此,使用Gmail 或类似服务将不能成为选项。如果在设置和维护你自己的可靠邮件服务器时,你头痛不已,这里有个简单的解决方案:利用云来发送邮件。

本文能够证明整合 Amazon's Simple Email Service (SES) 到Symfony是多么地容易。

对于其他(商家的)邮件服务,你可以使用相同技巧,因为多数时候并不会有比“为Swift Mailer配置一个SMTP选项”更多的事情了。

在Symfony的配置文件中,依照 SES console 所提供的信息,来改变Swift Mailer的 transport, host, portencryption 设置。在SES console中创建你自己专有的SMTP凭据,添加服务商提供的 usernamepassword 来完成配置:

1
2
3
4
5
6
7
8
9
10
11
# app/config/config.yml
swiftmailer:
    transport:  smtp
    host:       email-smtp.us-east-1.amazonaws.com
    port:       587 # different ports are available, see SES console
                    # 其他端口也可以使用,参考SES控制台
    encryption: tls # TLS encryption is required / TLS加密必须
    username:   AWS_SES_SMTP_USERNAME  # to be created in the SES console
                                       # 创建于SES控制台
    password:   AWS_SES_SMTP_PASSWORD  # to be created in the SES console
                                       # 创建于SES控制台
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!-- app/config/config.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:swiftmailer="http://symfony.com/schema/dic/swiftmailer"
    xsi:schemaLocation="http://symfony.com/schema/dic/services
        http://symfony.com/schema/dic/services/services-1.0.xsd
        http://symfony.com/schema/dic/swiftmailer
        http://symfony.com/schema/dic/swiftmailer/swiftmailer-1.0.xsd">
 
    <!-- ... -->
    <swiftmailer:config
        transport="smtp"
        host="email-smtp.us-east-1.amazonaws.com"
        port="587"
        encryption="tls"
        username="AWS_SES_SMTP_USERNAME"
        password="AWS_SES_SMTP_PASSWORD"
    />
</container>
1
2
3
4
5
6
7
8
9
// app/config/config.php
$container->loadFromExtension('swiftmailer', array(
    'transport'  => 'smtp',
    'host'       => 'email-smtp.us-east-1.amazonaws.com',
    'port'       => 587,
    'encryption' => 'tls',
    'username'   => 'AWS_SES_SMTP_USERNAME',
    'password'   => 'AWS_SES_SMTP_PASSWORD',
));

portencryption 键,并非Symfony标准版框架的默认配置,但你可以随需添加之。

如果你用的是Symfony标准版,在 parameters.yml 中配置参数,然后在配置文件中使用参数。 这允许不同的Swift Mailer配置作用于你的程序的“每一次安装”。例如,在开发时使用Gmail,而在生产环境使用云配置。

1
2
3
4
5
6
7
8
9
10
11
12
# app/config/parameters.yml
parameters:
    # ...
    mailer_transport:  smtp
    mailer_host:       email-smtp.us-east-1.amazonaws.com
    mailer_port:       587 # different ports are available, see SES console
                           # 其他端口也可以使用,参考SES控制台
    mailer_encryption: tls # TLS encryption is required / TLS加密必须
    mailer_user:       AWS_SES_SMTP_USERNAME # to be created in the SES console
                                             # 创建于SES控制台
    mailer_password:   AWS_SES_SMTP_PASSWORD # to be created in the SES console
                                             # 创建于SES控制台

若你倾向于使用Amazon SES的话,请注意以下几点:

  • 你必须注册到 Amazon Web Services (AWS);
  • 使用在 FromReturn-Path (bounce address) 头中的每一个发信人地址,都需要所有人来确认。你也可以对整个域名进行确认;
  • 最初你将被限制在沙盒模式下。被允许向任意收信人发送信息之前,你必须先请求“production access”产品级访问;
  • SES有可能成为被起诉的主题。

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)