亚马逊AWS:通过SES发送电子邮件的速度超慢

GRo*_*ton 0 email amazon-web-services amazon-ses

我们有一个基于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
  }
?>
Run Code Online (Sandbox Code Playgroud)

非常简单!

但是,这是磨擦。第一次运行时,第一封电子邮件用了不到一秒钟的时间发送,第二封电子邮件用了31秒,而第三封电子邮件则需要191秒。然后,我又添加了一行代码,并再次运行了该程序。这次,第一封电子邮件花了63秒发送。大约20分钟后,我第三次运行了程序。这次,前三封电子邮件的发送时间不到一秒钟,而第四封电子邮件则花费了191秒。然后,我第五次运行它,第一封电子邮件花了135秒发送。(请注意,已收到所有电子邮件。)

到底他妈发生了什么?更重要的是,我该如何解决该问题?

Mic*_*bot 5

这并不是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