2016-07-17 1 views
0

Nous avons une application basée sur PHP (fonctionnant sur une instance t2.medium) qui envoie des e-mails (uniquement aux utilisateurs connectés) via SES et les deux sont situés dans la même région . L'application a été lancée plus tôt cette année et l'envoi de courriels a fonctionné correctement pendant des mois. Nous avons récemment passé à l'envoi via mailgun (afin que nous puissions obtenir plus d'informations sur un problème que nous avions), mais nous n'avons modifié aucun de nos paramètres SES. (Note: Notre compte est approuvé pour envoyer 50k emails par heure - nous essayons d'envoyer plusieurs centaines.)Amazon AWS: envoi d'e-mails via SES au-delà de la lenteur

J'ai écrit un utilitaire auxiliaire pour notre application, qui envoie également des e-mails, et j'ai décidé de continuer à utiliser SES pour cette utilitaire. Une version simplifiée du code suit. Notez que je gardais la mise en page de ce programme d'essai près de l'utilité réelle que possible (et il devrait être évident que l'utilitaire fait un appel de base de données, etc.)

<?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 
    } 
?> 

est très simple!

Mais, voici le frotter. Quand j'ai couru ceci la première fois, le premier email a pris moins d'une seconde à envoyer, le second a pris 31 secondes, et le troisième a eu besoin de 191 secondes. J'ai ensuite ajouté une ligne de code supplémentaire et j'ai exécuté à nouveau le programme. Cette fois-ci, le premier e-mail a pris 63 secondes à envoyer. Après environ 20 minutes, j'ai couru le programme une troisième fois. Cette fois-ci, les trois premiers courriels ont été envoyés en moins d'une seconde chacun, mais le quatrième a duré 191 secondes. J'ai alors couru une cinquième fois, et le premier email a pris 135 secondes pour envoyer. (Notez que tous les courriels ont été reçus.)

Que diable se passe-t-il? Plus important encore, comment puis-je résoudre le problème?

+2

On dirait que vous êtes taux limité. Êtes-vous absolument certain que 'us-west-2' est la région dans laquelle vous avez été autorisé à envoyer 50k emails par heure? –

Répondre

3

Ce SES n'est pas lent. Ceci est une limitation délibérée documentée sur EC2 lui-même, avec deux solutions de contournement possibles.

De la documentation SES:

Important

Amazon Elastic Compute Cloud (Amazon EC2) étrangle le trafic e-mail sur le port 25 par défaut. Pour éviter les délais d'attente lors de l'envoi d'e-mails via le point de terminaison SMTP à partir de EC2, utilisez un port différent (587 ou 2587) ou remplissez une demande de suppression des restrictions d'envoi de courrier électronique pour supprimer la limitation.

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

+0

Michael - Merci pour cette suggestion! J'ai ajouté la ligne $ mail-> Port = 587, et le problème a été résolu. J'avais copié ce code à partir d'un autre script que j'avais écrit il y a quelques temps et je n'avais pas remarqué le problème auparavant. Mais, dans ce cas, seuls quelques e-mails ont été envoyés. – GRoston

+0

Merci, son travail dans mon cas. –

+0

C'était très utile. Serait plus facile de déboguer s'ils bloquaient juste le port 25 – CrowbarKZ