Статьи,обзоры,справочники по PHP

-- I -- Почтовый робот за минут ("COMMAND")


Для тех, кто хочет по быстрому все настроить, будет полезна данная глава. После нее начнется менее конкретная теория.

Приступим. Разумеется, ваш сервер должен быть типа Unix, а не Windows. Еще вы должны иметь PHP в виде CGI программы. Попробуйте запустить из телнета комагду echo 123 | php

(либо с путями: echo 123 | /usr/bin/php). Если вы увидите в ответ что-то, то ПХП на сервере есть. Напишут "файл не найден" - значит еще нет. Попробуйте поискать в других каталогах или спросить админа. Если действительно нет - нужно скомпилировать ПХП как CGI программу. Это сделать очень просто:

  • перейдите в каталог исходников ПХП
  • запустите ./configure

    со всеми параметрами, что и при первой компиляции (с апачем), только не пишите параметра --with-apache

  • скомпилируйте: make
  • инсталляцию НЕ запускайте (make install)
  • скопируйте образовавшийся файл php в каталоге компиляции в каталог /usr/bin



    1) Ваш домашний каталог.

    Он не должен быть доступен из веба, т.е. не совпадать ни с одним веб-каталогом на сервере. Например, ваши веб-страницы живут в каталоге /www, а ваш домашний каталог - /home/dima. Вот там то мы и будем писать робота. Если вы положите такой скрипт в веб-каталог, получиться натуральный троян, типа телнет-доступа для всех желающих на сервер. В скрипте ничего страшного нет, просто чтение входного потока.

    2) Создайте файл робота.

    Он будет в нашем домашнем каталоге /home/dima/mail.php (расширение никакого значения не имеет) следующего содержания:



    #!/usr/bin/php


    3) Как это работает. Мы еще не закончили, но уже видно, как это будет работать. Во-первых, данный скрипт будет запущен только при приходу письма. Во-вторых, вам подадут письмо в готовом виде - надо только открыть входной поток (файл со спец. именем php://stdin) и прочитать от туда текст. Представьте, что это обычный файл. После того, как вы прочитали письмо, функции почтового робота заканчиваются. Вы можете поместить письмо в переменную или сразу построчно обработать, но главное - это уже совсем другая история, каким образом реагировать на текст-письма (там есть заголовок, тело, поля в заголовке...). В примере мы записываем текст письма в файл /tmp/php-robot.txt (доступ к каталогу /tmp имеют все пользователи на сервере). Число 10`000 очень завышено. Максимальная длина письма, толи 1 Кбайт, толи 2 Кбайта (в этом пределе). Писем с большими по длине строками не бывает, это вам может гарантировать ваш почтовый сервер.




    3) Настроим права на скрипт.

    Файл (mail.php) должен иметь атрибуты rwxr-xr-x, владелец и группа не имеют значения. Если вы умете юзать ФАР, то подведите курсор к файлу mail.php на FTP панели, нажмите Ctrl+A и проставьте все 9 галочек, кроме 5й и 8й слева.

    4) Глюк с переводом каретки.

    Если вы создаете файл (mail.php) в Windows/DOS и потом копируете по FTP на сервер, глюк будет. Если создать файл прямо из консоли сервера каким-нибудь редактором (vi, joe, mc), то глюка не будет. Глюк заключается в разных переводых каретки. Причем надо конвертировать перевод каретки не во всем файле, а только в первой строке: #!/usr/bin/php. Глюк не имеет отношения к ПХП, а к Юниксам в целом. К сожалению, разработчики линуксов и прочего вместо того, чтобы профикситить сей давний глюк, особо проявившийся с появлением веба, занимаются не понятно чем. Чтобы исправить глюк, сравните на пререводы каретки у любого файла с сервера (не из веб-каталога) и файла с Windows. Итак решение по шагам:


    • создать файл в Windows с текстом, приведенным выше не под именем mail.php, а под именем mail2.php


    • переписать в свой домашний каталог файл mail2.php


    • запустить телнет, перейти в домашний каталог и выполнить fromdos < mail2.php > mail.php

      (если у вас нет телнета - попросите админа о такой мелочи)
    • стереть mail2.php (и останется только mail.php в правильном виде)

      5) Вам нужен админ сервера.

      Если вы живете на платном хостинге, админ может и не согласиться, но если ваш хостинг по месту работы - местный админ сделать обязан. Админов, которые что-то заявляют о дырявости ПХП или ненадежности таких технологий надо гнать с позором. В функции администратора сервера входит защита веб-сервера и веб-программ от взлома через сам сервер, а не методом ошибок в веб-программах. (Веб-программер, разумеется, должен писать программы без ошибок.) В том числе админ должен думать, что будет, если кто-то начнет целенаправлено спамить ваш хост письмами (есть элементарная защита - настройки в sendmail). Итак, к делу - надо в файл /etc/aliases



      поместить строку

      testmail: |/home/dima/mail.php
      Допустим, ваш основной домен - php.spb.ru. Тогда адрес почтового робота будет testmail@php.spb.ru. Если домен не совпадает с основным, то можно воспользоваться виртульными доменами sendmail'а, обычно это файл с названием virtual (если админ не умеет - на мыло).

      6) Не забудем пересоздать базу из файла aliases.

      На некоторых линухах установлен не sendmail, а что-то другое. Там не нужно пересоздавать базу. Но если в каталоге /etc вы найдете файл aliases.db, то вам это надо (запускать с правами рута):

      makemap hash /etc/aliases.db < /etc/aliases ; newaliases
      Возможно, досточно выполнить только одну из этих команд... Но так будет работь.

      7) Альтернатива 5+6 пунктам (выполнить либо пункты 5+6, либо 7).

      Пункт 5 работает надежно - рекомендуется. А этот - может и не работать. Зато, если вы имете телнет-доступ на сервер, можно попробовать обойтись и без админа. Проверим, будет ли работать. Создайте файл /home/dima/.forward (не потеряйте точку). В файле строку:

      |/home/dima/mail.php
      Данный файл (.forward) дает возможноть любому пользователю, у когорого есть домашний каталог и шелл (только FTP - недостаточно), перенаправлять свою почту на нужные адреса (их может быть много) или запускать команды по приходу письма. E-mail пишут как есть, а команды начинают с вертикальной черты. Много записей разделяют либо запятой, либо переводом строки. Сделайте так и пошлите письмо работу. Обратите внимание, теперь у робота будет адрес пользователя данного каталога /home/dima. Т.е. никаких "testmail" в таком случае сделать нельзя. Для этого существуют алиасы, что и было описано в пунктах 5+6. Адрес будет совпадать с ваши логином на сервере, домен будет основной, т.е. e-mail получиться таким: dima@php.spb.ru. Если после письма файл логов не измениться - значит этот способ на данном сервере не работет (в принципе он должен работать).

      8) Готово! Теперь шлем письмо на адрес робота и смотрим что получилось.


      • файл логов создан и содержит письмо - все работает.
      • файл логов есть, но без письма ... сомнительная и маловероятная ситуация. Наверно запускали mail.php из консоли, а потом отправи письмо и оно не дошло, логи не изменились. Сотрите логи, повторно посшлите письмо.
      • файла логов нет, письмо назад не вернулось


        • проверьте, пришло ли оно как обычно письмо на сервер. Каталог с письмами обычно /var/spool/mail. Открыть файл testmail у вас прав не будет, но посмотреть на его размер и дату изменения - есть. Если файла вообще нет - смотрите в логи и т.п... (маловероятно)
        • письмо пришло как письмо, т.е. лежит в /var/spool/mail - забыли перегрузить алиасы


        • файла логов нет, письмо пришло назад - исправьте глюк с переводом каретки

          9) О правах и пользователях.

          Вниманию админу. Файл mail.php в описанной выше конфигурации (5 пункт) будет запущен от пользователя/группы daemon:daemon (это не рут). Если это опасно, то с помощью команды "su" измените пользователя на нужного. Пример: su юзер -c команда. Либо воспользуйтесь sudo или спец битом у файла mail.php.



          Содержание раздела