Я могу отправлять электронную почту через свой веб-сервер со своего компьютера (с помощью Thunderbird), но не с моего веб-сайта с помощью phpmailer. Как ни странно, когда я запускаю «telnet mail.myserver.com 25» на сервере, он говорит «соединение отклонено», то же самое сообщение об ошибке, которое я получаю с phpmailer (ошибка 111 - «Соединение отказано»). Однако электронные письма отправляются нормально через Thunderbird (который также настроен на порт 25, только для использования зашифрованных паролей), я также могу легко подключиться с помощью telnet с моего компьютера на почтовый сервер. Есть идеи, в чем может быть причина этой странной проблемы? Я использую последнюю версию phpmailer, а на сервере CentOS7 работает php 5.6.18.
Вывод netstat -an | grep 25:
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN
tcp6 0 0 :::25 :::* LISTEN
Конфигурация Phpmailer:
require_once("./stuff/phpmailer/PHPMailerAutoload.php");
$mail = new PHPMailer();
$mail->IsSMTP();
$mail->Host = $SMTPHOST;
$mail->SMTPAuth = true;
$mail->Port = 25;
$mail->SMTPDebug = 2;
$mail->Username = $SMTPUSER;
$mail->setFrom($email,$name);
$mail->AddAddress($AdminMail);
$mail->Subject = "Here is the email";
$mail->Body = "I am an email";
if(!$mail->send()){..}
Кстати, PHP-метод mail () тоже работает, кажется, только SMTP вызывает проблему. Поэтому, когда я меняю $ mail-> IsSMTP () на $ mail-> IsMail (), он работает.
Кажется, вы используете CentOS 7. Возможно, SELinux не позволяет phpmailer отправлять почту, поскольку он блокирует httpd
исходящие соединения по умолчанию.
Я предлагаю включить httpd_can_network_connect
логическое:
# setsebool -P httpd_can_network_connect=1
Это разрешит все исходящие соединения, сделанные httpd
. К сожалению, я не приобрел достаточных знаний о SELinux, поэтому я не могу ответить, как ограничить разрешенные исходящие соединения только портами SMTP (25, 465 и 587).
Если веб-сервер и почтовый сервер - это один и тот же компьютер, вы можете настроить PHPMailer для отправки сообщений с помощью локального sendmail
двоичный и включите httpd_can_sendmail
логическое вместо:
# setsebool -P httpd_can_sendmail=1
Я предполагаю, что mail.myserver.com является одновременно SMTP-сервером и веб-сервером, на котором запущен phpmailer, если нет, то это не ваша проблема.
Похоже, ваш SMTP-сервер не прослушивает localhost, а только его сетевой IP. Если это так, вам необходимо настроить ваш MTA для прослушивания на локальном хосте в дополнение к его внешнему интерфейсу. Это будет отличаться в зависимости от вашего MTA.
Для postfix (MTA по умолчанию для CentOS7) в main.cf установите что-то вроде этого:
inet_interfaces = all
или если вы не хотите слушать на всех интерфейсах
inet_interfaces = 1.2.3.4, 127.0.0.1, [::1]
и перезапустите postfix.