Отправка почты в PHP выдает 504 Gateway Time-out - PullRequest
0 голосов
/ 02 марта 2019

Я на Ubuntu VM.

У меня есть этот PHP

<?php

# --------------------------------------------------------------------------------
# Goal    : send an email
# Run     : curl 45.55.88.57/code/mail.php  | php


$to      = 'email@gmail.com';
$subject = '';
$message = 'hello';
$headers = 'From: john@gmail.com' . "\r\n" .
    'Reply-To: john@gmail.com' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);
?>

Я запустил это:

curl 45.55.88.57/code/mail.php  | php

Я получил это

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   176  100   176    0     0      2      0  0:01:28  0:01:00  0:00:28    45
<html>
<head><title>504 Gateway Time-out</title></head>
<body bgcolor="white">
<center><h1>504 Gateway Time-out</h1></center>
<hr><center>nginx</center>
</body>
</html>

Это мой коднеправильно или что-то не так с моей виртуальной машиной?

Я не получаю никаких писем.

Ответы [ 6 ]

0 голосов
/ 15 марта 2019

Возможно, у вас не запущен агент MTA (Mail Transfer Agent).Проблема может быть решена несколькими способами.Если вы хотите использовать адрес электронной почты с внешнего сервера, проще всего установить и настроить несколько mta, например, очень простой msmtp.

0 голосов
/ 14 марта 2019

Вы можете следовать инструкциям по использованию бесплатного SMTP-сервера из Google

ШАГ 1:

Разрешить доступдля менее безопасных приложений Less secure app access

ШАГ 2: Не используйте двухфакторную аутентификацию для доступа к вашей учетной записи Google.
ШАГ 3: Настройка POP

  1. На вашем компьютере откройте Gmail.В правом верхнем углу нажмите Настройки

  2. Настройки.Нажмите Настройки.Нажмите на вкладку Пересылка и POP / IMAP.В

  3. в разделе «Загрузка POP» выберите «Включить POP для всей почты» или «Включить»

  4. POP для почты, которая приходит с этого момента.Внизу страницы

  5. нажмите Сохранить изменения.

ШАГ 3: Внесите изменения в свой почтовый клиент для сервера исходящей почты (SMTP)

smtp.gmail.com Требуется SSL: Да Требуется TLS: Да (если доступно) Требуется аутентификация: Да Порт для TLS /STARTTLS: 587

*** Если вы используете Gmail со своей рабочей или учебной учетной записью, уточните у своего администратора правильную конфигурацию SMTP.

Вы можете перейти по ссылке: Сообщения Gmail на других почтовых клиентах, использующие POP

0 голосов
/ 14 марта 2019

Вы можете использовать PHPMailer.Это очень просто в использовании.https://github.com/PHPMailer/PHPMailer
Это стандартный код для отправки электронного письма: (я скопировал его)

$mail->SMTPDebug = 2;                                 // Enable verbose debug output
$mail->isSMTP();                                      // Set mailer to use SMTP
$mail->Host = 'smtp1.example.com;smtp2.example.com';  // Specify main and backup SMTP servers
$mail->SMTPAuth = true;                               // Enable SMTP authentication
$mail->Username = 'user@example.com';                 // SMTP username
$mail->Password = 'secret';                           // SMTP password
$mail->SMTPSecure = 'tls';                            // Enable TLS encryption, `ssl` also accepted
$mail->Port = 587;                                    // TCP port to connect to

//Recipients
$mail->setFrom('from@example.com', 'Mailer');
$mail->addAddress('joe@example.net', 'Joe User');     // Add a recipient
$mail->addAddress('ellen@example.com');               // Name is optional
$mail->addReplyTo('info@example.com', 'Information');
$mail->addCC('cc@example.com');
$mail->addBCC('bcc@example.com');

//Attachments
$mail->addAttachment('/var/tmp/file.tar.gz');         // Add attachments
$mail->addAttachment('/tmp/image.jpg', 'new.jpg');    // Optional name

//Content
$mail->isHTML(true);                                  // Set email format to HTML
$mail->Subject = 'Here is the subject';
$mail->Body    = 'This is the HTML message body <b>in bold!</b>';
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

