Установить исходный IP-адрес в PHPmailer

Я хотел повернуть исходные IP-адреса в сценарии электронной почты, он используется для отправки уведомлений моим клиентам.

Мой сервер поставляется с 5 IP-адресами, поэтому я создал массив IP-адресов, и при отправке IP-адрес менялся случайным образом, в этот массив я не включаю IP-адрес основного сервера.

Это работало нормально до декабря прошлого года, я не вносил никаких изменений и не обновлял (я не уверен, было ли это автоматически)

Вот сценарий:

 $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('[email protected]');
        $mail->Subject    = 'the subject';
        $mail->MsgHTML('the message);

Обратите внимание, что $mail->Host был случайно выбранным IP-адресом из массива, при проверке полученного сообщения я получал это:

spf=pass (google.com: domain of [email protected] designates 163.xx.217.xx as permitted sender) [email protected]

Однако с декабря проверка SPF производится на основном IP сервера, а не на любом из выделенных IP в массиве, чего я не хочу.

Это работало правильно, но внезапно все изменилось, может быть, это серверы Gmail? Может что-то настроить на сервере?

Для отправки писем я использую Exim, установленный на сервере Centos, управляемый через WHM.

Я не пытаюсь подделать какой-либо адрес, все IP-адреса мои, мне просто нужно убедиться, что они чередуются при каждом отправленном электронном письме, и я мог бы это сделать, но теперь я не уверен, что нужно изменить, чтобы он снова работал.

Спасибо за вашу помощь


person Daniel lm    schedule 17.01.2018    source источник


Ответы (4)


Привязка к IP происходит при создании сокета. Вы можете контролировать это, установив параметры, которые передаются stream_context_create() в классе SMTP PHPMailer:

$mail->SMTPOptions = [
    'socket' => [
        'bindto' => "$bound_ip:0",
    ],
];

Где $bound_ip — буквальный адрес IPv4/IPv6, результат gethostbyname('your-domain.example') и т. д. Использование 0 для порта позволяет системе нормально выбирать порт. Дополнительные сведения см. в bindto документах.

person Walf    schedule 16.10.2018

Проверка SPF производится не через декларацию "все в порядке" на почте, а через записи DNS. Посмотрите средство проверки SPF, например https://mxtoolbox.com/spf.aspx, чтобы узнать, все пять ваших IP-адресов перечислены в записи SPF для исходящего домена.

person Nico Haase    schedule 17.01.2018
comment
Задавший вопрос заключался в том, что записи SPF включают дополнительные IP-адреса, поэтому они хотят использовать их для исходящих SMTP-соединений. - person Walf; 09.06.2020

Это скорее сетевой вопрос, а не PHP. Удаленный хост, такой как Gmail, будет видеть только исходящий общедоступный IP-адрес вашего почтового сервера. Если вы подключаетесь к одному из исходных случайных IP-адресов, но исходящий трафик маршрутизируется так, что трафик исходит с основного IP-адреса сервера, то это все, что увидит Gmail. Вам нужно изучить конфигурацию вашей сети, чтобы увидеть, были ли какие-либо недавние изменения в этом отношении.

РЕДАКТИРОВАТЬ: я добавлю, что мой ответ - несколько расплывчатый, но это потому, что мы не знаем, на что похожа ваша сетевая настройка. Вероятно, вам следует задать этот вопрос в ServerFault: https://serverfault.com/

person jhilgeman    schedule 17.01.2018
comment
Вопрос показывает, что спрашивающий говорит об общедоступных IP-адресах и знает, что это те, которые видят серверы Google. PHP уже давно может указать привязку IP-адреса для исходящих соединений. - person Walf; 09.06.2020

решение было не непосредственно в PhpMailer, но поскольку я использую Exim в качестве MTA, ответ заключается в том, чтобы настроить exim для чтения IP-адреса из etc/mailips, и вы даже можете сопоставить отдельные домены с любым IP-адресом вашего сервера.

person Daniel lm    schedule 23.09.2020