在 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 地址