Способи обробки пошти:

  • Спосіб "CRON" – можна перевіряти раз на хвилину свою поштову скриньку і
    обробляти всі листи. Ще можна семуліровать крон тим, хто має халявний
    хостинг де-небудь на f2s.com … На платному хостингу адміна вам крон
    надасть.


  • Спосіб "COMMAND" – можна запускати обробник листів як тільки воно приходить.
    Найпрогресивніший спосіб. Ваша програма отримує лист вхідним потоком –
    зручніше придумати важко.

    Більше нічого придумати не можна. Хіба що зовсім не реагувати на пошту.

    Поштовий робот за 10 хвилин ("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<br />
    
    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.

    Теорія


    Отже, ми пишемо робота. Як ми визначилися вище, це буде програма на PHP,
    яка повинна аналізувати листи. Зрозуміло, не всі відразу, а по черзі. Нам
    можуть дати пошту в двох видах: або один файл з купою листів (від 0 листів і
    більше), або файл з одним листом (не більше 1 листа). Друге зрозуміло
    зручніше, але не завжди доступно.

    Давайте подивимося з чого складається один лист. Приклад:

    From dima@php.spb.ru  Fri Jun 15 03:01:23 2001<br />
    Received: from host (host [195.220.4.134])<br />
            by php.spb.ru with ESMTP id f5EN1NJ04208<br />
            for <testmail@php.spb.ru>; Fri, 15 Jun 2001 03:01:23 +0400<br />
    Date: Fri, 15 Jun 2001 02:49:28 +0400<br />
    From: Dmitry Borodin <dima@php.spb.ru><br />
    X-Mailer: The Bat! (v1.51) Educational<br />
    X-Priority: 3 (Normal)<br />
    Message-ID: &lt;5995698897.20010615024928@php.spb.ru&gt;<br />
    To: testmail@php.spb.ru<br />
    MIME-Version: 1.0<br />
    Content-Type: text/plain; charset=koi8-r<br />
    Content-Transfer-Encoding: 8bit</p>
    <p>Текст листа.<br />
    Текст листа.<br />
    Текст листа.<br />
    

    Давайте засвоїмо, що поштовий робот в даній статті – це програма, яка
    повинна вміти получтать листа у вигляді файлу (текст-приклад вище). Як розбити
    даний текст на заголовок і тіло, як вирізати з заголовок поля – це все
    відноситься до програмування, а не до веб-технологіям. Ми тут вивчаємо саме
    технології.

    У листі є заголовок і тіло. Тема йде з першого рядка. Тіло відокремлене
    від заголовка порожнім рядком. Якщо вам дають файл з безліччю листів, то листи
    поділяються досить просто. Якщо рядок починається зі слова “From
    (5 символів, включаючи пробіл) – то це початок нового заголовка.
    Так, хоч це і неймовірно, але саме так листи можна розділити між собою.
    Виникає питання – а чи не може слово "From" зустрітися в тексті листа? Ні.
    Може зустрілися "From:" або ще щось, але "From" з пропуском не зустрітися.
    Виникає наступне запитання – а чи не можна в тексті листа вставити купу слів
    "From" (з пропусками) і порушити роботу ворожого поштового сервера? Теж не можна
    🙂 Розумний сервер замінить "From" на "> From".


    Підготуємо ПХП для запуску робота

    Як ви розумієте, ми пишемо не
    веб-скрипт, який буде активуватися за бажанням відвідувача, який мишкою
    клацає по посиланнях, а з якого події. Відповідно до цього, наприклад, не
    може йти мови про отримання ІП-адреси відвідувача або куках. Поштовий робот – це
    зовсім інша історія. У його завдання входить знайти файл з листом (пісамі) і
    обробити.

    Якщо ви нижче виберіть варіант 1 або 2, вам Апач як CGI не потрібен. І навпаки
    – Якщо у вас немає Апача як CGI, то ви можете використовувати тільки способи 1 або
    2, щоб організувати поштового робота або просто крон. В інших випадках –
    Апач як CGI вам потрібен. Якщо ви самостійно цього перевірити не можете,
    зверніться до адміністратора сервера з питанням "Як запускати PHP в
    CGI-режимі? ". Якщо скаже – ні такого, вимагайте, щоб з'явився 🙂 В кінці
    кінців вам від нього потрібно тільки адресу виду
    /usr/bin/php отримати. Тобто
    php – Це назва програми, а
    /usr/bin – Каталог.

    Варіант 1: без CRON, без Command, метод POP3 пошти.
    Це означає, що
    ви не маєте доступу ні до крону, ні до описаного способу "command". Чи не
    турбуйтеся 🙂 Наша пошта знаходиться або на тому ж сервері, де і робот,
    або на іншому. Наше завдання навчитися забирати пошту з POP3 скриньки і виконувати
    дану функцію регулярно.

    Як забрати пошту з POP3 скриньки. Треба вивчити сокети і POP3. Повірте, це
    просто. Щоб зрозуміти сокети, предствьте, що це прості файли, в які можна
    писати й читати. Для забору пошти потрібно відкрити сокет з сервером пошти на 110
    порту (порт POP3 сервера). Далі, як у файл, треба написати USER
    ваш_логін
    (Приклад: fputs($sock,”USER
    dima”);
    ), Потім PASS ваш_пароль.
    Після цього командою LIST отримати список листів,
    ще командою RETR номер взяти текст листа і
    стерти його з сервера. Всього треба вивчити 6-7 команд протокала POP3. Це виходить
    за рамки даний статті.

    Тепер спробуємо запускати нашу програму кожні 5 хвилин. На жаль,
    методами ПХП безпосередньо це не можливо. Але ми спробуємо. Припустимо, на ваш сайт
    ходять люди 🙂 Якщо на ваш сайт ніхто не ходить, даний спосіб не запрацює.
    Потрібно зробити функцію (у якомусь загальному файлі), яку будуть запускати з усіх
    ваших скриптів. Функція повинна перевіряти час модифікації файлу-прапора,
    наприклад, flag.txt. Якщо час модікаціі більше,
    ніж 5 хвилин тому, то пора виконувати функіцію перевірки пошти. Після перевірки
    пошти, треба файл-прапор відкрити на запис і закрити, щоб час модифікації було
    змінено. Якщо ж час модифікації не превисело 5 хвилин, то функція нічого не
    робить. Як бачите, нічого хитрого.

    Нижче йде приклад, який описує більш конкретно реалізацію регулярного
    запуску фужного скрипта. Це не конкретна програма, а реальний приклад.


    Варіант 2: без CRON, без Command, метод пошти з файлу.
    Це означає,
    що ви як і раніше не маєте доступу ні до крону, ні до способу "command" і не
    розумієте сокетів з POP3. Тоді можна спробувати отримувати пошту методом читання
    її з файлу. Так читати можна тільки свою пошту. Своя – це та, від чийого
    користувача працює ПХП. Файл з поштою лежить в
    / Var / spool / mail / ім'я_користувача (Або
    /var/mail). Налаштовуємо регулярний запуск перевірки
    (Описаний у варіанті 1) і для зняття пошти відкриваємо файл, читаємо листи, ділимо їх
    (Там листів можнет бути від 0 і більше) за словом "From" з пропуском. Попутно думаємо,
    а хто ще буде мати доступ до цього файлу пошти.

    Варіант 3: використовуємо CRON
    Крон – це засіб викликати ваш скрипт в
    потрібний час. У варіантах 1 і 2 ми описали функцію для перевірки пошти. Тут
    налаштуємо її регулярний запуск. Якщо у вас є Телнет на сервері, пошукайте
    каталог з кроном: / etc / cron, / var / spool / cron, / var / spool / cron / crontabs /,
    / Usr / local / etc / cron і т.д. .. Спробуйте створити там файл з ім'ям свого логіна.
    Наприклад для рута – файл "root". Такий файл там вже точно буде. Якщо
    вийти, то ви можете обійтися без адміна. Створіть файл mail.php за зразком,
    описаного в першому розділі. Там повинна бути рядок
    #!/usr/bin/php, Але весь внутрішній текст доведеться
    викинути. Там треба розмітити функцію для перевірки пошти методом POP3 або з
    файлу. Тепер повернемося до крону. Для автозапуску кожні 5 хвилин вашої програми
    mail.php потрібно написати ось так: */5 * * * *
    / Шлях / до / файлу / mail.php
    Адміну сервера, якщо ви самостійно не
    можете налаштувати крон, досить назвати час запуску і шлях до файлу. Після
    пропісивнія рядки у файлі крона його потрібно перезапутіть. Або це зробить адмін,
    або ви (натиснувши Ctrl + Alt + Del на сервері), або знову ви, але віддалено – завісивши
    сервер кривої прогою на ПХП 🙂

    Варіант 4: використовуємо COMMAND – запуск по приходу листа
    Цей
    спосіб описаний в першому розділі. У файлі mail.php викидайте вміст і читайте
    прийшло лист, як простий файл. І робіть все, що потрібно.

    Підіб'ємо підсумок


    Ми дізналися про різні способи отримання пошти:


  • з вхідного потоку
  • з файлу на сервері (в одному файлі відразу кілька листів)
  • по POP3 протоколу

    Ми дізналися, як щось робити регулярно:


  • реакція на лист – метод COMMAND
  • регулярний запуск – за допомогою спеціального засобу CRON
  • майже регулярний запуск – методом перевірки останнього запуску

    Ці способи можна комбінувати. Головне – не впадати в паніку, зрозуміти теорію
    і сісти писати програму. Про конкретні незрозумілих речах завжди можна спитати.

    Ми дізналися, що самий просунутий і легкий спосіб – це метод реакції на
    лист (COMMAND), перший розділ. До нього потрібно прагнути. Писати приклади для
    інших варіантів не має сенсу. Вони, звичайно, теж будуть працювати, але …

    Ми дізналися, що КРОН – це не страшний звір, а файл всього з одним рядком
    виду * / 5 * * * * команда. Це засіб є на всіх
    Юнікс-серверах. Час можна налаштовувати дуже гнучко, але нам цього не треба
    (Тільки лише "раз на N хвилин").

    Ми дізналися, що нам швидше за все знадобитися ПХП як CGI-прогармма. Всі
    звикли використовувати ПХП, викликається через веб (тут нам тип ПХП не важливий –
    модуль Апача або CGI). А для виконання скрипта потрібно CGI. Може хтось і не
    підозрював, але ПХП це відмінний засіб для написання різних скриптів навіть у
    себе на робочому компьюетере. У Windows можна легко регулярно копіювати і
    упаковувати важливі файли, наприклад (а то дістав уже глючити). Викликається простіше
    простого: php.exe ім'я_файлу. Ще, якщо вже про Апачі
    розмова … Щоб передати параметри в пхп-файл, що викликається таким чином, треба
    зробити так: php.exe ім'я_файлу & a = 1 & b = bbbb.
    Щоб придушити рядок X-Powered-By при таким запуску: ключ
    -q.

  • Схожі статті:


    Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

    Коментарів поки що немає.

    Ваш отзыв

    Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

    *

    *