Я устанавливаю возможность отправки электронной почты на одной странице PHP на моем сервере. Я хочу, чтобы указать учетную запись gmail для отправки, поэтому я использую PHPMailer. Тем не менее, каждый раз, когда я загружаю страницу, отправившую электронное письмо, я получаю ошибку таймаута 504 Gateway примерно через 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, aka 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 = "user@gmail.com"; //Password to use for SMTP authentication $mail->Password = "pw"; //Set who the message is to be sent from $mail->setFrom('from@gmail.com', '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('recip@gmail.com', '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 без успеха.