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

时间:2016-07-17 21:37:48

标签: amazon-web-services email 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
  }
?>

非常简单!

但是,这就是问题。当我第一次运行时,第一封电子邮件发送时间不到一秒钟,第二封电子邮件需要31秒,第三封电子邮件需要191秒。然后我添加了另外一行代码并再次运行程序。这一次,第一封电子邮件需要63秒才能发送。大约20分钟后,我第三次运行程序。这一次,前三封电子邮件的发送时间不到一秒钟,但第四封电子邮件则需要191秒。然后我第五次运行它,第一封电子邮件需要135秒才能发送。 (请注意,所有电子邮件都已收到。)

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

1 个答案:

答案 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