我有一个向 Amazon SES 发送电子邮件的在线软件。目前,我有一个 cron 作业,它通过 SMTP 使用 phpmailer 发送电子邮件以发送消息。目前我必须将发送限制设置为每分钟大约 300 次,以确保我的服务器不会超时。我们看到了增长,最终我想发送到 10,000 或更多。
有没有更好的方法发送到 Amazon SES,或者其他人都这样做,但只有更多的服务器运行工作负载?
提前致谢!
我有一个向 Amazon SES 发送电子邮件的在线软件。目前,我有一个 cron 作业,它通过 SMTP 使用 phpmailer 发送电子邮件以发送消息。目前我必须将发送限制设置为每分钟大约 300 次,以确保我的服务器不会超时。我们看到了增长,最终我想发送到 10,000 或更多。
有没有更好的方法发送到 Amazon SES,或者其他人都这样做,但只有更多的服务器运行工作负载?
提前致谢!
您可以尝试使用适用于 PHP 的 AWS 开发工具包。您可以通过 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
和朋友来使其更强大。
您需要使用此代码进行很多微调,但您可能能够实现更高的电子邮件吞吐量。
如果有人在寻找这个答案,它已经过时了,你可以在这里找到新的文档: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 命令也可以做同样的事情
谢谢您的回答。这是一个很好的起点。@杰里米林德布洛姆
我现在的问题是我无法让错误处理工作。catch()-Block 工作正常并且在其中
$successfulCommands
返回所有带有状态代码的成功响应,但仅在发生错误时。例如沙盒模式中的“未验证地址”。就像 catch() 应该可以工作。:)
try-Block 中的$successfulCommands只返回:
SplQueue Object
(
[flags:SplDoublyLinkedList:private] => 1
[dllist:SplDoublyLinkedList:private] => Array
(
)
)
我无法弄清楚如何使用状态代码等从亚马逊获得真正的响应。