我们有一个基于PHP的应用程序(在t2.medium实例上运行),它通过SES发送电子邮件(仅限选择用户),两者都位于同一区域。该应用程序于今年早些时候推出,发送电子邮件已正常工作数月。我们最近切换到通过mailgun发送(因此我们可以获得有关我们遇到的问题的更多信息),但我们没有更改任何SES设置。 (注意:我们的帐户被批准每小时发送5万封电子邮件 - 我们正在尝试发送数百封电子邮件。)
我为我们的应用程序编写了一个附属实用程序,它也发送电子邮件,我决定继续使用SES来实现此实用程序。下面是代码的简化版本。请注意,我保持此测试程序的布局尽可能接近实际实用程序(显然该实用程序会进行数据库调用等)。
<?php
require_once dirname(__FILE__) . '/PHPMailer-master/PHPMailerAutoload.php';
$mail = new PHPMailer;
$mail->isSMTP();
$mail->Host = 'email-smtp.us-west-2.amazonaws.com';
$mail->SMTPAuth = true;
$mail->Username = 'my_user_name';
$mail->Password = 'my_password';
$mail->SMTPSecure = 'tls';
$mail->From = 'from_sender';
$mail->FromName = 'WebTeam';
$mail->IsHTML(true);
$oldt = microtime(true);
while(true) {
$first_name = 'first_name';
$email = 'to_recipient';
$strCnt = 'many';
$subject = "Lots of great new things to buy";
$body = "<p>" . $first_name . ",</p>";
$body = $body . "<p>You have ' . $strCnt . ' new things to buy waiting for you. Don't let them slip by! ";
$body = $body . "Click <a href='http://fake_url.com'>here</a> to see them!</p>";
$body = $body . "<p>The Web Team</p>";
$mail->addAddress($email);
$mail->Subject = $subject;
$mail->Body = $body;
$newt = microtime(true);
echo 'email build done: ' . $newt - $oldt . PHP_EOL;
$oldt = $newt;
if(!$mail->send(true)) {
echo 'error sending email: ' . $mail->ErrorInfo . PHP_EOL;
} else {
$newt = microtime(true);
echo 'email sent: ' . $newt - $oldt . PHP_EOL . PHP_EOL;
$oldt = $newt;
}
$mail->ClearAllRecipients(); // added line
}
?>
非常简单!
但是,这就是问题。当我第一次运行时,第一封电子邮件发送时间不到一秒钟,第二封电子邮件需要31秒,第三封电子邮件需要191秒。然后我添加了另外一行代码并再次运行程序。这一次,第一封电子邮件需要63秒才能发送。大约20分钟后,我第三次运行程序。这一次,前三封电子邮件的发送时间不到一秒钟,但第四封电子邮件则需要191秒。然后我第五次运行它,第一封电子邮件需要135秒才能发送。 (请注意,所有电子邮件都已收到。)
到底发生了什么事?更重要的是,我该如何解决这个问题?
答案 0 :(得分:4)
这不是SES慢。这是对EC2本身的记录性故意限制,有两种可能的解决方法。
来自SES文档:
重要强>
默认情况下,Amazon Elastic Compute Cloud(Amazon EC2)会限制端口25上的电子邮件流量。要避免从EC2通过SMTP端点发送电子邮件时出现超时,请使用其他端口(587或2587)或填写“删除电子邮件发送限制请求”以删除限制。
http://docs.aws.amazon.com/ses/latest/DeveloperGuide/smtp-connect.html