<
  • Главная
Статьи

Реальні веб-проекти на PHP і MySQL. Розробка поштової служби з веб-інтерфейсом: Частина 1.План побудови поштової служби і реалізація бази даних проекту

  1. Серія контенту:
  2. Цей контент є частиною серії: Реальні веб-проекти на PHP і MySQL. Розробка поштової служби з веб-інтерфейсом
  3. 1. Введення
  4. Модулі вирішення поставленого завдання
  5. Загальна схема рішення
  6. Створення бази даних
  7. Основна бібліотека mail-фукнции
  8. висновки
  9. Ресурси для скачування

Реальні веб-проекти на PHP і MySQL. Розробка поштової служби з веб-інтерфейсом

Серія контенту:

Цей контент є частиною # з серії # статей: Реальні веб-проекти на PHP і MySQL. Розробка поштової служби з веб-інтерфейсом

https://www.ibm.com/developerworks/ru/library/?series_title_by=**auto**

Слідкуйте за виходом нових статей цієї серії.

Цей контент є частиною серії: Реальні веб-проекти на PHP і MySQL. Розробка поштової служби з веб-інтерфейсом

Слідкуйте за виходом нових статей цієї серії.

1. Введення

У попередніх статтях багаторазово описувалися питання настройки і запуску в експлуатацію найрізноманітніших поштових служб, - таких як sendmail, postfix, exim, Communigate, qmail, що використовують в якості системної платформи найширший спектр сучасних Linux- і BSD-систем. В даний час, у міру розвитку web все частіше і частіше виникає питання про актуальність користуватися послугами електронної пошти, заснованої на веб. У цій серії статей будуть розглянуті питання, присвячені реалізації веб-інтерфейсу до існуючого поштового сервера з використанням PHP-бібліотек, що підтримують IMAP.

За допомогою такого інтерфейсу можна буде переглядати вміст своєї поштової скриньки прямо на веб-сторінці. Якщо розширити проект і посилити його, то він легко може перетворитися в реальну багато користувачів поштову систему, на зразок mail.ru.

В рамках цього проекту планується розробити поштовий клієнт під гіпотетичним назвою «Безпечна і швидка пошта», який може запропонувати користувачам наступні функції:

  1. підключення до своїх облікових записів на поштових серверах POP і IMAP;
  2. читання приходять поштових повідомлень;
  3. відправка своїх повідомлень електронної пошти;
  4. відправка відповідей на повідомлення, що прийшли;
  5. переадресація повідомлень;
  6. видалення непотрібних повідомлень зі своєї поштової скриньки.

Для реалізації цього широкого спектра завдань необхідно знайти можливість для підключення користувача до працюючого поштового сервера, крім того, там же повинен знаходитися і веб-сервер. В рамках спільної справи має бути налагоджена взаємодія з поштовою скринькою користувача для індивідуальної обробки всіх повідомлень.

Для забезпечення можливості читання повідомлень на сервері повинні функціонувати протоколи POP і IMAP (див. RFC 1939). Бажана підтримка обох протоколів, але більш зручним і безпечним на сьогоднішній день вважається IMAP (Internet Message Access Protocol - протокол доступу до електронної пошти). У загальному випадку POP3 призначений для короткого взаємодії з сервером з метою завантаження, читання і / або видалення поштових повідомлень. Протокол IMAP більше орієнтований на використання в режимі постійного підключення до мережі і сервера, на якому розгорнута поштова служба. Жоден з цих протоколів не призначений для відправки пошти - для цього служить протокол SMTP (див. RFC821).

Модулі вирішення поставленого завдання

В рамках PHP реалізована підтримка обох протоколів, але вона поставляється через бібліотеку функцій IMAP. Для нормальної роботи всього викладеного матеріалу в системі повинна бути встановлена ​​бібліотека IMAP. Встановлено вона чи ні в системі, покаже інформація у висновку функції phpinfo (). Якщо бібліотека не встановлена, то отримати її можна тут: ftp://ftp.cac.washington.edu/imap/.

У разі виникнення проблем при компіляції бібліотеки в UNIX / Linux середовищі рекомендується використовувати її більш стабільну версію IMAP-2001. Потім бажано створити підкаталог в робочому для веб-сервера каталозі, наприклад з ім'ям imap / lib і imap / include. Далі потрібно скопіювати всі файли * .h з місця інсталяції бібліотеки IMAP в підкаталог / imap / include. Потім, в разі успішної компіляції з'явиться файлик c-client.a і його треба перейменувати в libc-client.a і скопіювати в imap / lib /.

