Поштовий робот і CRON, Різне, Інтернет-технології, статті

Дмитро Бородін, php.spb.ru

Поштовий робот – це програма, яка аналізує пошту, що прийшла на определнной поштову скриньку, і виробляє різні дії. Основна мета цієї статті про поштові роботах. Але раз вже тут буде згаданий крон, то і про нього.
Відразу хочеться попередити, що тут буде розказано про безліч способів зробити одну річ різними способами, тому вам доведеться трохи думати … Це до того, що до статьтье по відправці листів з аттачі постійно мають претензії різні люди, які не умееют заповнити ні “поштовий хост провайдера”, ні навіть “зворотну адресу”. Поки ви будете читати цю статтю, ви дізнаєтеся про велику кількість нюансів і зрозумієте, що питати або пояснювати в 2х словах “як зробити поштового робота?” неможливо.
CRON – засіб виконувати регулярні дії на серверах типу Unix. У Windows крон називають шедулера. Суть одна: робимо правила спрацьовування крона, наприклад раз в 2 хвилини або в 23:59 по четвергах, і що робити, наприклад запустити 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<br />


    Припустимо, ваш основний домен
    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, або
    8).

    Пункт 5 працює надійно – рекомендується. А цей – може і не працювати. Зате, якщо ви маєте Телнет-доступ на сервер, можна спробувати обійтися і без адміна. Перевіримо, чи буде працювати. Створіть файл
    /home/dima/.forward

    (Не втратьте точку). У файлі рядок:









    |/home/dima/mail.php<br />


    Даний файл
    (.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: <5995698897.20010615024928@php.spb.ru><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 хвилин, то функція нічого не робить. Як бачите, нічого хитрого.
    Нижче йде приклад, який описує більш конкретно реалізацію регулярного запуску фужного скрипта. Це не конкретна програма, а реальний приклад.






    &lt;?<br /> function my_cron_script() {<br /> /* Тут потрібно помістити команди, які будуть виконуватися раз на 5 хвилин. Уявіть, що ця функція &#8211; міні програма, тому пишіть все тільки тут. Бажано зробити найбільш швидкою, тому що браузер відвідувача буде чекати (коли проходять чергові 5 хвилин) завершення роботи всієї програми. Загалом, бажано, щоб функція працювала не болле 10 секунд.<br /> */<br /> }<br /> function check() {<br /> / / Цю функцію / виклик check () / * потрібно *: / / &#8211; Вкласти у всі ваші файли / / &#8211; Бажано в кінець / / Цю функцію * можна *: / / &#8211; Жодного разу не викликати / / &#8211; Викликати два і більше разів / / Якщо ця функція вирішить, що 5 хвилин минуло, вона / / Запустить 1 раз my_cron_script ().<br /> / / Треба створити flag.txt і дати на нього права на запис для PHP. / / Як це зробити, написано в http://php.spb.ru/php/chmod.html<br /> / / Отримуємо час модифікації (з атрибутів файлу):<br /> $t=filemtime(&#8220;flag.txt&#8221;);<br /> / / Цифра 5 в цьому прикладі &#8211; 5 хвилин<br /> if ( $t + 5*60 <Time ()) {              / / Є ймовірність, що паралельно з нами працює ще купа       / / Таких же скриптів. Щоб не допустити помилки паралельного       / / Виконання (http://php.spb.ru/php/flock.html), ми заблокуємо       / / Файл і ще раз перевіримо дату поновлення з нього.       $ F = fopen ("flag.txt","r+") Or          / / Якщо ви не дасте прав для flag.txt, побачите таку помилку на екрані:          die ("</table> </table> </table> <h1>ERROR in function check()</h1> <p>&#8220;);<br /> / / Блокуємо доступ до файлу<br /> flock($f,2);<br /> / / Читаємо час оновлення вже з файлу<br /> $t=fgets($f,100);<br /> / / &#8220;Генеральна&#8221; перевірка часу<br /> if ( $t + 5*60 &#8220;);<br />       }<br />       / / Закриваємо файл, виходимо з функції. Блокування зніміться автоматично.<br />       fclose ($ f);<br />    }<br /> }<br /> ?><br /> </ XMP><br /> </PRE><br /> </TD><br /> </TR><br /> </TBODY><br /> </TABLE><br /> </CENTER></p> <p><B>Варіант 2: без CRON, без Command, метод пошти з файлу.</B><br /> <br />Це означає, що ви як і раніше не маєте доступу ні до крону, ні до способу &#8216;command&#8217; і не розумієте сокетів з POP3. Тоді можна спробувати отримувати пошту методом читання її з файлу. Так читати можна тільки свою пошту. Своя &#8211; це та, від чийого користувача працює ПХП. Файл з поштою лежить в<br /> <TT><NOBR><B>/ Var / spool / mail / ім&#8217;я_користувача</B><br /> </NOBR><br /> </TT> (Або<br /> <TT><NOBR><B>/var/mail</B><br /> </NOBR><br /> </TT> ). Налаштовуємо регулярний запуск перевірки (Описаний у варіанті 1) і для зняття пошти відкриваємо файл, читаємо листи, ділимо їх (Там листів можнет бути від 0 і більше) по слову &#8220;From&#8221; з пропуском. Попутно думаємо, а хто ще буде мати доступ до цього файлу пошти. </p> <p><B>Варіант 3: використовуємо CRON</B><br /> <br />Крон &#8211; це засіб викликати ваш скрипт у потрібний час. У варіантах 1 і 2 ми описали функцію для перевірки пошти. Тут налаштуємо її регулярний запуск. Якщо у вас є Телнет на сервері, пошукайте каталог з кроном: / etc / cron, / var / spool / cron, / Var / spool / cron / crontabs /, / usr / local / etc / cron і т.д. .. Спробуйте створити там файл з ім&#8217;ям свого логіна. Приміром для рута &#8211; файл &#8220;root&#8221;. Такий файл там вже точно буде. Якщо вийти, то ви можете обійтися без адміна. Створіть файл mail.php за зразком, описаного в першому розділі. Там повинна бути рядок<br /> <TT><NOBR><B>#!/usr/bin/php</B><br /> </NOBR><br /> </TT> , Але весь внутрішній текст доведеться викинути. Там треба розмітити функцію для перевірки пошти методом POP3 або з файлу. Тепер повернемося до крону. Для автозапуску кожні 5 хвилин вашої програми mail.php потрібно написати ось так: <TT><NOBR><B>*/5 * * * * / Шлях / до / файлу / mail.php</B><br /> </NOBR><br /> </TT> Адміну сервера, якщо ви самостійно не можете налаштувати крон, досить назвати час запуску і шлях до файлу. Після пропісивнія рядки у файлі крона його потрібно перезапутіть. Або це зробить адмін, або ви (натиснувши Ctrl + Alt + Del на сервері), або знову ви, але віддалено &#8211; завісивши сервер кривої прогою на ПХП 🙂 </p> <p><B>Варіант 4: використовуємо COMMAND &#8211; запуск по приходу листа</B><br /> <br />Цей спосіб описаний в першому розділі. У файлі mail.php викидайте вміст і читайте прийшло лист, як простий файл. І робіть все, що потрібно. </p> <p>Підіб&#8217;ємо підсумок</p> <p> Ми дізналися про різні способи отримання пошти:<br /> <LI>з вхідного потоку<br /> <LI>з файлу на сервері (в одному файлі відразу кілька листів)<br /> <LI>по POP3 протоколу <br />Ми дізналися, як щось робити регулярно:<br /> <LI>реакція на лист &#8211; метод COMMAND<br /> <LI>регулярний запуск &#8211; за допомогою спеціального засобу CRON<br /> <LI>майже регулярний запуск &#8211; методом перевірки останнього запуску </p> <p>Ці способи можна комбінувати. Головне &#8211; не впадати в паніку, зрозуміти теорію і сісти писати програму. Про конкретні незрозумілих речах завжди можна запитати. </p> <p>Ми дізналися, що самий просунутий і легкий спосіб &#8211; це метод реакції на лист (COMMAND), перша глава. До нього потрібно прагнути. Писати приклади для інших варіантів не має сенсу. Вони, звичайно, теж будуть працювати, але &#8230;<br /> <br />Ми дізналися, що КРОН &#8211; це не страшний звір, а файл всього з одного рядком виду <TT><NOBR><B>* / 5 **** команда</B><br /> </NOBR><br /> </TT> . Цей засіб є на всіх Юнікс-серверах. Час можна налаштовувати дуже гнучко, але нам цього не треба (тільки лише &#8220;раз в N хвилин&#8221;). <br />Ми дізналися, що нам швидше за все знадобитися ПХП як CGI-прогармма. Всі звикли використовувати ПХП, що викликається через веб (тут нам тип ПХП не важливий &#8211; модуль Апача або CGI). А для виконання скрипта потрібно CGI. Може хто і не підозрював, але ПХП це відмінний засіб для написання різних скриптів навіть у себе на робочому компьюетере. У Windows можна легко регулярно копіювати й упаковувати важливі файли, наприклад (а то дістав вже глючить). Викликається простіше простого: <TT><NOBR><B>php.exe ім&#8217;я_файлу</B><br /> </NOBR><br /> </TT> . Ще, якщо вже про Апачі розмова &#8230; Щоб передати параметри в пхп-файл, що викликається таким чином, треба зробити так:<br /> <TT><NOBR><B>php.exe ім&#8217;я_файлу &#038; a = 1 &#038; b = bbbb</B><br /> </NOBR><br /> </TT> . Щоб придушити рядок X-Powered-By при таким запуску: ключ<br /> <TT><NOBR><B>-q</B><br /> </NOBR><br /> </TT><br /> .</p> <div class="ad-top2"> <!-- Top article #956715 --> <script>(function(e){var t="DIV_DA_"+e+"_"+parseInt(Math.random()*1e3); document.write('<div id="'+t+'" class="directadvert-block directadvert-block-'+e+'"></div>'); if("undefined"===typeof loaded_blocks_directadvert){loaded_blocks_directadvert=[]; function n(){var e=loaded_blocks_directadvert.shift(); var t=e.adp_id; var r=e.div; var i=document.createElement("script"); i.type="text/javascript"; i.async=true; i.charset="windows-1251"; i.src="//code.directadvert.ru/data/"+t+".js?async=1&div="+r+"&t="+Math.random(); var s=document.getElementsByTagName("head")[0]||document.getElementsByTagName("body")[0]; s.appendChild(i); var o=setInterval(function(){if(document.getElementById(r).innerHTML&&loaded_blocks_directadvert.length){n(); clearInterval(o)}},50)} setTimeout(n)}loaded_blocks_directadvert.push({adp_id:e,div:t})})(956715)</script> </div> <div style="float:right"> <div class="yashare-auto-init" data-yashareL10n="ua" data-yashareType="icon" data-yashareQuickServices="yaru,vkontakte,facebook,twitter,odnoklassniki,moimir,lj,moikrug,gplus"></div> </div> <h4>Схожі статті:</h4><ul><li><a href="http://easy-code.com.ua/2010/12/sekreti-stvorennya-velikogo-spisku-rozsilki/" title="Секрети створення великого списку розсилки.">Секрети створення великого списку розсилки.</a> (0)</li><li><a href="http://easy-code.com.ua/2010/12/meta-tegi-optimizaciya/" title="Мета - теги, оптимізація.">Мета - теги, оптимізація.</a> (0)</li><li><a href="http://easy-code.com.ua/2010/11/veb-2-0-privertaye-vse-bilshe-uvagi/" title="Веб 2.0 привертає все більше уваги.">Веб 2.0 привертає все більше уваги.</a> (0)</li><li><a href="http://easy-code.com.ua/2010/11/slovo-na-zaxist-yandeksa/" title="Слово на захист Яндекса">Слово на захист Яндекса</a> (0)</li><li><a href="http://easy-code.com.ua/2010/11/yak-stati-vidminnim-dizajnerom-50-rad/" title="Як стати відмінним дизайнером. 50 рад.">Як стати відмінним дизайнером. 50 рад.</a> (1)</li><li><a href="http://easy-code.com.ua/2010/10/myake-pidvishhennya-ic-ta-pr/" title="М&#39;яке підвищення ІЦ та PR">М&#39;яке підвищення ІЦ та PR</a> (0)</li><li><a href="http://easy-code.com.ua/2010/12/web-2-0-dlya-dizajneriv/" title="Web 2.0 для дизайнерів.">Web 2.0 для дизайнерів.</a> (0)</li></ul> <!--for paginate posts--> <hr/> <p><strong><em> Сподобалася стаття? Ви можете <a href="#comments"> залишити відгук </a> або <a href = "http://easy-code.com.ua/feed/" > підписатися на RSS </a>, щоб автоматично отримувати інформацію про нові статтях. </em></strong></p> <!--Post Meta--> <div class="post-meta"> <strong>Метки: </strong><a href="http://easy-code.com.ua/tag/zrobiti/" rel="tag">зробити</a>, <a href="http://easy-code.com.ua/tag/katalog/" rel="tag">каталог</a>, <a href="http://easy-code.com.ua/tag/potribno/" rel="tag">потрібно</a>, <a href="http://easy-code.com.ua/tag/robota/" rel="tag">робота</a>, <a href="http://easy-code.com.ua/tag/server/" rel="tag">сервер</a>, <a href="http://easy-code.com.ua/tag/tilki/" rel="tag">тільки</a>, <a href="http://easy-code.com.ua/tag/xvilin/" rel="tag">хвилин</a><br /> <strong>Рубрики:</strong> <a href="http://easy-code.com.ua/category/rizne/" rel="category tag">Різне</a> </div> <!--include comments template--> <div id="comments-wrap"> <p>Коментарів поки що немає.</p> <!-- <p><a href="http://easy-code.com.ua/2012/09/poshtovij-robot-i-cron-rizne-internet-texnologi%d1%97-statti/feed/">RSS-стрічка коментарів.</a> <a href="http://easy-code.com.ua/2012/09/poshtovij-robot-i-cron-rizne-internet-texnologi%d1%97-statti/trackback/" rel="trackback">Адреса для трекбек</a> </p> --> <h3 class="postcomment">Ваш отзыв</h3> <p>Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <code>&lt;a href=&quot;&quot; title=&quot;&quot;&gt; &lt;abbr title=&quot;&quot;&gt; &lt;acronym title=&quot;&quot;&gt; &lt;b&gt; &lt;blockquote cite=&quot;&quot;&gt; &lt;cite&gt; &lt;code&gt; &lt;del datetime=&quot;&quot;&gt; &lt;em&gt; &lt;i&gt; &lt;q cite=&quot;&quot;&gt; &lt;s&gt; &lt;strike&gt; &lt;strong&gt; </code></p> <form action="http://easy-code.com.ua/wp-comments-post.php" method="post" id="commentform"> <p> <input type="text" name="author" id="author" class="textarea" value="" size="28" tabindex="1" /> <label for="author">Им'я</label> * </p> <p> <input type="text" name="email" id="email" value="" size="28" tabindex="2" /> <label for="email">E-mail</label> * </p> <p> <input type="text" name="url" id="url" value="" size="28" tabindex="3" /> <label for="url">Сайт</label> </p> <p> <label for="comment">Повідомлення</label> <br /> <textarea name="comment" id="comment" cols="60" rows="10" tabindex="4"></textarea> </p> <p> <input name="submit" id="submit" type="submit" tabindex="5" value="відправити" /> <input type="hidden" name="comment_post_ID" value="19397" /> <input type="hidden" name="redirect_to" value="/2012/09/poshtovij-robot-i-cron-rizne-internet-texnologi%D1%97-statti/" /> </p> <p style="display: none;"><input type="hidden" id="akismet_comment_nonce" name="akismet_comment_nonce" value="adc568b3ad" /></p><p style="display: none;"><input type="hidden" id="ak_js" name="ak_js" value="105"/></p></form> </div> <!--do not delete--> <!--single.php end--> </div> <!--include sidebar--> <!--sidebar.php--> <div id="sidebar"> <div class="sidebar-rss"> <h3>Подписка через RSS</h3> <p><a href="http://easy-code.com.ua/feed/"><img src="http://easy-code.com.ua/wp-content/themes/elegantblue/images/rss.jpg" alt="Подписка на RSS" ></img></a>Якщо вам сподобалася інформація на нашому сайті, ви можете підписатися на оновлення через RSS.</p> </div> <BR> <div class="something"> <a href='http://easy-code.com.ua/tag/download/' class='tag-link-563 tag-link-position-1' title='648 topics' style='font-size: 12.328358208955pt;'>Download</a> <a href='http://easy-code.com.ua/tag/microsoft/' class='tag-link-66 tag-link-position-2' title='772 topics' style='font-size: 13.522388059701pt;'>Microsoft</a> <a href='http://easy-code.com.ua/tag/oracle/' class='tag-link-18322 tag-link-position-3' title='357 topics' style='font-size: 8.4477611940299pt;'>Oracle</a> <a href='http://easy-code.com.ua/tag/windows/' class='tag-link-18319 tag-link-position-4' title='1,383 topics' style='font-size: 17.253731343284pt;'>Windows</a> <a href='http://easy-code.com.ua/tag/internet/' class='tag-link-132 tag-link-position-5' title='366 topics' style='font-size: 8.5970149253731pt;'>Інтернет</a> <a href='http://easy-code.com.ua/tag/merezhi/' class='tag-link-143 tag-link-position-6' title='438 topics' style='font-size: 9.7910447761194pt;'>Мережі</a> <a href='http://easy-code.com.ua/tag/modeli/' class='tag-link-530 tag-link-position-7' title='360 topics' style='font-size: 8.5970149253731pt;'>моделі</a> <a href='http://easy-code.com.ua/tag/mozhete/' class='tag-link-3 tag-link-position-8' title='569 topics' style='font-size: 11.582089552239pt;'>можете</a> <a href='http://easy-code.com.ua/tag/mozhut/' class='tag-link-311 tag-link-position-9' title='384 topics' style='font-size: 9.044776119403pt;'>можуть</a> <a href='http://easy-code.com.ua/tag/dopomogoyu/' class='tag-link-273 tag-link-position-10' title='731 topics' style='font-size: 13.074626865672pt;'>допомогою</a> <a href='http://easy-code.com.ua/tag/dozvolyaye/' class='tag-link-542 tag-link-position-11' title='664 topics' style='font-size: 12.477611940299pt;'>дозволяє</a> <a href='http://easy-code.com.ua/tag/kompani%d1%97/' class='tag-link-554 tag-link-position-12' title='546 topics' style='font-size: 11.283582089552pt;'>компанії</a> <a href='http://easy-code.com.ua/tag/koristuvachiv/' class='tag-link-137 tag-link-position-13' title='337 topics' style='font-size: 8.1492537313433pt;'>користувачів</a> <a href='http://easy-code.com.ua/tag/potribno/' class='tag-link-18 tag-link-position-14' title='566 topics' style='font-size: 11.432835820896pt;'>потрібно</a> <a href='http://easy-code.com.ua/tag/programi/' class='tag-link-387 tag-link-position-15' title='1,547 topics' style='font-size: 18pt;'>програми</a> <a href='http://easy-code.com.ua/tag/prosto/' class='tag-link-99 tag-link-position-16' title='328 topics' style='font-size: 8pt;'>просто</a> <a href='http://easy-code.com.ua/tag/vikoristannya/' class='tag-link-690 tag-link-position-17' title='368 topics' style='font-size: 8.7462686567164pt;'>використання</a> <a href='http://easy-code.com.ua/tag/vikoristovuvati/' class='tag-link-890 tag-link-position-18' title='427 topics' style='font-size: 9.6417910447761pt;'>використовувати</a> <a href='http://easy-code.com.ua/tag/znachennya/' class='tag-link-198 tag-link-position-19' title='1,003 topics' style='font-size: 15.164179104478pt;'>значення</a> <a href='http://easy-code.com.ua/tag/roboti/' class='tag-link-123 tag-link-position-20' title='1,104 topics' style='font-size: 15.761194029851pt;'>роботи</a> <a href='http://easy-code.com.ua/tag/rozrobki/' class='tag-link-1235 tag-link-position-21' title='328 topics' style='font-size: 8pt;'>розробки</a> <a href='http://easy-code.com.ua/tag/sistemi/' class='tag-link-476 tag-link-position-22' title='1,131 topics' style='font-size: 15.910447761194pt;'>системи</a> <a href='http://easy-code.com.ua/tag/upravlinnya/' class='tag-link-556 tag-link-position-23' title='760 topics' style='font-size: 13.373134328358pt;'>управління</a> <a href='http://easy-code.com.ua/tag/server/' class='tag-link-197 tag-link-position-24' title='650 topics' style='font-size: 12.328358208955pt;'>сервер</a> <a href='http://easy-code.com.ua/tag/stvorennya/' class='tag-link-439 tag-link-position-25' title='460 topics' style='font-size: 10.089552238806pt;'>створення</a> <a href='http://easy-code.com.ua/tag/tablici/' class='tag-link-496 tag-link-position-26' title='469 topics' style='font-size: 10.238805970149pt;'>таблиці</a> <a href='http://easy-code.com.ua/tag/tilki/' class='tag-link-6 tag-link-position-27' title='1,295 topics' style='font-size: 16.805970149254pt;'>тільки</a> <a href='http://easy-code.com.ua/tag/fajliv/' class='tag-link-293 tag-link-position-28' title='410 topics' style='font-size: 9.3432835820896pt;'>файлів</a> <a href='http://easy-code.com.ua/tag/funkci%d1%97/' class='tag-link-218 tag-link-position-29' title='439 topics' style='font-size: 9.7910447761194pt;'>функції</a> <a href='http://easy-code.com.ua/tag/informaci%d1%97/' class='tag-link-24 tag-link-position-30' title='368 topics' style='font-size: 8.7462686567164pt;'>інформації</a></div> <!--l_sidebar.php--> <div id="l_sidebar"> <ul> <br> <!--favorite posts--> <li> <h2>Нове на сайті</h2> <ul> <li><a href='http://easy-code.com.ua/2015/11/keruyuchi-klavishi-i-menyu-informix/'>Керуючі клавіші і меню INFORMIХ</a></li> <li><a href='http://easy-code.com.ua/2015/10/vipushheno-reliz-fastreport-fmx/'>Випущено реліз FastReport FMX</a></li> <li><a href='http://easy-code.com.ua/2015/10/oracle/'>Oracle</a></li> <li><a href='http://easy-code.com.ua/2015/09/func-hgi-35i-vertolit-z-keruvannyam-vid-iphone/'>Func HGI-35i: вертоліт з керуванням від iPhone</a></li> <li><a href='http://easy-code.com.ua/2015/08/faq-po-grafiku-i-animaciyu-dlya-web/'>FAQ по графіку і анімацію для Web</a></li> <li><a href='http://easy-code.com.ua/2015/07/funkciya-viznachennya-kilkosti-robochix-dniv/'>Функція визначення кількості робочих днів</a></li> <li><a href='http://easy-code.com.ua/2015/07/inshi-mozhlivosti-obyednannya-fajliv/'>Інші можливості об&#8217;єднання файлів</a></li> <li><a href='http://easy-code.com.ua/2015/07/oglyad-navushnikiv-z-aktivnim-shumozaglushennyam-asus-nc1/'>Огляд навушників з активним шумозаглушенням ASUS NC1</a></li> <li><a href='http://easy-code.com.ua/2015/06/net-service-oriented-architecture-soa/'>.NET: Service Oriented Architecture (SOA)</a></li> <li><a href='http://easy-code.com.ua/2015/06/oglyad-behold-betab-7004/'>Огляд Behold BeTAB 7004</a></li> </ul> </li> <li> <h2>Реклама</h2> <ul> <div class="adcontentcen1"> <!-- Sidebar 160x600 #956693 --> <script>(function(e){var t="DIV_DA_"+e+"_"+parseInt(Math.random()*1e3); document.write('<div id="'+t+'" class="directadvert-block directadvert-block-'+e+'"></div>'); if("undefined"===typeof loaded_blocks_directadvert){loaded_blocks_directadvert=[]; function n(){var e=loaded_blocks_directadvert.shift(); var t=e.adp_id; var r=e.div; var i=document.createElement("script"); i.type="text/javascript"; i.async=true; i.charset="windows-1251"; i.src="//code.directadvert.ru/data/"+t+".js?async=1&div="+r+"&t="+Math.random(); var s=document.getElementsByTagName("head")[0]||document.getElementsByTagName("body")[0]; s.appendChild(i); var o=setInterval(function(){if(document.getElementById(r).innerHTML&&loaded_blocks_directadvert.length){n(); clearInterval(o)}},50)} setTimeout(n)}loaded_blocks_directadvert.push({adp_id:e,div:t})})(956693)</script> </div> </ul> </li> </ul> </div> <!--l_sidebar.php end--> <!--r_sidebar.php--> <div id="r_sidebar"> <ul> <br> <li> <h2>Популярне</h2> <ul> <!-- 2017-09-21 10:45:04 --> <li><a href="http://easy-code.com.ua/2010/10/klasifikaciya-veb-resursiv/">Класифікація веб-ресурсів (8)</a></li> <li><a href="http://easy-code.com.ua/2012/08/analiz-ta-proektuvannya-vizualne-modelyuvannya-uml-rational-rose-case-zasobi-modelyuvannya-programuvannya-statti/">Аналіз та проектування. Візуальне моделювання (UML) Rational Rose, CASE-засоби (моделювання), Програмування, статті (10)</a></li> <li><a href="http://easy-code.com.ua/2012/09/yak-vidaliti-numeraciyu-storinok-ms-office-programni-kerivnictva-statti/">Як видалити нумерацію сторінок, MS Office, Програмні керівництва, статті (8)</a></li> <li><a href="http://easy-code.com.ua/2012/08/oblikova-politika-vnutrishnofirmovi-standarti-upravlinskogo-obliku-komerciya-rizne-statti/">Облікова політика. Внутрішньофірмові стандарти управлінського обліку, Комерція, Різне, статті (16)</a></li> <li><a href="http://easy-code.com.ua/2012/08/yak-zminiti-mizhbukvenij-interval-ms-office-programni-kerivnictva-statti/">Як змінити міжбуквений інтервал, MS Office, Програмні керівництва, статті (26)</a></li> <li><a href="http://easy-code.com.ua/2014/07/stvorennya-panelej-instrumentiv-i-menyu/">Створення панелей інструментів і меню (8)</a></li> <li><a href="http://easy-code.com.ua/2011/08/svitovij-rinok-sistem-elektronnogo-dokumentoobigu/">Світовий ринок систем електронного документообігу (6)</a></li> <li><a href="http://easy-code.com.ua/2012/08/modelyuvannya-texnichnix-sistem-c-allfusion-process-modeler-ranishe-bpwin-komerciya-rizne-statti/">Моделювання технічних систем c AllFusion Process Modeler (раніше BPwin), Комерція, Різне, статті (10)</a></li> <li><a href="http://easy-code.com.ua/2011/04/panel-instrumentiv-formi-u-word/">Панель інструментів ФОРМИ у Word (18)</a></li> <li><a href="http://easy-code.com.ua/2011/03/corel-draw-redaguvannya-i-vidilennya/">Corel Draw: Редагування і виділення (7)</a></li> <li><a href="http://easy-code.com.ua/2011/03/robota-z-fajlami-v-komandnomu-ryadku-operacijnix-sistem/">Робота з файлами в командному рядку операційних систем. (13)</a></li> <li><a href="http://easy-code.com.ua/2012/08/case-zasobi-zagalna-xarakteristika-i-klasifikaciya-komerciya-rizne-statti/">CASE-засоби. Загальна характеристика і класифікація, Комерція, Різне, статті (12)</a></li> <li><a href="http://easy-code.com.ua/2012/08/vstavka-i-peremishhennya-zobrazhen-v-word-2010-ms-office-programni-kerivnictva-statti/">Вставка і переміщення зображень в Word 2010, MS Office, Програмні керівництва, статті (15)</a></li> <li><a href="http://easy-code.com.ua/2011/01/recenzuvannya-dokumentiv-u-word/">Рецензування документів у Word (22)</a></li> <li><a href="http://easy-code.com.ua/2012/08/yak-vstaviti-alfavitnij-predmetnij-pokazhchik-v-dokument-ms-office-programni-kerivnictva-statti/">Як вставити алфавітний (предметний) покажчик в документ, MS Office, Програмні керівництва, статті (11)</a></li> <li><a href="http://easy-code.com.ua/2010/12/programuvannya-na-movi-delphi-glava-7-proekt-programi/">Програмування на мові Delphi. Глава 7. Проект програми (16)</a></li> <li><a href="http://easy-code.com.ua/2012/08/gibernaciya-son-i-gibridnij-splyachij-rezhim-v-windows-7-pitannya-i-vidpovidi-windows-operacijni-sistemi-statti/">Гібернація, сон і гібридний сплячий режим в Windows 7 &#8211; питання і відповіді, Windows, Операційні системи, статті (9)</a></li> <li><a href="http://easy-code.com.ua/2012/09/zasobi-rozrobki-dodatkiv-rizne-programuvannya-statti/">Засоби розробки додатків, Різне, Програмування, статті (9)</a></li> <li><a href="http://easy-code.com.ua/2012/07/opis-biznes-procesiv-sadt-idef0-idef3-dfd-uml-aris-case-zasobi-modelyuvannya-programuvannya-statti/">Опис бізнес-процесів: SADT, IDEF0, IDEF3, DFD, UML, ARIS, CASE-засоби (моделювання), Програмування, статті (20)</a></li> <li><a href="http://easy-code.com.ua/2012/08/nalashtuvannya-ekrannix-zastavok-v-windows-7-za-dopomogoyu-reyestru-windows-operacijni-sistemi-statti/">Налаштування екранних заставок в Windows 7 за допомогою реєстру, Windows, Операційні системи, статті (26)</a></li> <!-- 2017-09-21 10:45:04 --></ul> </li> </ul> </div> <!--r_sidebar.php end--> </div> <!--sidebar.php end--><!--include footer--> </div> <div id="footer"> <p> При використанні матеріалів даного сайту пряме і явне посилання на сайт <a href="http://www.easy-code.com.ua/"> www.easy-code.com.ua </a> є обов'язковим. </p> <!--footer.php--> <div id="footer-wrap"> <noindex> <!--LiveInternet counter--><script type="text/javascript"><!-- document.write("<a href='http://www.liveinternet.ru/click' "+ "target=_blank><img src='//counter.yadro.ru/hit?t19.6;r"+ escape(document.referrer)+((typeof(screen)=="undefined")?"": ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth? screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+ ";"+Math.random()+ "' alt='' title='LiveInternet: показано число просмотров за 24"+ " часа, посетителей за 24 часа и за сегодня' "+ "border='0' width='88' height='31'><\/a>") //--></script><!--/LiveInternet--> <!-- Yandex.Metrika counter --> <div style="display:none;"><script type="text/javascript"> (function(w, c) { (w[c] = w[c] || []).push(function() { try { w.yaCounter10604395 = new Ya.Metrika({id:10604395, enableAll: true}); } catch(e) { } }); })(window, "yandex_metrika_callbacks"); </script></div> <script src="//mc.yandex.ru/metrika/watch.js" type="text/javascript" defer="defer"></script> <noscript><div><img src="//mc.yandex.ru/watch/10604395" style="position:absolute; left:-9999px;" alt="" /></div></noscript> <!-- /Yandex.Metrika counter --> <script type="text/javascript" src="//yandex.st/share/share.js" charset="utf-8"></script> <script type="text/javascript" src="https://apis.google.com/js/plusone.js"> {lang: 'ru'} </script> </noindex> <BR><strong>ЕasyСode</strong> <!--necessary--> <script type='text/javascript' src='http://easy-code.com.ua/wp-content/plugins/akismet/_inc/form.js?ver=3.3'></script> <script type='text/javascript' src='http://easy-code.com.ua/wp-includes/js/wp-embed.min.js?ver=4.7.6'></script> <script type='text/javascript' src='http://easy-code.com.ua/wp-includes/js/jquery/jquery.js?ver=1.12.4'></script> <script type='text/javascript' src='http://easy-code.com.ua/wp-includes/js/jquery/jquery-migrate.min.js?ver=1.4.1'></script> <script type='text/javascript' src='http://easy-code.com.ua/wp-content/plugins/easy-fancybox/fancybox/jquery.fancybox-1.3.8.min.js?ver=1.5.8.2'></script> <script type='text/javascript' src='http://easy-code.com.ua/wp-content/plugins/easy-fancybox/js/jquery.easing.min.js?ver=1.3.2'></script> <script type='text/javascript' src='http://easy-code.com.ua/wp-content/plugins/easy-fancybox/js/jquery.mousewheel.min.js?ver=3.1.12'></script> <script type="text/javascript"> jQuery(document).on('ready post-load', function(){ jQuery('.nofancybox,a.pin-it-button,a[href*="pinterest.com/pin/create/button"]').addClass('nolightbox'); }); jQuery(document).on('ready post-load',easy_fancybox_handler); jQuery(document).on('ready',easy_fancybox_auto);</script> </div> </div> <div class="soc-buttons"> <div class="yashare-auto-init" data-yashareL10n="ru" data-yashareQuickServices="vkontakte,facebook,twitter,odnoklassniki,moimir,gplus" data-yashareTheme="counter"></div> </div> <script>!window.jQuery && document.write('<script src="http://yastatic.net/jquery/2.1.3/jquery.min.js"><\/script>');</script> <script src="http://easy-code.com.ua/wp-content/themes/elegantblue/js/jquery.hc-sticky.min.js"></script> <script> jQuery(document).ready(function($){ $('.soc-buttons').hcSticky({ top: 25, bottomEnd: 90, wrapperClassName: 'sidebar-sticky2', noContainer: false }); }); </script> <script type="text/javascript" src="//yastatic.net/share/share.js" charset="utf-8"></script> </body> </html>