在 PHPmailer 中设置原始 IP
Set origin IP in PHPmailer
我想在电子邮件脚本中轮换原始 IP 地址,它用于向我的客户发送通知。
我的服务器有 5 个 IP 地址,所以我创建了一个 IP 数组,发送 IP 地址时随机更改,在这个数组中我不包括主服务器 IP。
这在去年 12 月之前一直运行良好,我没有进行任何更改或更新(我不确定是否有任何自动更新)
这是脚本:
$iparray = array(
'163.xx.217.xx',
'164.xx.217.xx',
);
$ips = $iparray;
$keyip = array_rand($ips);
$mail = new PHPMailer();
$mail->IsSMTP();
$mail->CharSet = 'UTF-8';
$mail->SMTPDebug = 0;
$mail->SMTPAuth = true;
$mail->SMTPSecure = "none";
$mail->Host = $ips[$keyip];
$mail->Port = 26;
$mail->AddAddress($recipient);
$mail->Username=$senderemail;
$mail->Password=$senderpass;
$mail->SetFrom($senderemail,$sendername);
$mail->AddReplyTo($senderemail,$sendername);
$mail->AddBCC('smtp@xxxxx.co');
$mail->Subject = 'the subject';
$mail->MsgHTML('the message);
注意 $mail->Host 是从数组中随机选择的一个IP,在查看收到的邮件时,我曾经得到这个:
spf=pass (google.com: domain of test@xxxxxxx.co designates 163.xx.217.xx as permitted sender) smtp.mailfrom=test@xxxxxxx.co
但是,自 12 月以来,SPF 检查是在服务器主 IP 上进行的,而不是阵列中任何选定的 IP,这是我不想要的。
这一切正常,但突然变了,会不会是 Gmail 服务器问题?难道是要在服务器配置什么?
为了发送电子邮件,我使用 Exim,它安装在 Centos 服务器上,通过 WHM 管理。
我不是想欺骗任何地址,所有 IP 地址都是我的,我只需要确保它们在发送的每封电子邮件中轮换,我可以做到,但现在我不确定要更改什么才能做到再次工作。
感谢您的帮助
SPF 检查不是通过在邮件中声明 "everything is fine" 进行的,而是通过 DNS 记录进行的。查看像 https://mxtoolbox.com/spf.aspx 这样的 SPF 检查器,看看您的所有五个 IP 地址是否都在您的传出域的 SPF 记录中列出。
这更像是一个网络问题,而不是 PHP。像 Gmail 这样的远程主机只会看到来自您的邮件服务器的传出 public IP。如果您连接到原始随机 IP 之一,但正在路由传出流量,以便流量源自服务器的主 IP,那么 Gmail 将看到的就是这些。您需要查看您的网络配置,看看最近是否有这方面的更改。
编辑:我要补充一点,我的回答有点含糊,但那是因为我们不知道您的网络设置是什么样的。您可能应该在 ServerFault 上问这个问题:
https://serverfault.com/
绑定到 IP 发生在创建套接字时。您可以通过在 PHPMailer 的 SMTP
class:
中设置传递给 stream_context_create()
的选项来控制它
$mail->SMTPOptions = [
'socket' => [
'bindto' => "$bound_ip:0",
],
];
其中 $bound_ip
是文字 IPv4/IPv6 地址,gethostbyname('your-domain.example')
的结果等。使用 0
作为端口允许系统 select端口正常。有关详细信息,请参阅 bindto
docs。
解决方案不是直接在 te PhpMailer 中,但由于我将 Exim 用作 MTA,答案是设置 exim 以从 etc/mailips 读取 IP,您甚至可以将单个域映射到任何您的服务器 IP 地址
我想在电子邮件脚本中轮换原始 IP 地址,它用于向我的客户发送通知。
我的服务器有 5 个 IP 地址,所以我创建了一个 IP 数组,发送 IP 地址时随机更改,在这个数组中我不包括主服务器 IP。
这在去年 12 月之前一直运行良好,我没有进行任何更改或更新(我不确定是否有任何自动更新)
这是脚本:
$iparray = array(
'163.xx.217.xx',
'164.xx.217.xx',
);
$ips = $iparray;
$keyip = array_rand($ips);
$mail = new PHPMailer();
$mail->IsSMTP();
$mail->CharSet = 'UTF-8';
$mail->SMTPDebug = 0;
$mail->SMTPAuth = true;
$mail->SMTPSecure = "none";
$mail->Host = $ips[$keyip];
$mail->Port = 26;
$mail->AddAddress($recipient);
$mail->Username=$senderemail;
$mail->Password=$senderpass;
$mail->SetFrom($senderemail,$sendername);
$mail->AddReplyTo($senderemail,$sendername);
$mail->AddBCC('smtp@xxxxx.co');
$mail->Subject = 'the subject';
$mail->MsgHTML('the message);
注意 $mail->Host 是从数组中随机选择的一个IP,在查看收到的邮件时,我曾经得到这个:
spf=pass (google.com: domain of test@xxxxxxx.co designates 163.xx.217.xx as permitted sender) smtp.mailfrom=test@xxxxxxx.co
但是,自 12 月以来,SPF 检查是在服务器主 IP 上进行的,而不是阵列中任何选定的 IP,这是我不想要的。
这一切正常,但突然变了,会不会是 Gmail 服务器问题?难道是要在服务器配置什么?
为了发送电子邮件,我使用 Exim,它安装在 Centos 服务器上,通过 WHM 管理。
我不是想欺骗任何地址,所有 IP 地址都是我的,我只需要确保它们在发送的每封电子邮件中轮换,我可以做到,但现在我不确定要更改什么才能做到再次工作。
感谢您的帮助
SPF 检查不是通过在邮件中声明 "everything is fine" 进行的,而是通过 DNS 记录进行的。查看像 https://mxtoolbox.com/spf.aspx 这样的 SPF 检查器,看看您的所有五个 IP 地址是否都在您的传出域的 SPF 记录中列出。
这更像是一个网络问题,而不是 PHP。像 Gmail 这样的远程主机只会看到来自您的邮件服务器的传出 public IP。如果您连接到原始随机 IP 之一,但正在路由传出流量,以便流量源自服务器的主 IP,那么 Gmail 将看到的就是这些。您需要查看您的网络配置,看看最近是否有这方面的更改。
编辑:我要补充一点,我的回答有点含糊,但那是因为我们不知道您的网络设置是什么样的。您可能应该在 ServerFault 上问这个问题: https://serverfault.com/
绑定到 IP 发生在创建套接字时。您可以通过在 PHPMailer 的 SMTP
class:
stream_context_create()
的选项来控制它
$mail->SMTPOptions = [
'socket' => [
'bindto' => "$bound_ip:0",
],
];
其中 $bound_ip
是文字 IPv4/IPv6 地址,gethostbyname('your-domain.example')
的结果等。使用 0
作为端口允许系统 select端口正常。有关详细信息,请参阅 bindto
docs。
解决方案不是直接在 te PhpMailer 中,但由于我将 Exim 用作 MTA,答案是设置 exim 以从 etc/mailips 读取 IP,您甚至可以将单个域映射到任何您的服务器 IP 地址