Amazon Ses PHP SDK 2 - 如何实现高发送率

时间:2013-05-30 10:53:39

标签: php amazon-ses

使用PHP SDK中sendEmail类的SesClient方法发送电子邮件目前每封电子邮件大约需要半秒钟。我正在遍历收件人数组,并在调用ToAddresses之前将消息sendEmail()属性设置为仅包含接收者电子邮件地址的数组。我想加快发送过程,但在我看来,SDK提供的PHP类为每条消息(在我的情况下,收件人)做了一个请求。 (每条消息可能有一个连接?)

我做了一些阅读,我考虑使用BccAddresses属性批量发送电子邮件,但我们希望明确设置To:标题,而不是仅仅说“未公开” - 收件人“,所以我想知道是否有人有更好的方法。

2 个答案:

答案 0 :(得分:5)

对于那些来自AWS和SES试图解决在持久连接上完成的并行请求问题的人来说,AWS SDK 2及更高版本在php中使用命令对象支持此功能。

SesClient和其他客户端可以并行执行命令。这是通过SES触发单个连接和电子邮件的常规方法:

$result = $client->sendEmail(array(
    //email data
));

客户端对象非常强大,并且继承了许多方法来执行和操作getCommand()execute()等请求。在找到简单的解决方案之前,需要花费数小时的时间进行挖掘!你只需要知道正确的搜索。这是一个例子:

$commands = array();
$commands[] = $sesClient->getCommand('SendEmail', array(
    //email data
));
$commands[] = $sesClient->getCommand('SendEmail', array(
    //email data
));

// Execute an array of command objects to do them in parallel
$sesClient->execute($commands);

// Loop over the commands, which have now all been executed
foreach ($commands as $command) {
    $result = $command->getResult();
    // Do something with result
}

可以通过执行以下代码来实现错误处理:

use Guzzle\Service\Exception\CommandTransferException;

try {
    $succeeded = $client->execute($commands);
} catch (CommandTransferException $e) {
    $succeeded = $e->getSuccessfulCommands();
    echo "Failed Commands:\n";
    foreach ($e->getFailedCommands() as $failedCommand) {
        echo $e->getExceptionForFailedCommand($failedCommand)->getMessage() . "\n";
    }
}

亚马逊在commands feature下的开发者指南中记录了这些示例。

答案 1 :(得分:0)

我过去使用PHP和AWS完成的工作是在数据库中设置一个电子邮件队列,并让多个进程处理它以发送电子邮件。

或者,您可以在多个线程中发送电子邮件(在PHP中可能非常简单)。这是一个带有aws-sdk-ruby的红宝石的例子。

  require aws-sdk
  ses = AWS::SimpleEmailService.new(:access_key_id => 'ACCESS_KEY', :secret_access_key => 'SECRET_KEY')
  pool = Array.new(ses.quotas[:max_send_rate]) do |i|
    Thread.new do
      ses.send_email(
        :subject => 'subject',
        :body_html => 'body_html',
        :body_text => 'body_text',
        :to => 'mailto@example.com',
        :source => 'mailfrom@example.com',
      )
    end
  end

  sleep(1)
  pool.each(&:join)