Після чого потрібно запустити PHP-сценарій конфігурації, додавши директиву -with-imap = dirname (тут dirname - ім'я створеного каталогу) до набору директив, які використовуються в системі і перекомпіліровать PHP для підтримки IMAP.

У Windows для доступу до розширення IMAP потрібно буде відкрити файл php.ini і розкоментувати рядок extension = php_imap.dll, після цього веб-сервер треба буде перезавантажити.

Закріпити розширення IMAP можна, виконавши функцію phpinfo (). У висновку цієї функції повинен бути розділ, присвячений IMAP.

Сама бібліотека IMAP містить дуже багато функцій, але в даному циклі статей будуть розглядатися тільки такі:

  1. imap_open ();
  2. imap_close ();
  3. imap_header ();
  4. imap_headers ();
  5. imap_fetchheader ();
  6. imap_body ();
  7. imap_delete ();
  8. imap_expunge ()

Для отримання можливості роботи з поштою необхідно мати на сервері обліковий запис для конкретного користувача і володіти на її паролем. На основі СУБД MySQL облікові записи користувачів і їх паролі будуть зберігатися в структурованому вигляді, а система буде отримувати до них швидкий і виборчий доступ. Якщо взяти до уваги той факт, що користувачі люблять мати по кілька облікових записів - кожну для різних цілей, то буде потрібно забезпечити зберігання в базі даних декількох наборів даних про облікові записи для кожного користувача.

Кожен користувач повинен мати можливість читати повідомлення, відповідати на них, пересилати та видаляти існуючі, а також відправляти новостворені. Всі функції з читання треба буде покласти на протоколи IMAP і POP3, а операції з відправлення повідомлень - на протокол SMTP, який можна буде активувати функцією mail ().

Загальна схема рішення

Першим кроком в роботі системи повинен бути вхід користувача з його подальшою авторизацією, після чого йому може бути наданий список необхідних опцій. У цьому випадку він може створити новий обліковий запис або вибрати для використання одну з уже існуючих. Крім того, повинні бути реалізовані такі можливості як перегляд входять поштових повідомлень, відповідь на них, переадресації, видалення і відправка нових повідомлень.

Великим плюсом буде наявність побачити назви з додатковою інформацією, пов'язаною з конкретними повідомленнями. Саме перегляд заголовків дає можливість визначити, звідки прийшло це повідомлення і зрозуміти, чи потрібно його вам читати і тим більше відповідати на нього. Крім цього, така інформація дає можливість переглянути весь процес подорожі повідомлення від хоста до хосту.

І, нарешті, по цій інформації можна дізнатися, яким саме поштовим клієнтом користується ваш опонент і при необхідності запропонувати йому перейти на аналогічне і більш захищене відкрите рішення.

Створення бази даних

В цьому випадку база даних під проект буде досить простий. Все що там має бути - відомості про користувачів системи, причому для кожного з них потрібно передбачити існування наступних полів:

  1. username - ім'я користувача системи;
  2. password - пароль користувача;
  3. address - вказується користувачем адресу електронної пошти, який відображається в заголовку "from" повідомлення;
  4. displayname - ім'я, яке буде відображатися в відправлених повідомленнях;

для кожного облікового запису, крім того, потрібно буде зберігати наступне:

  1. username - ім'я користувача додатки «Безпечна і швидка пошта», якому належить обліковий запис;
  2. server - машина, на якій розміщена обліковий запис користувача;
  3. port - порт, до якого потрібно з'єднатися від імені цього облікового запісіс. Як правило, для POP3 - це 110 порт, для IMAP 143.
  4. type - протокол, який використовується для підключення до даного сервера (POP3 або IMAP).
  5. remoteuser - ім'я користувача для підключення до поштового сервера;
  6. accounted - унікальний ідентифікатор, ключ, службовець для ототожнення облікових записів.

Для створення бази даних використовується наступний SQL-код:

create database mail; use mail; create table users (username char (16) not null primary key, password char (40) not null, address char (100) not null, displayname char (100) not null); create table accounts (username char (16) not null, server char (100) not null, port int not null, type char (4) not null, remoteuser char (50) not null, remotepassword char (50) not null, accountid int unsigned not null auto_increment primary key); grant select, insert, update, delete on mail. * to mail @ localhost identified by 'password';

Ви самі можете додати в вікні phpMyAdmin або в консолі сервера командою:

mysql -u root -p <create_database.sql

(Скрипт, що містить наведений вище код).

Код, представлений нижче, дозволяє завести користувача user в систему з паролем password. Для додавання інших користувачів потрібно видозмінити цей код і додати до нього все те, що потрібно.

use mail; insert into users values ​​( 'user', sha1 ( 'password'), '[email protected]', 'Ім'я, прізвище'); insert into accounts values ​​( 'user', 'localhost', '110', 'POP3', 'user', 'password', ''), ( 'user', 'localhost', '143', 'IMAP', 'user', 'password', '');

Основна бібліотека mail-фукнции

Перша сторінка сайту буде виглядати як на рис.1, а основні функції, пов'язані з обробкою пошти, зведені в бібліотеку, що має хороші коментарі і приводиться нижче:

<? Php function retrieve_message ($ auth_user, $ accountid, $ messageid, $ fullheaders) {$ message = array (); if (! ($ auth_user & $ messageid & $ accountid)) return false; $ Imap = open_mailbox ($ auth_user, $ accountid); if (! $ imap) return false; $ Header = imap_header ($ imap, $ messageid); if (! $ header) return false; $ Message [ 'body'] = imap_body ($ imap, $ messageid); if (! $ message [ 'body']) $ message [ 'body'] = "[Відсутня тіло повідомлення] \ n \ n \ n \ n \ n \ n"; if ($ fullheaders) $ message [ 'fullheaders'] = imap_fetchheader ($ imap, $ messageid); else $ message [ 'fullheaders'] = ''; $ Message [ 'subject'] = $ header-> subject; $ Message [ 'fromaddress'] = $ header-> fromaddress; $ Message [ 'toaddress'] = $ header-> toaddress; $ Message [ 'ccaddress'] = $ header-> ccaddress; $ Message [ 'date'] = $ header-> date; imap_close ($ imap); return $ message; } Function account_exists ($ auth_user, $ accountid) {// Перевіряє, чи має даний користувач обліковий запис із заданим // ідентифікатором $ query = "select count (*) from accounts where username = '$ auth_user' and accountid = $ accountid" ; if ($ conn = db_connect ()) {$ result = $ conn-> query ($ query); $ Row = $ result-> fetch_array (); return $ row [0]; } Return false; } Function get_account_list ($ auth_user) {// Отримує масив ідентифікаторів облікових записів, які відносяться до // даному користувачеві $ query = "select accountid from accounts where username = '$ auth_user'"; $ List = array (); if ($ conn = db_connect ()) {$ result = $ conn-> query ($ query); $ Num = $ result-> num_rows; for ($ i = 0; $ i <$ num; $ i ++) {$ row = $ result-> fetch_array (); array_push ($ list, $ row [0]); }} Return $ list; } Function number_of_accounts ($ auth_user) {// Отримує кількість облікових записів, які відносяться до даного // користувачеві $ query = "select count (*) from accounts where username = '$ auth_user'"; if ($ conn = db_connect ()) {$ result = $ conn-> query ($ query); if ($ result) {$ row = $ result-> fetch_array (); return $ row [0]; }} Return 0; } Function get_account_settings ($ auth_user, $ accountid = 0) {// Отримує масив параметрів цього облікового запису $ settings = array (); if ($ conn = db_connect ()) {if ($ accountid> 0 & $ accountid! = '') {$ query = "select * from accounts where accountid = $ accountid and username = '$ auth_user'"; } Else if (number_of_accounts ($ auth_user) == 1) {$ query = "select * from accounts where username = '$ auth_user'"; } Else {return false; } $ Result = $ conn-> query ($ query); if ($ result) {$ settings = $ result-> fetch_assoc (); return $ settings; } Else return false; } Return false; } Function get_accounts ($ auth_user) {$ list = array (); if ($ conn = db_connect ()) {$ query = "select * from accounts where username = '$ auth_user'"; $ Result = $ conn-> query ($ query); if ($ result) {while ($ settings = $ result-> fetch_assoc ()) array_push ($ list, $ settings); } Else return false; } Return $ list; } Function store_account_settings ($ auth_user, $ settings) {if (! Filled_out ($ settings)) {echo 'Все поля повинні бути заповнені. Будь ласка, спробуйте. <br /> <br /> '; return false; } Else {if ($ settings [ 'account']> 0) $ query = "update accounts set server = '$ settings [server]', port = $ settings [port], type = '$ settings [type]', remoteuser = '$ settings [remoteuser]', remotepassword = '$ settings [remotepassword]' where accountid = $ settings [account] and username = '$ auth_user' "; else $ query = "insert into accounts values ​​( '$ auth_user', '$ settings [server]', $ settings [port], '$ settings [type]', '$ settings [remoteuser]', '$ settings [remotepassword ] ', NULL) "; if ($ conn-> db_connect ()) {$ result = $ conn-> query ($ query); if ($ query) return true; else return false; } Else {echo 'Неможливо зберегти зміни. <br /> <br /> <br /> <br /> <br /> <br />'; return false; }}} Function delete_message ($ auth_user, $ accountid, $ message_id) {// Видаляє одне повідомлення на сервері $ imap = open_mailbox ($ auth_user, $ accountid); if ($ imap) {imap_delete ($ imap, $ message_id); imap_expunge ($ imap); imap_close ($ imap); return true; } Return false; } Function open_mailbox ($ auth_user, $ accountid) {// Вибрати поштовий ящик, якщо він єдиний if (number_of_accounts ($ auth_user) == 1) {$ accounts = get_account_list ($ auth_user); $ _SESSION [ 'selected_account'] = $ accounts [0]; $ Accountid = $ accounts [0]; } // Підключитися до POP3 або IMAP-сервера, заданої користувачем $ settings = get_account_settings ($ auth_user, $ accountid); if (! sizeof ($ settings)) return 0; $ Mailbox = '{'. $ Settings [server]; if ($ settings [type] == 'POP3') $ mailbox. = '/ pop3'; $ Mailbox. = ':'. $ Settings [port]. '} INBOX'; // Придушити висновок попереджувальних повідомлень, // перевірити повертається значення @ $ imap = imap_open ($ mailbox, $ settings [ 'remoteuser'], $ settings [ 'remotepassword']); return $ imap; } Function get_list ($ imap) {// Отримує список повідомлень з поштової скриньки $ headers = imap_headers ($ imap); $ Messages = sizeof ($ headers); for ($ i = 0; $ i <$ messages; $ i ++) {echo $ headers [$ i]; } Imap_close ($ imap); } Function send_message ($ to, $ cc, $ subject, $ message) {// Відправляє одне повідомлення електронної пошти за допомогою PHP if (! $ Conn-> db_connect ()) {return false; } $ Query = 'select address from users where' .'username = \ ''. $ _ SESSION [ 'auth_user']. " '"; $ Result = $ conn-> query ($ query); if (! $ result) {return false; } Else if ($ result-> num_rows == 0) {return false; } Else {$ row = $ result-> fetch_object (); $ Other = 'From:'. $ Row-> address; if (! empty ($ cc)) $ other. = "\ r \ nCc: $ cc"; if (mail ($ to, $ subject, $ message, $ other)) {return true; } Else {return false; }}} Function add_quoting ($ string, $ pattern = '>') {// Додає символи цитування у відповідному повідомленні return $ pattern.str_replace ( "\ n", "\ n $ pattern", $ string); }

висновки

У першій статті циклу детально розглянуті питання загальної структури створюваної поштової системи з веб-інтерфейсом і порядку її функціонування. Наведено код для створення БД користувачів системи і бібліотека, що відповідає за роботу поштових функцій, до якої в подальшому ми будемо часто звертатися. В наступній статті будуть розглянуті питання, пов'язані з роботою головного керуючого сценарію поштової системи.

Ресурси для скачування

Схожі теми

Підпишіть мене на повідомлення до коментарів

Com/developerworks/ru/library/?


Новости
  • Виртуальный хостинг

    Виртуальный хостинг. Возможности сервера распределяются в равной мере между всеми... 
    Читать полностью

  • Редизайн сайта

    Редизайн сайта – это полное либо частичное обновление дизайна существующего сайта.... 
    Читать полностью

  • Консалтинг, услуги контент-менеджера

    Сопровождение любых интернет ресурсов;- Знание HTML и CSS- Поиск и обновление контента;-... 
    Читать полностью

  • Трафик из соцсетей

    Сравнительно дешевый способ по сравнению с поисковым и контекстным видами раскрутки... 
    Читать полностью

  • Поисковая оптимизация

    Поисковая оптимизация (англ. search engine optimization, SEO) — поднятие позиций сайта в результатах... 
    Читать полностью