3

Amazon SES に E メールを送信するオンラインソフトウェアがあります。現在、phpmailerを使用してSMTP経由でメールを送信し、メッセージを送信するcronジョブがあります。現在、サーバーがタイムアウトしないように、送信制限を毎分約 300 に制限する必要があります。成長が見られ、最終的には 10,000 以上に発送したいと考えています。

Amazon SES に送信するためのより良い方法はありますか? それとも、ワークロードを実行するサーバーが増えるだけで、これは他のすべての人が行っていることですか?

前もって感謝します!

4

3 に答える 3

7

AWS SDK for PHP の使用を試すことができます。SES API を介してメールを送信できます。SDK を使用すると、複数のメールを並行して送信できます。開始するためのコード サンプル (テストされておらず、部分的にしか完成していません) を次に示します。

<?php

require 'vendor/autoload.php';

use Aws\Ses\SesClient;
use Guzzle\Service\Exception\CommandTransferException;

$ses = SesClient::factory(/* ...credentials... */);

$emails = array();
// @TODO SOME SORT OF LOGIC THAT POPULATES THE ABOVE ARRAY

$emailBatch = new SplQueue();
$emailBatch->setIteratorMode(SplQueue::IT_MODE_DELETE);

while ($emails) {
    // Generate SendEmail commands to batch
    foreach ($emails as $email) {
        $emailCommand = $ses->getCommand('SendEmail', array(
            // GENERATE COMMAND PARAMS FROM THE $email DATA
        ));
        $emailBatch->enqueue($emailCommand);
    }

    try {
        // Send the batch
        $successfulCommands = $ses->execute(iterator_to_array($emailBatch));
    } catch (CommandTransferException $e) {
        $successfulCommands = $e->getSuccessfulCommands();
        // Requeue failed commands
        foreach ($e->getFailedCommands() as $failedCommand) {
            $emailBatch->enqueue($failedCommand);
        }
    }

    foreach ($successfulCommands as $command) {
        echo 'Sent message: ' . $command->getResult()->get('MessageId') . "\n";
    }
}

// Also Licensed under version 2.0 of the Apache License.

GuzzleBatchBuilderとその仲間を使用して、より堅牢にすることも検討できます。

このコードを微調整する必要があることはたくさんありますが、電子メールのより高いスループットを達成できる可能性があります。

于 2013-09-30T18:29:44.310 に答える