Я настраиваю сервер Apache (2.2.14) на Windows и заимствую идеи из существующей конфигурации XAMPP. Сейчас я пытаюсь настроить функционал электронной почты для PHP (5.3.1). (Он должен уметь обрабатывать вложения, как это делает сервер XAMPP.)
Я заметил, что XAMPP поставляется споддельный sendmail для Windows, но некоторые моменты в конфигурации мне непонятны.
Вот пара строк из XAMPP php.ini
:
; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
;sendmail_path = "C:\xampp\sendmail\sendmail.exe -t"
Это странно, потому что:
- Там явно написано «только для Unix», но
- Я постоянно вижу руководства, в которых говорится, что нужно использовать эту строку для Windows, и
- пример пути к файлу даже не имел бы смысла в Unix
sendmail_path
по умолчанию закомментирован
Я задавался вопросом, а sendmail.exe
нужно ли это вообще. Поэтому на моем сервере Apache, на котором нет sendmail.exe
, я отредактировал, php.ini
чтобы добавить правильную информацию для SMTP
, smtp_port
, и sendmail_from
. С этим он смог отправлять почту! Но это очень медленно.
Затем я вернулся на сервер XAMPP и переименовал каталог sendmail
, надеясь отключить sendmail. Это сработало — мой PHP-скрипт утверждал, что отправил, но ничего не произошло.
Поэтому я в полном замешательстве.
- Мой сервер XAMPP закомментирован
sendmail_path
, но, судя по всему, все еще использует программу, на которую он указывает. Откуда он знает? - Мой сервер Apache не имеет ничего в
sendmail_path
, но может как-то отправлять почту без него. Как он это делает?
Что мне на самом деле нужно сделать, чтобы настроить сервер Apache для отправки писем?
решение1
После дальнейшего поиска и тестирования выяснилось, что:
В Windows функция PHP mail() не обязательно должна передавать электронную почту другой программе на том же компьютере; она может подключаться к почтовому серверу самостоятельно.
Однако это неэффективно и медленно.
Настройкаподдельный sendmailна серверной машине и указание
php.ini
директивыsendmail_path
на нее делает отправку электронной почты намного быстрее. Лично я представляю, какsendmail.exe
пережевываю данные в удобные для усвоения кусочки и плюю в рот почтового сервера, как птица-мать кормит своего птенца. Мммм! Но, может, я сумасшедший.Если вы поместите
sendmail.exe
вC:\usr\bin
, это позволит некоторым программам, которые, как ожидается, будут работать в ОС на базе Unix, работать в Windows.
Вотнекоторая информация в руководстве по PHPэто помогло мне разобраться.
Примечание: Реализация mail() в Windows во многом отличается от реализации в Unix. Во-первых, она не использует локальный двоичный файл для составления сообщений, а работает только на прямых сокетах, что означает, что MTA должен прослушивать сетевой сокет (который может быть как на локальном хосте, так и на удаленной машине).
И...
Примечание: Стоит отметить, что функция mail() не подходит для больших объемов электронной почты в цикле. Эта функция открывает и закрывает сокет SMTP для каждого письма, что не очень эффективно. Для отправки больших объемов электронной почты см. пакеты » PEAR::Mail и » PEAR::Mail_Queue.
решение2
Apache на самом деле не участвует ни в какой конфигурации отправки электронной почты. Это полностью обрабатывается PHP и, в данном случае, локальным MTA. MTA почти всегда будет Sendmail или Postfix. Конфигурация для этого находится в файле php.ini в разделе [mail function] с именем sendmail_path.