我在用着php邮件发送器使用 Google 应用地址/SMTP 发送购买确认信息。整个过程在开发机上运行良好,但现在已上线,似乎我使用的端口 (465) 已被阻止。
因此我使用以下命令编辑 iptables:
-A INPUT -p tcp -dport 465 -j ACCEPT
-A INPUT -p tcp -sport 465 -j ACCEPT
我的理解是,这允许 465 上的入站和出站连接(如果我错了,请纠正我)。重新启动 iptables 后:
iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:465
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:465
但是我仍然收到来自 phpMailer 的调试信息“无法连接到服务器:权限被拒绝”。据我所知,这通常表示端口已关闭,&显然确实如此。
关于如何进一步调试,有什么提示吗?任何帮助都将不胜感激。
如果有帮助的话,这里是 php:
$mail = new PHPMailer();
$mail->IsSMTP();
$mail->SMTPDebug = 1; //!DEV
$mail->SMTPAuth = true;
$mail->SMTPSecure = 'ssl';
$mail->Host = 'smtp.gmail.com';
$mail->Port = 465;
$mail->Username = $emailAddress;
$mail->Password = $emailPassword;
$mail->SetFrom($emailAddress, 'PURCHASE ORDER');
$mail->AddAddress($customerEmail);
$mail->AddAddress($salesEmail);
$mail->Subject = $subject;
$mail->Body = $body;
$mail->Send() or die('Error: ' . $mail->ErrorInfo);
*编辑:邮件程序在开发服务器上完美运行 - 有什么建议可以比较不同之处吗?相同的操作系统,相同的 php... 我被难住了!
答案1
你已经告诉服务器接受传入端口 465 上的连接,但你还告诉它连接到 smtp.gmail.com,这是一个出站联系。
您需要打开相同的端口,但是在 OUTPUT 链上而不是 INPUT 链上:
-A OUTPUT -p tcp --dport 465 -j ACCEPT
要从终端编辑,命令如下:
iptables -A OUTPUT -p tcp --dport 465 -j ACCEPT
答案2
防火墙问题应该导致“连接已重置”或“连接超时”错误消息。PHPMailer可能会给你一个“权限被拒绝”的错误信息,而不是上述两个错误信息中的一个,但那将是一个错误信息(这不是我第一次看到糟糕的错误消息。)
如果错误消息“无法连接到服务器:权限被拒绝”有帮助,则表明您已safe_mode
打开或不允许在您的中打开套接字php.ini
。
这也可能是由 SELinux 引起的。我对它不够熟悉,无法告诉您该怎么做才能确定是否是这种情况或如何修复它。