Назад | Перейти на главную страницу

Я могу отправлять электронную почту извне, но без использования phpmailer (ошибка 111)

Я могу отправлять электронную почту через свой веб-сервер со своего компьютера (с помощью 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.