Как изменить конверт с адреса с помощью PHP почты? - PullRequest
33 голосов
/ 07 октября 2008

Я использую PHP с Apache на Linux, с Sendmail. Я использую функцию PHP mail. Письмо отправлено, но у конверта есть Apache_user@localhostname в MAIL FROM (пример nobody@conniptin.internal), и некоторые удаленные почтовые серверы отклоняют это, потому что домен не существует (очевидно). Используя mail, можно ли заставить его изменить конверт MAIL FROM?

РЕДАКТИРОВАТЬ: Если я добавлю заголовок в четвертое поле функции mail (), это изменит поле From в заголовках тела сообщения и НЕ изменит конверт MAIL FROM.

Я могу форсировать его, вызывая sendmail с sendmail -t -odb -oi -frealname@realhost и передавая ему содержимое электронной почты. Это лучший подход?

Есть ли лучший, более простой и подходящий для PHP способ сделать это?

РЕДАКТИРОВАТЬ: Суть в том, что я должен иметь RTM. Спасибо за ответы, пятый параметр работает, и все хорошо.

Ответы [ 5 ]

66 голосов
/ 07 октября 2008

mail () имеет 4-й и 5-й параметры (необязательно). Пятый аргумент - это то, что должно быть передано в качестве параметров непосредственно в sendmail. Я использую следующее:

mail('to@blah.com','subject!','body!','From: from@blah.com','-f from@blah.com');
2 голосов
/ 04 ноября 2017

PHP Официальная документация для почты ()

bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )

...

дополнительные_параметры (необязательно)

Параметр extra_parameters может использоваться для передачи дополнительных флаги в качестве параметров командной строки для программы, настроенной для использования при отправке почты, как определено конфигурацией sendmail_path установка. Например, это можно использовать для установки отправителя конверта адрес при использовании sendmail с опцией -f sendmail.

Этот параметр экранирован внутренним escapeshellcmd() для предотвращения Выполнение команды. escapeshellcmd() предотвращает выполнение команды, но позволяет добавить дополнительные параметры. По соображениям безопасности это пользователю рекомендуется санировать этот параметр, чтобы избежать добавления нежелательные параметры для команды оболочки.

Поскольку escapeshellcmd() применяется автоматически, некоторые символы, которые разрешены как адреса электронной почты в Интернете. RFC не могут быть использованы. почта () нельзя допускать такие символы, поэтому в программах, где использование таких символы необходимы, альтернативные способы отправки электронной почты (например, с использованием фреймворка или библиотеки).

Пользователь, с которым работает веб-сервер, должен быть добавлен в качестве доверенного пользователя. в конфигурацию sendmail, чтобы запретить заголовок 'X-Warning' добавляется в сообщение, когда отправитель конверта (-f) установлен с помощью Этот метод. Для пользователей sendmail этот файл /etc/mail/trusted-users.

1 голос
/ 07 октября 2008

Я бы также порекомендовал проверить PHPMailer . Он отлично подходит для создания и отправки электронной почты, что значительно упрощает процесс, а также поддерживает SMTP.

1 голос
/ 07 октября 2008

Вы можете попробовать это (я не уверен, что tho):

ini_set("sendmail_from", yourmail@example.com);
mail(...);
ini_restore("sendmail_from");
0 голосов
/ 25 марта 2011

Что вам на самом деле нужно сделать, это изменить имя хоста компьютера, на котором работает Apache, плюс пользователь Apache работает как.

В вашем текущем случае это:

  • Пользователь Apache: никто
  • Имя хоста сервера: conniptin.internal

Изменение этих двух значений довольно просто и решит корень вашей проблемы.

Хотя, если вам нужно сделать это из PHP, возможно, используйте функции system/exec. Я не думаю, что это будет работать на практике, поскольку вам нужно перезапустить Apache и, возможно, также весь хост для использования новых имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...