Способи обробки пошти:, Різне, PHP, статті

  • Спосіб “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<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>

    *

    *