Проблема с PHP-почтой из-за www-данных

#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>