2013-09-30 3 views
2

У меня есть онлайн-программное обеспечение, которое отправляет электронные письма Amazon SES. В настоящее время у меня есть задание cron, которое отправляет письма через SMTP с помощью phpmailer для отправки сообщений. В настоящее время я должен максимально увеличить лимит отправки до 300 каждый раз, чтобы убедиться, что мой сервер не отключается. Мы видим рост, и в конце концов я бы хотел отправить до 10 000 или более.PHP Отправка больших сумм электронной почты на Amazon SES

Есть ли лучший способ отправить Amazon SES, или это то, что делают все остальные, но с еще большим количеством серверов, на которых работает рабочая нагрузка?

Заранее благодарен!

ответ

7

Вы можете попробовать использовать AWS SDK для PHP. Вы можете отправлять электронные письма через API SES, а 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. 

Вы также можете посмотреть в использовании Guzzle BatchBuilder and friends, чтобы сделать его более устойчивым.

Есть много вещей, которые вам нужно будет подкорректировать с помощью этого кода, но вы можете может получить более высокую пропускную способность электронной почты.

0

Благодарим вас за ответ. Это была хорошая отправная точка. @Jeremy Lindblom

Моя проблема в том, что я не могу заставить обработку ошибок работать. Улов() - Блок работает отлично и внутри него

$successfulCommands 

возвращает все преуспевать ответы с Status-кодов, но только в случае возникновения ошибки. Например, «непроверенный адрес» в режиме «Песочница». Как catch() должен работать. :)

$ successfulCommands внутри примерочных Блок только возвращает:

SplQueue Object 
(
    [flags:SplDoublyLinkedList:private] => 1 
    [dllist:SplDoublyLinkedList:private] => Array 
    (
    ) 
) 

Я не могу понять, как получить реальный ответ от Amazon с Status-кодов и т.д.

+1

Метод 'execute()' в принципе возвращает любую итеративную структуру данных, которая была передана, но с обновленными объектами команд, чтобы отразить их выполнение. Так как 'SqlQueue :: IT_DELETE_MODE' включен, он удаляет команды из' SqlQueue' (который в этом случае является итерируемой структурой данных), в результате чего они не возвращаются. Я редактировал образец исходного кода, чтобы добавить вызов 'iterator_to_array()', который должен его исправить. Теперь он должен перебираться по очереди, как и раньше, но хранить команды в массиве, которые будут возвращены 'execute' со всеми присутствующими объектами команд. –

+0

Спасибо, Джереми! iterator_to_array() делает трюк, и теперь я могу получить ответ от амазонки внутри try-Block! Ты мой человек! :) –

0

Если кто-то ищет этот ответ, его устаревшим, и вы можете найти новую документацию здесь: https://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/commands.html

use Aws\S3\S3Client; 
use Aws\CommandPool; 

// Create the client. 
$client = new S3Client([ 
    'region' => 'us-standard', 
    'version' => '2006-03-01' 
]); 

$bucket = 'example'; 
$commands = [ 
    $client->getCommand('HeadObject', ['Bucket' => $bucket, 'Key' => 'a']), 
    $client->getCommand('HeadObject', ['Bucket' => $bucket, 'Key' => 'b']), 
    $client->getCommand('HeadObject', ['Bucket' => $bucket, 'Key' => 'c']) 
]; 

$pool = new CommandPool($client, $commands); 

// Initiate the pool transfers 
$promise = $pool->promise(); 

// Force the pool to complete synchronously 
$promise->wait(); 

То же самое можно сделать для команд SES.

Смежные вопросы