我可以通过我的计算机(使用 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