使用PHP SDK中sendEmail
类的SesClient
方法发送电子邮件目前每封电子邮件大约需要半秒钟。我正在遍历收件人数组,并在调用ToAddresses
之前将消息sendEmail()
属性设置为仅包含接收者电子邮件地址的数组。我想加快发送过程,但在我看来,SDK提供的PHP类为每条消息(在我的情况下,收件人)做了一个请求。 (每条消息可能有一个连接?)
我做了一些阅读,我考虑使用BccAddresses
属性批量发送电子邮件,但我们希望明确设置To:
标题,而不是仅仅说“未公开” - 收件人“,所以我想知道是否有人有更好的方法。
答案 0 :(得分: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";
}
}
亚马逊在commands feature下的开发者指南中记录了这些示例。
答案 1 :(得分:0)
我过去使用PHP和AWS完成的工作是在数据库中设置一个电子邮件队列,并让多个进程处理它以发送电子邮件。
或者,您可以在多个线程中发送电子邮件(在PHP中可能非常简单)。这是一个带有aws-sdk-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)