#php #sendmail
#php #отправить почту
Вопрос:
Я пытаюсь вызвать sendmail через почтовую функцию PHP с помощью следующего кода:
$to = 'blah@email.state.edu';
$subject = 'test';
$message = 'test';
$headers = 'From: mail@smartrek.blah.me' . "rn" .
'Reply-To: mail@smartrek.blah.me' . "rn" .
'X-Mailer: PHP/' . phpversion();
mail($to, $subject, $message, $headers);
Однако в моем mail.log я получаю сообщение о том, что from не является адресом, который я указал в заголовке:
<www-data@Name>: Sender address rejected: Domain not found
Почему это?? Я запускаю fast-cgi PHP на ubuntu
Почему sendmail не использует заголовок, который я указал в PHP-коде?
Комментарии:
1. у вас есть этот файл:
/etc/postfix/main.cf
, также запуститеpostconf -n
в вашем терминале, сообщите нам результат.2. Я использую sendmail, а не postfix
Ответ №1:
Похоже, что www-data@Name
это ваш конверт «с» адреса. Адрес «from» в конверте отличается от адреса, который указан в заголовке вашего электронного письма «From:». Это то, что sendmail использует в своем обмене «MAIL FROM / RCPT TO» с принимающим почтовым сервером.Основная причина, по которой он называется адресом «конверта», заключается в том, что он появляется вне заголовка и тела сообщения при необработанном SMTP-обмене между почтовыми серверами.
Адрес конверта по умолчанию «from» в unix зависит от того, какую реализацию sendmail вы используете. Но обычно для этого будет установлено имя пользователя запущенного процесса, за которым следует «@» и имя хоста компьютера. В типичной конфигурации это будет выглядеть примерно так username@example.com
.
Если ваши электронные письма отклоняются принимающими почтовыми серверами или если вам нужно изменить адрес, на который отправляются письма с отказом, вы можете изменить адрес конверта «от», чтобы решить свои проблемы.
Чтобы изменить адрес конверта «from» в 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). Если вы хотите, чтобы ваши возвраты отправлялись на адрес, отличный от адреса from, попробуйте использовать оба флага одновременно: -f mail@smartrek.blah.me -r bounced-mail@smartrek.blah.me
мой php.ini
[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 =
Комментарии:
1. Я добавил опцию -r в sendmail_path и теперь я получил: sendmail [2719]: p3EGvC1r002719: from= www-data, size = 259, class = 0, nrcpts = 0, msgid =<201104141657.p3EGvC1r002719@DynusT>, relay=www-data@localhost
2. Если я укажу -f mail@smartrek.blah.me в моем sendmail_path это работает, но я не хочу этого делать
3. Просто для тестирования вы можете попробовать удалить
From:
иReply-To:
из своего кода.4. Внутри вашего php вы можете вызвать функцию mail следующим образом:
mail('to-email@example.com', 'the subject', 'the message', $headers, '-fmail@smartrek.blah.me');
чтобы предоставить почтовой функции значение во время выполнения.5. @anubhava Вы оказали большую помощь в решении этого вопроса, чтобы помочь мне в этом вопросе .
Ответ №2:
Хотя это старый вопрос, я добавляю этот ответ на случай, если он кому-то поможет:
У меня была такая же проблема с перезаписыванием From:
заголовка www-data@host...
, в конце концов я отследил его до службы ssmtp bridge, которая передавала почту с нашего веб-сервера на наш почтовый сервер. Я добавил строку FromLineOverride=YES
в файл /etc/ssmtp/ssmtp.conf
, и проблема исчезла.
Ответ №3:
В моем случае у меня есть размещенный сервер, поэтому мне нужно было отредактировать этот файл :
/etc/ssmtp/ssmtp.conf
Затем раскомментируйте эту строку :
FromLineOverride = ДА
После завершения заголовки личных данных работают.
Ответ №4:
У меня была аналогичная проблема с www-data, когда все мои письма отправлялись и получались с этим заголовком:
From: www-data <www-data@example.com>
Я использовал -f info@example.com
флаг в качестве 5-го аргумента с функцией PHP email () (как указано в принятом ответе), но я все еще получал свои электронные письма как:
From: www-data <info@example.com>
Итак, я добавил еще один флаг -f info@example.com -F info
, чтобы задать полное имя электронного письма, и, наконец, я получал электронные письма так, как хотел:
From: info <info@example.com>
Я публикую этот ответ, потому что здесь никто не упоминает об этом, и я немного застрял на нем.
Ответ №5:
Это сработало для меня:
$mail->Sendmail = $mail->Sendmail.' -f '.$mail_errorsto;
Ответ №6:
У меня была эта проблема при использовании exim4 с smarthost. Письма были отправлены с
Return-path: <www-data@servername>
которая была отклонена провайдером. Мне нужно было изменить его, по крайней мере, на www-data@example.com
(при условии, что ‘example.com ‘ — это имя общедоступного домена сервера). Я мог бы добиться этого, изменив /etc/mailname
с
servername
Для
example.com
У меня это уже сработало, имея www-data@example.com
as Return-path
.
Однако, если вы хотите полностью изменить адрес электронной почты, вы можете настроить его в /etc/email-addresses
виде
www-data: notifications@example.com
После этого электронные письма по умолчанию отправлялись с
Return-path: <notifications@example.com>