3

sendEmailPHP SDKのクラスのメソッドを使用して電子メールを送信すると、SesClient現在、電子メールごとに約 0.5 秒かかります。受信者の配列をループして、 messageToAddressesプロパティを、受信者の電子メール アドレスだけを含む配列と等しくなるように設定してから、 を呼び出しsendEmail()ます。送信プロセスを高速化したいのですが、SDK によって提供される PHP クラスは、メッセージ (私の場合は受信者) ごとに 1 つの要求を行うように思えます。(メッセージごとに 1 つの接続でしょうか?)

少し読んで、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 で行ったことは、db にメール キューを設定し、メールを配信するために複数のプロセスを動作させることでした。

または、複数のスレッドでメールを配信することもできます (おそらく 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 に答える