【发布时间】:2018-04-28 10:14:53
【问题描述】:
我有一个 Plesk centos 6 云服务器,它在两个不同的 IP 上运行两个域。其中一个域的子域通过 phpMailer 发送电子邮件,通过指定的 smtp 服务器,在手头的情况下为 gmail。
虽然我不认为问题在于或可以在执行 phpMailer 的级别上得到缓解,但这里有一个示例来演示:
$mail = new PHPMailer;
$mail->SMTPDebug = false;
$mail->isSMTP();
$mail->Host = "smtp.gmail.com";
$mail->SMTPAuth = true;
$mail->CharSet = 'UTF-8';
$mail->Username = $GLOBALS['gmail'];
$mail->Password = $GLOBALS['email_password'];
$mail->SMTPSecure = "tls";
$mail->Port = 587;
$mail->From = $GLOBALS['gmail'];
$mail->FromName = $GLOBALS['sender'];
$mail->addReplyTo($GLOBALS['gmail'], "Reply");
$mail->isHTML(true);
$mail->addAddress($this->data['Email']);
$mail->Subject = "...";
$mail->Body = "...";
$mail->Send();
现在我在 postmaster.live.com 的智能网络数据服务中看到,由于垃圾邮件的证据,这两个 IP 都已被阻止。
调查我发现我怀疑是问题 - 在电子邮件标头的 Received 部分中,发送子域通过名称正确识别,但发送 IP 地址是另一个域的 IP 地址.像这样:
收到:来自 正确的 subdomain.domain.com(不正确的反向 DNS 域 [不正确的 IP])由 smtp.gmail.com .. .
似乎 phpMailer 从错误的 IP 地址连接到 smtp.gmail.com,结果反向 DNS 查找解析为另一个域的查找 - 这很可能是 Microsoft 已经采取的措施。
在 Plesk(Tools & Tettings -> IP Addresses)中,应该是正确域的 IP 首先列出,并且以粗体显示,表明它应该是默认值。
更新: 现在我尝试了:
$options = array(
'socket' => array(
'bindto' => '**the required IP**',
),
);
$socket_context = stream_context_create($options);
$this->smtp_conn = stream_socket_client(
$host . ":" . $port, $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, $socket_context
);
这产生了以下错误,将问题范围缩小到无法绑定与域关联的 IP:
PHP 警告:stream_socket_client(): failed to bind to 'domainIP:587',系统提示:Permission denied
非常感谢任何帮助。
【问题讨论】:
-
哪个 IP 用于出站到任何特定目的地由服务器网络配置中定义的默认路由处理。你是对的,它通常不是你可以从 PHP 级别控制的。
-
在工具和设置 > 邮件服务器设置中检查外发邮件模式的设置。可以更改那里的邮件服务器发送的外发电子邮件的 IP。
标签: php email centos phpmailer plesk