2016-07-17 3 views
0

SES를 통해 전자 메일을 보내는 PHP 기반 응용 프로그램 (t2.medium 인스턴스에서 실행)과 둘 다 같은 지역에 있습니다 . 이 앱은 올해 초에 출시되었으며 이메일을 보내는 것은 몇 달 동안 제대로 작동했습니다. 우리는 최근 mailgun을 통해 전송하도록 전환 했으므로 (우리가 가진 문제에 대한 자세한 정보를 얻을 수는 있지만) SES 설정을 변경하지 않았습니다. (참고 : 시간당 50,000 개의 이메일을 보내도록 승인되었습니다.)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 
    } 
?> 

(유틸리티가 데이터베이스 호출 등을 만드는 것을 그것은 명백해야한다) 나는 가능한 한 실제 유틸리티에 가까운이 테스트 프로그램의 레이아웃을 유지합니다!

하지만 여기에는 문지름이 있습니다. 처음 실행했을 때 첫 번째 이메일의 전송 시간은 1 초 미만이었고 두 번째 이메일의 전송 시간은 31 초 였고 세 번째 이메일의 전송 시간은 191 초였습니다. 그런 다음 한 줄의 코드를 추가하고 프로그램을 다시 실행했습니다. 이번에는 첫 번째 이메일을 보내는 데 63 초가 걸렸습니다. 약 20 분 후에 프로그램을 세 번 실행했습니다. 이번에 처음 세 개의 이메일은 각각 1 초 이내에 보내졌지만 네 번째 이메일은 191 초가 걸렸습니다. 나는 다섯 번째 시간을 뛰었으며 첫 번째 이메일은 보내는 데 135 초가 걸렸습니다. (모든 이메일을 수신했음을 유의하십시오.)

도대체 무슨 일이 벌어지고 있습니까? 더 중요한 것은 어떻게 문제를 해결할 수 있습니까?

+2

소리가 난다. 'us-west-2'는 시간당 50k 개의 이메일을 전송하도록 승인받은 지역입니까? –

답변

3

이것은 느린 SES가 아닙니다. 이는 EC2 자체에 대한 문서화되고 고의적 인 제한 사항이며 두 가지 가능한 해결 방법이 있습니다. SES는 문서에서

:

중요

아마존 엘라스틱 컴퓨 트 클라우드 (아마존 EC2)는 기본적으로 포트 25을 통해 이메일 트래픽을 조절하는. EC2에서 SMTP 끝점을 통해 전자 메일을 보낼 때 제한 시간을 피하려면 다른 포트 (587 또는 2587)를 사용하거나 전자 메일 보내기 제한 요청을 작성하여 스로틀을 제거하십시오. 당신은 속도가 제한되고있는 것처럼

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

+0

Michael -이 제안에 감사드립니다! $ mail-> Port = 587 줄을 추가하고 문제가 해결되었습니다. 내가 작성한 다른 스크립트에서이 코드를 복사했고 이전에 문제를 발견하지 못했습니다. 그러나이 경우 몇 개의 이메일 만 전송되었습니다. – GRoston

+0

고마워, 내 경우에 그 작품. –

+0

이것은 매우 도움이되었습니다. 방금 포트 25를 차단 한 경우 디버그하기 쉬울 것입니다. – CrowbarKZ