Amazon AWS:通过 SES 发送电子邮件速度超慢

Amazon AWS: Sending email via SES beyond painfully slow

我们有一个基于 PHP 的应用程序(运行 在 t2.medium 实例上)通过 SES 发送电子邮件(仅限选择加入的用户)并且两者都位于同一地区。该应用程序于今年早些时候推出,电子邮件发送功能正常运行了几个月。我们最近切换到通过 mailgun 发送(因此我们可以获得有关我们遇到的问题的更多信息),但我们没有更改任何 SES 设置。 (注意:我们的帐户获准每小时发送 50,000 封电子邮件 - 我们正在尝试发送数百封电子邮件。)

我为我们的应用程序编写了一个辅助实用程序,该实用程序还可以发送电子邮件,因此我决定继续将 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 秒。 (请注意,所有电子邮件均已收到。)

这到底是怎么回事?更重要的是,我该如何解决这个问题?

这不是 SES 变慢了。这是对 EC2 本身的记录,有意限制,有两种可能的解决方法。

来自 SES 文档:

Important

Amazon Elastic Compute Cloud (Amazon EC2) throttles email traffic over port 25 by default. To avoid timeouts when sending email through the SMTP endpoint from EC2, use a different port (587 or 2587) or fill out a Request to Remove Email Sending Limitations to remove the throttle.

http://docs.aws.amazon.com/ses/latest/DeveloperGuide/smtp-connect.html