Я устанавливаю возможность отправки электронной почты на одной странице PHP на моем сервере. Я хочу иметь возможность указать учетную запись Gmail для отправки, поэтому я использую PHPMailer. Однако каждый раз, когда я загружаю страницу, которая отправляет электронное письмо, я получаю ошибку тайм-аута 504 шлюза примерно через 30 секунд. В конце концов, письмо отправляется (я получаю его примерно через 5 минут), но это нормально? Это очень простое текстовое электронное письмо.
Это мой код для отправки электронного письма
require '../html/lib/phpmailer/PHPMailerAutoload.php';//Create a new PHPMailer instance
$mail = new PHPMailer;
//Tell PHPMailer to use SMTP
$mail->isSMTP();
//Enable SMTP debugging
// 0 = off (for production use)
// 1 = client messages
// 2 = client and server messages
$mail->SMTPDebug = 2;
//Ask for HTML-friendly debug output
$mail->Debugoutput = 'html';
//Set the hostname of the mail server
$mail->Host = 'smtp.gmail.com';
//Set the SMTP port number - 587 for authenticated TLS, a.k.a. RFC4409 SMTP submission
$mail->Port = 587;
//Set the encryption system to use - ssl (deprecated) or tls
$mail->SMTPSecure = 'tls';
//Whether to use SMTP authentication
$mail->SMTPAuth = true;
//Username to use for SMTP authentication - use full email address for gmail
$mail->Username = "[email protected]";
//Password to use for SMTP authentication
$mail->Password = "pw";
//Set who the message is to be sent from
$mail->setFrom('[email protected]', 'First Last');
//Set an alternative reply-to address
//$mail->addReplyTo('@example.com', 'First Last');
//Set who the message is to be sent to
$mail->addAddress('[email protected]', 'recip');
$mail->Subject = 'PHPMailer GMail SMTP test 2';
//Read an HTML message body from an external file, convert referenced images to embedded,
//convert HTML into a basic plain-text alternative body
//$mail->msgHTML(file_get_contents('contents.html'), dirname(__FILE__));
//Replace the plain text body with one created manually
$mail->Body = 'This is another plain-text message body';
//Attach an image file
//$mail->addAttachment('images/phpmailer_mini.png');
//send the message, check for errors
if (!$mail->send()) {
echo "Mailer Error: " . $mail->ErrorInfo;
} else {
echo "Message sent!";
}
Таймауты SMTP довольно длинные (не менее 5 минут). Получаемое значение 504 объясняется тем, что время ожидания между nginx и вашим PHP cgi (я полагаю, вы используете FPM) короче, поэтому к тому времени, когда PHP генерирует ошибку, nginx уже разорвал соединение, поэтому вы не получая обратной связи.
Вполне вероятно, что это проблема DNS или брандмауэра на вашем хосте — проверьте документы по устранению неполадок.
Digital Ocean сообщает в своем центре поддержки, как таким службам, как smtp, назначать приоритеты для соединений через IPv4, сохраняя при этом доступную функциональность IPv6 для вашей капли.
Вы можете отдавать приоритет IPv4-адресам по сравнению с IPv6, чтобы вы могли
продолжать отправлять электронную почту, не отключая IPv6. Вы бы сделали это
отредактировав файл /etc/gai.conf в Droplet и удалив комментарий
(#) из следующей строки:Конфигурация по умолчанию: #precedence :: ffff: 0: 0/96 100
Конфигурация с приоритетом IPv4: приоритет :: ffff: 0: 0/96 100
Это было проверено и подтверждено, что я работал над проблемой PHPMailer, где время ожидания запроса истекло (504 Gateway Time-out), но когда почта все еще в конечном итоге доставлялась (Ubuntu 16.04 LEMP).
Это связано с тем, что Ngninx разрывает соединение с PHP-FPM, пока php-скрипт все еще работает в фоновом режиме, пытаясь разрешить SMTP-адрес IPv6, прежде чем, наконец, перейти к IPv4 в случае неудачи.