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);
Надеюсь, это поможет!