3

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

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

4

2 回答 2

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";
    }
}

Amazon 在其开发人员指南中的命令功能下记录了这些示例。

于 2014-11-18T18:39:12.570 回答
0

我过去使用 PHP 和 AWS 所做的事情是在数据库中设置一个电子邮件队列,并让多个进程处理它来传递电子邮件。

或者,您可以只在多个线程中发送电子邮件(在 PHP 中可能很重要)。这是带有 aws-sdk-ruby 的 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)
于 2013-06-12T05:17:06.403 回答