Я сделал поиск здесь. Я знаю, что этот вопрос задавался несколько раз. Но моя ситуация немного отличается, и я не могу заставить это работать.
Я написал сценарий CLI, который читает из почтовой очереди в базе данных и отправляет письма. База данных содержит данные для $to
, $subject
, $body
, а также $headers
так что их можно просто подключить прямо к mail()
функция. Звучит достаточно просто.
КРОМЕ.
База данных также содержит $from
, который является именем пользователя в моей системе, который поставил почту в очередь. Он не предназначен для замены заголовка From в $headers
, Пользователи могут указать любой адрес, который им нравится, в заголовке От, как это является нормой.
Поскольку скрипт выполняется от имени пользователя root (по причинам, по которым я не буду вдаваться), вызов mail()
функция приводит к тому, что заголовок Return-Path устанавливается в [email protected]
, Это также приводит к появлению «root» в заголовках почты SPF, которые добавляются по пути.
В идеале я хотел бы, чтобы пользователь, который поставил почту в очередь, в $from
, чтобы появиться в Return-Path.
Вещи, которые я пробовал:
mail( $to, $subject, $body, array_merge( $headers, [ 'Return-Path' => "[email protected]" ] );
mail( $to, $subject, $body, $headers, "-f [email protected]" );
posix_seteuid( posix_getpwnam( $from )['uid'] ); mail( $to, $subject, $body, $headers );
if( pcntl_fork() === 0 ) { posix_setuid( posix_getpwnam( $from )['uid'] ); mail( $to, $subject, $body, $headers ); die; }
Все вышеперечисленное действительно ДЕЙСТВИТЕЛЬНО отправляет почту, но ВСЕ заголовки имеют персиковый «корень». Последнее меня особенно удивляет …
Любые мысли о том, почему это может происходить, или как я могу изменить этот обратный путь?
Итак, проблема была с posix_setuid()
не работает. Я добавил posix_getuid()
а также posix_geteuid()
на тело исходящей почты и заметил, что uid не изменился. После решения этой проблемы (моя собственная ошибка, ничего сумасшедшего), письмо теперь отправляется с соответствующим путем возврата.
Спасибо всем, кто прочитал и задумался над этим!
Других решений пока нет …