$mail->send();

Дополнительная информация:
https://github.com/PHPMailer/PHPMailer/wiki/Tutorial
https://www.youtube.com/watch?v=YtNraQxUTM0 https://www.sitepoint.com/sending-emails-php-phpmailer/

Дайте мне знать, если это работает.
PS.Если вы хотите выяснить, почему ваша почта не находится в вашем почтовом ящике Gmail: ваши HTTP-заголовки вашей почты () не защищены.Если ваши заголовки не защищены, может быть вероятность внедрения заголовка.
Дополнительная информация:
https://mediatemple.net/community/products/dv/204643950/understanding-an-email-header
https://www.gracefulsecurity.com/http-header-injection/

0 голосов
/ 13 марта 2019

не забудьте установить настройки Gmail.следуйте этому руководству для настройки Google SMTP.

0 голосов
/ 11 марта 2019

У меня была эта проблема пару раз, и если вы работаете в своем доме, ваш провайдер может заблокировать порт 25.

Я видел, что вы находитесь в США, например, xfinity, att и другие.блокируют порт 25. Этот текст скопирован с их веб-страницы Xfinity

Со страницы Xfinity
Почему порт 25 для отправки электронной почты не поддерживается?

Email is used for important communications and Comcast wants to ensure that these
communications are as secure and as private as possible. As such, 
Comcast does not support port 25 for the transmission of email by our 
residential Internet customers. Much of the current use of port 25 is by 
computers that have been infected by malware and are sending spam 
without the knowledge of the users of those computers. 

ATT делает то же самое, если вы Google, вы можете найти много сообщений на форуме по этому вопросу.

Как проверить
Делаем телнет против разных почтовых серверов.Пример.

telnet gmail.com 25
telnet yahoo.com 25
telnet hotmail.com 25

Это позволит проверить, не блокируется ли ваше исходящее соединение.Некоторые интернет-провайдеры просто отбрасывают трафик, и вы получаете ошибку тайм-аута, другие могут перенаправить трафик в никуда, и вы получите время ожидания шлюза.Это обычный подход для устранения DoD-атак и перегрузки сервера маршрутизатора.

Вам также следует проверить входящее соединение, почти все почтовые серверы теперь подключаются обратно, чтобы проверить, действителен ли ваш домен, и соответствуют вашему IP-адресу, еслине будет отброшено или отправлено в папку нежелательной почты или спама.Попробуй телнет извне на твой ip адрес.Также, если вы используете NAT или PAT, у вас также должны быть соответствующие сопоставления портов с вашим внутренним IP-адресом.

Для этого теста вы можете использовать внешний сервер или просто онлайн-сервис, такой как сканер портов nmap.https://hackertarget.com/nmap-online-port-scanner/


Если не работали домашний пользователь / сервер и telnet out, или предположение о том, что порт 25 блокирован, неверно.

Я проверю это:
1. Разрешение DNS nslookup google.com и сохранение адресов ipv4 и ipv6
2. Проверка настроек IPv4 и ipv6
+ Отключение ipv6 (Это также может сделать тайм-ауты шлюза, так как не достигают хоста ipv6 и так как smtp имеют большой тайм-аут, шлюзистекает раньше) 3. Телнет на IPv4-адрес

Надеюсь, это поможет.

0 голосов
/ 10 марта 2019

В вашей виртуальной машине просто запустите тестовый php-файл со следующим кодом на вашей виртуальной машине

<?php
  echo phpinfo();
?>

Если вы все еще получаете ту же ошибку, то это результат некоторого уровня сервера перед вашей виртуальной машиной.

Но если вы видите другой вывод, то вы должны увидеть информацию о конфигурации PHP.

В конфигурации найдите «Загруженный файл конфигурации», который даст вам точный путь вашего phpфайл конфигурации .ini.

В php.ini проверьте настройки вашей почты (http://php.net/manual/en/mail.configuration.php#ini.smtp),, как упомянуто Tuckbros.

Убедитесь, что на вашем сервере установлен sendmail и настроенКонфигурация 'sendmail_path' в php.ini правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...