Вопрос почты PHP с www-данными - PullRequest
22 голосов
/ 14 апреля 2011

Я пытаюсь вызвать 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

Почему это ?? Я запускаю fast-cgi PHP на Ubuntu Почему sendmail не использует заголовок, который я указал через код PHP?

Ответы [ 5 ]

25 голосов
/ 14 апреля 2011

Похоже, www-data@Name это ваш конверт "от" адреса. Адрес конверта «от» отличается от адреса, который указан в заголовке электронного письма «От:». Это то, что 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» автоматически переопределяют предыдущие параметры, позволяя установить глобальное значение по умолчанию и, тем не менее, получить разумное поведение при попытке переопределить его локально.

EDIT

О необязательных флагах, которые могут быть переданы в sendmail: -f установит адрес отправителя, -r переопределит путь возврата по умолчанию, который генерирует sendmail (обычно используется адрес отправителя). Если вы хотите, чтобы ваши отказов возвращались по адресу, отличному от адреса 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 =
9 голосов
/ 21 декабря 2012

Хотя это старый вопрос, я добавляю этот ответ на случай, если он кому-то поможет:

У меня была такая же проблема с перезаписью заголовка From: в www-data@host...В конце концов я отследил его до службы моста ssmtp, которая передавала почту с нашего веб-сервера на наш почтовый сервер.Я добавил строку FromLineOverride=YES в файл /etc/ssmtp/ssmtp.conf, и проблема исчезла.

5 голосов
/ 18 ноября 2014

В моем случае у меня есть хост-сервер, поэтому мне нужно было отредактировать этот файл:

/ etc / ssmtp / ssmtp.conf

Затем раскомментируйтеэта строка:

FromLineOverride = YES

Когда все готово, персональные заголовки работают.

1 голос
/ 15 февраля 2019

У меня была похожая проблема с www-данными, когда все мои письма были отправлены и получены с этим заголовком:

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>

Я публикую этот ответ, потому что никто не упоминает его здесь, и я немного застрял на нем.

0 голосов
/ 15 июля 2014

Это сработало для меня:

$mail->Sendmail = $mail->Sendmail.' -f '.$mail_errorsto; 
...