Я пытаюсь вызвать sendmail через почтовую функцию PHP следующим кодом:
$to = 'blah@email.state.edu'; $subject = 'test'; $message = 'test'; $headers = 'From: mail@smartrek.blah.me' . "\r\n" . 'Reply-To: mail@smartrek.blah.me' . "\r\n" . 'X-Mailer: PHP/' . phpversion(); mail($to, $subject, $message, $headers);
Однако в моем mail.log я получаю сообщение, что from не является адресом, указанным в заголовке:
<www-data@Name>: Sender address rejected: Domain not found
Почему это?? Я запускаю PHP-скрипты fast-cgi на ubuntu. Почему sendmail не использует заголовок, который я указал через PHP-код?
Похоже, что www-data@Name
– ваш конверт «от». Адрес конверта «от» отличается от адреса, который отображается в заголовке «From:» письма. Это то, что sendmail использует в своем обмене «MAIL FROM / RCPT TO» с принимающим почтовым сервером. Основная причина, по которой он называется «конверт», заключается в том, что он появляется за пределами заголовка и тела сообщения в необработанном обмене SMTP между почтой сервера.
По умолчанию конверт «от» в unix зависит от используемой вами реализации sendmail. Но обычно он будет установлен на имя пользователя запущенного процесса, за которым следуют «@» и имя хоста машины. В типичной конфигурации это будет выглядеть как username@example.com
.
Если ваши электронные письма отклоняются при получении почтовых серверов или вам необходимо изменить адрес электронной почты, отсылаемых по электронной почте, вы можете изменить конверт «от», чтобы решить свои проблемы.
Чтобы изменить конверт «от» адреса в unix, вы указываете опцию «-r» для вашего бинарного файла sendmail. Вы можете сделать это глобально в php.ini, добавив параметр «-r» в командную строку «sendmail_path». Вы также можете сделать это программно из PHP, передав -r mail@smartrek.blah.me
в качестве дополнительного аргумента параметра функции mail () (5-й аргумент). Если вы укажете адрес в обоих местах, двоичный файл sendmail будет вызываться с двумя параметрами «-r», которые могут иметь неопределенное поведение в зависимости от вашей реализации sendmail. С помощью Postfix MTA более поздние опции «-r» молча переопределяют более ранние параметры, позволяя установить глобальное значение по умолчанию и по-прежнему получать разумное поведение при попытке переопределить его локально.
О дополнительных флажках, которые могут быть переданы sendmail: -f
установит адрес From, -r
переопределит возвращаемый по умолчанию путь возврата, который генерирует sendmail (обычно используется адрес From). Если вы хотите, чтобы ваши обратные отскоки переходили на другой адрес, отличный от адреса, попробуйте использовать оба -f mail@smartrek.blah.me -r bounced-mail@smartrek.blah.me
одновременно: -f mail@smartrek.blah.me -r bounced-mail@smartrek.blah.me
[mail function] ; For Win32 only. ; http://php.net/smtp SMTP = localhost ; http://php.net/smtp-port smtp_port = 25 ; For Win32 only. ; http://php.net/sendmail-from ;sendmail_from = me@example.com ; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). ; http://php.net/sendmail-path ;sendmail_path = ; Force the addition of the specified parameters to be passed as extra parameters ; to the sendmail binary. These parameters will always replace the value of ; the 5th parameter to mail(), even in safe mode. ;mail.force_extra_parameters = ; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename mail.add_x_header = On ; Log all mail() calls including the full path of the script, line #, to address and headers ;mail.log =
Хотя это старый вопрос, я добавляю этот ответ, если он кому-то помогает:
У меня была такая же проблема, когда заголовок From:
был переписан на www-data@host...
Я в конечном итоге отследил его до службы моста ssmtp, которая отправляла почту с нашего веб-сервера на наш почтовый сервер. Я добавил строку FromLineOverride=YES
в файле /etc/ssmtp/ssmtp.conf
и проблема исчезла.
В моем случае у меня есть размещенный сервер, поэтому мне нужно было отредактировать этот файл:
/etc/ssmtp/ssmtp.conf
Затем раскомментируйте эту строку:
FromLineOverride = ДА
После этого пользовательские заголовки работают.
Это сработало для меня:
$mail->Sendmail = $mail->Sendmail.' -f '.$mail_errorsto;