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

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

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

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

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

Ответ 1

Вы можете позволить 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.

Ответ 2

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

Не работает mail() принимает только 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] в тему, по почте или по почте), ваш сервер может использоваться для рассылки спама.

Ответ 3

У вас есть аргумент заголовка в mail() дважды, и поэтому ваш аргумент $additional_parameters не используется, потому что это 6-й аргумент в функции, которая принимает только 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);

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