Я успешно отправляю почту, используя PHP с помощью функции mail (), но отправка отображается как адрес сервера, а не как я настроил в сценарии. Postfix установлен на сервере apache. На ServerFault ответ Я прочитал, чтобы использовать флаги -f и -r, но это не работает так:
mail($to, $subject, $message, $headers,'From: ' . $fromname . ' <'.$from.'>', "-f $from -r [email protected]");
Лучшее, что я смог сделать, — это заменить myorigin Postfix, который является именем хоста локального компьютера, на родительский домен имени компьютера.
Это наводит меня на мысль, что Postfix игнорирует или удаляет элемент From:?
Вы можете позволить 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.
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]
в теме, на почту или с почты) ваш сервер может быть использован для рассылки спама.
У вас есть аргумент заголовка в вашем 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);
В 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);
Надеюсь это поможет!