2016-07-17 4 views
0

У нас есть приложение на основе PHP (работает на экземпляре t2.medium), которое отправляет электронные письма (только для пользователей с поддержкой) через SES, и оба они расположены в одном регионе , Приложение было запущено в начале этого года, и отправка писем работала должным образом в течение нескольких месяцев. Недавно мы перешли на отправку через mailgun (чтобы мы могли получить дополнительную информацию о проблеме, с которой мы столкнулись), но мы не изменили никаких настроек SES. (Примечание: наша учетная запись одобрена для отправки 50 тыс. Писем в час - мы пытаемся отправить несколько сотен.)Amazon AWS: Отправка электронной почты через SES после мучительно медленного

Я написал вспомогательную утилиту для нашего приложения, которая также отправляет электронные письма, и я решил продолжить использовать 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 секунд для отправки. (Обратите внимание, что все электронные письма были получены.)

Что происходит, черт возьми? Что еще более важно, как мне решить проблему?

+2

Это звучит, как вы в настоящее время скорость ограничена. Вы абсолютно уверены, что 'us-west-2' является регионом, в котором вы были одобрены для отправки 50 тыс. Писем в час? –

ответ

3

Это не SES, работающий медленно. Это документированное, преднамеренное ограничение самого EC2, с двумя возможными обходными решениями.

Из документации СЭС:

Важно

Amazon Elastic Compute Cloud (Amazon EC2) дроссели трафика электронной почты через порт 25 по умолчанию. Чтобы избежать тайм-аутов при отправке электронной почты через конечную точку SMTP из EC2, используйте другой порт (587 или 2587) или заполните запрос об удалении адресов электронной почты для удаления дроссельной заслонки.

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

+0

Michael - Спасибо за это предложение! Я добавил строку $ mail-> Port = 587, и проблема решена. Я скопировал этот код из другого сценария, который я написал некоторое время назад, и ранее не замечал проблему. Но в этом случае было отправлено только несколько писем. – GRoston

+0

Спасибо, его работа в моем случае. –

+0

Это было очень полезно. Было бы легче отладить, если они просто заблокировали порт 25 – CrowbarKZ

Смежные вопросы