Intereting Posts
ui автозаполнение форматирование <li> результаты по 2 строкам Можно ли определить историю посещения посетителя с помощью JavaScript или PHP? mysql-php INSERT INTO не работает PHP-почта возвращает TRUE, но электронная почта не отправляется Закрывает ли PHP файл после того, как обработчик файлов собран из мусора? Совместное использование сеанса через несколько доменов на одном сервере Запустить PHP-скрипт в фоновом режиме при запуске / перезагрузке Apache (Windows Server) разбиение на страницы не изменяет страницу Странные символы в пути require_once () в трассировке стека Изменение сайта Codeigniter с сайта http на https – не работает Неустранимая ошибка: вызов неопределенной функции session_register () Как создать канал JSON из коллекции MongoDB Internet Explorer 8 не передает cookie сеанса для запроса ajax Показать результат на той же странице, что и форма в codeigniter, неопределенная переменная Laravel Auth: попытка () не будет продолжаться.

PHPMailer вызывает 504 тайм-аута на моем сервере Digital Ocean, используя nginx

Я устанавливаю возможность отправки электронной почты на одной странице 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 без успеха.