apache — Postfix игнорирует функцию PHP mail ()

Я успешно отправляю почту, используя PHP с помощью функции mail (), но отправка отображается как адрес сервера, а не как я настроил в сценарии. Postfix установлен на сервере apache. На ServerFault ответ Я прочитал, чтобы использовать флаги -f и -r, но это не работает так:

mail($to, $subject, $message, $headers,'From: ' . $fromname . ' <'.$from.'>', "-f $from -r [email protected]");

Лучшее, что я смог сделать, — это заменить myorigin Postfix, который является именем хоста локального компьютера, на родительский домен имени компьютера.

Это наводит меня на мысль, что Postfix игнорирует или удаляет элемент From:?

10

Решение

Вы можете позволить Postfix выполнять свою работу, переписывая заголовки и добавляя правильные From: адреса. Для этого Postfix имеет sender_canonical_maps,

Допустим, ваш веб-сервер (или менеджер процессов) работает под именем пользователя usernameи вы хотите иметь [email protected] в From: заголовок ваших писем вместо непонятного [email protected], Тогда каноническая карта будет содержать:

#/etc/postfix/canonical
username [email protected]

Настройка Postfix для использования не может быть проще:

postmap /etc/postfix/canonical
postconf -e sender_canonical_maps=hash:/etc/postfix/canonical

Другой вариант — указать postfix пометить все письма, отправленные с вашего сервера, как отправленные с [email protected] посредством luser_relay:

postconf -ev [email protected]

Если вы не можете сделать это, вполне возможно, что кто-то уже сделал это для вас, но сделал это неправильно. Это может быть причиной, почему вы не можете изменить From: адрес, поскольку он принудительно перезаписывается Postfix.

5

Другие решения

mail($to, $subject, $message, $headers,'From: ' . $fromname . ' <'.$from.'>', "-f $from -r [email protected]");

Не может работать как почта () принимает только 5 параметров: bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )

Для меня обоих

mail($to, $subject, $message, null, "-r [email protected]");
mail($to, $subject, $message, 'Name <[email protected]>', "-r [email protected]");

работать (у меня нет никаких дополнительных ограничений в postfix, которые могут переписать отправителей). Также убедитесь, что отправитель правильно отформатирован (без пробелов или чего-либо еще).

Тем не менее, я рекомендую настроить sendmail_path установка в вашем php.ini включения параметра «-r [email protected]».

Если это не работает для вас, вы должны опубликовать здесь заголовки почты и проверить файлы журналов на наличие предупреждений / ошибок.

PS: пожалуйста, убедитесь, что вы не передаете введенные пользователем данные напрямую mail()потому что, если пользователи могут вставлять новые строки (такие как \nCC: [email protected] в теме, на почту или с почты) ваш сервер может быть использован для рассылки спама.

9

У вас есть аргумент заголовка в вашем mail() позвоните дважды и, таким образом, ваш $additional_parameters Аргумент не используется, потому что это шестой аргумент в функции, которая принимает только 5. Вместо этого вы должны переместить заголовок, который будет включен с остальными заголовками:

//Be mindful to protect from email injection attacks.
$fromname = str_replace("\n", "", $fromname);
$from = str_replace("\n", "", $from);

//This assumes that $headers is already set, containing your other headers
$headers .= 'From: ' . $fromname . ' <'.$from.">\n";

mail($to, $subject, $message, $headers, "-f $from -r [email protected]");

Используя это, я ожидаю, что ваш 5-й аргумент теперь избыточен и может быть упрощен до:

$fromname = str_replace("\n", "", $fromname);
$from = str_replace("\n", "", $from);

$headers .= 'From: ' . $fromname . ' <'.$from.">\n";

mail($to, $subject, $message, $headers);
4

В PHP синтаксис для mail Функция выглядит следующим образом:

mail($to, $subject, $message, $headers, $parameters);

Так что в вашем случае, если вы хотите указать другой адрес «От» и другой «Путь возврата», ваш код должен выглядеть следующим образом:

$to = "[email protected]";
$subject = "Your reset email";
$message = "<message text / html>";
$from = "[email protected]";
$bounceEmail = "[email protected]";
$headers = array(
"From: " . $from
);
$headers = implode("\r\n", $headers);
$parameters = "-r" . $bounceEmail;

// Send it!
mail($to, $subject, $message, $headers, $parameters);

Надеюсь это поможет!

4
По вопросам рекламы [email protected]