2013-05-30 3 views
3

SesClient 클래스의 sendEmail 메소드를 사용하여 전자 메일을 보내는 데 PHP SDK의 현재 약 0.5 초가 소요됩니다. 수신자 배열을 반복하고, sendEmail()을 호출하기 전에 메시지 ToAddresses을 수신자 전자 메일 주소가 포함 된 배열과 동일하게 설정합니다. 보내는 프로세스 속도를 높이고 싶지만 SDK에서 제공하는 PHP 클래스가 메시지 당 하나의 요청 (내 경우에는받는 사람)을 수행하는 것처럼 보입니다. 메시지 당 하나의 연결 일 수도 있습니다.Amazon Ses PHP SDK 2 - 높은 전송 속도를 달성하는 방법

나는 약간의 독서를했고, BccAddresses 속성을 사용하여 일괄 적으로 전자 메일을 보내지 만, To: 헤더를 명시 적으로 설정하는 대신에 " 공개되지 않은 수신자 "라고 말하면서 누구에게 더 나은 접근법이 있는지 알고 싶습니다.

답변

0

과거에 PHP와 AWS로 수행 한 작업은 db에서 전자 메일 대기열을 설정하고 전자 메일을 전달하기 위해 여러 프로세스가 작동하도록했습니다.

또는 이메일을 여러 스레드로 전달할 수도 있습니다 (PHP에서는 간단하지 않음). 다음은 aws-sdk-ruby를 사용한 루비의 예제입니다. 최대 영구 연결에서 수행하는 병렬 요청, AWS의 SDK (2)이 문제를 해결하기 위해 노력 AWS와 SES를 통해 보았 와서 그 사람들을 위해

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 => '[email protected]', 
     :source => '[email protected]', 
    ) 
    end 
    end 

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

니스! 오늘날 나는 (스레드가 아닌 여러 소비자 프로세스를 사용하여) 끝내기 때문에이 방법으로 정확하게 대답하려고했습니다. 사실, API가 주어지면이 솔루션 중 하나이거나 보낸 사람 프로그램을 API 끝점에 더 가깝게 이동시킵니다. – idrarig

5

PHP를 사용하여 명령 개체에서이 지원합니다.

SesClient 및 다른 클라이언트는 명령을 병렬로 실행할 수 있습니다.

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

클라이언트 객체는 매우 강력하고 수행 및 getCommand()execute() 같은 요청을 조작 할 수있는 많은 방법을 상속 :이 SES를 통해 단일 연결과 이메일을 발사하기위한 일반적인 방법이다. 간단한 해결책을 찾기까지 몇 시간이 걸렸습니다. 검색 할 올바른 것을 알아야합니다.

$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에서 그들의 현상 가이드의 이러한 실시 예를 설명합니다.