我可以从外部发送电子邮件,但不能使用 phpmailer(错误 111)

我可以从外部发送电子邮件,但不能使用 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() 时,它就可以正常工作。

答案1

我假设 mail.myserver.com 既是 SMTP 服务器,又是运行 phpmailer 的 Web 服务器,如果不是,那么这不是您的问题。

听起来您的 SMTP 服务器没有监听本地主机,而只监听其网络 IP。如果是这样,您需要配置您的 MTA,使其除了监听外部接口外,还监听本地主机。这将因您的 MTA 而异。

对于 postfix (CentOS7 的默认 MTA),在 main.cf 中设置如下内容:

inet_interfaces = all

或者如果你不想监听所有接口

inet_interfaces = 1.2.3.4, 127.0.0.1, [::1]

并重新启动 postfix。

答案2

您似乎使用的是 CentOS 7。也许 SELinux 阻止 phpmailer 发送邮件,因为它httpd默认阻止传出连接。

我建议启用httpd_can_network_connect布尔值:

# setsebool -P httpd_can_network_connect=1

这将允许所有通过 发出的传出连接httpd。不幸的是,我没有获得足够的 SELinux 知识,所以我无法回答如何将允许的传出连接限制为仅 SMTP 端口(25、465 和 587)。

如果 Web 服务器和邮件服务器是同一台机器,则可以配置 PHPMailer 使用本地sendmail二进制文件发送消息并启用httpd_can_sendmail布尔值:

# setsebool -P httpd_can_sendmail=1

相关内容