Содержание


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

Часть 6. Отправка почты. Ответ и переадресация

Comments

Серия контента:

Этот контент является частью # из серии # статей: Реальные веб-проекты на PHP и MySQL. Разработка почтовой службы с веб-интерфейсом

Следите за выходом новых статей этой серии.

Этот контент является частью серии:Реальные веб-проекты на PHP и MySQL. Разработка почтовой службы с веб-интерфейсом

Следите за выходом новых статей этой серии.

1. Введение

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

В предыдущих пяти частях цикла статей были рассмотрены вопросы относительно общего плана построения почтовой системы с веб-интерфейсом, создания базы данных под учебный проект и обзора общей библиотеки функций для решения задач обработки почты. Кроме того, были изучены: главный управляющий сценарий, регулирующий все основные моменты функционирования веб-почты, процесс создания пользователей системы и манипулирование их учетными записями, реализация входа и выхода этих пользователей, а также реализация механизмов просмотра содержимого почтового ящика и чтения сообщений. В заключительной части цикла будут подробно рассмотрены вопросы реализации отправки почты.

Отправка почтовых сообщений

Главный управляющий сценарий для отправки почтовых сообщений предоставляет несколько способов отправки сообщений. Пользователь может отправить новое письмо или ответить на уже имеющееся. Кроме того, имеется возможность переадресовать сообщение. В статье будут последовательно изучены все перечисленные варианты манипуляций с сообщениями электронной почты.

Отправка нового сообщения

Работая с веб-интерфейсом системы, пользователь может выбрать опцию New Message для оправки нового сообщения. В результате этого будет активизировано действие new-message, которое приведет к выполнению следующего куска кода:

case 'new-message' :
      {
        display_new_message_form($_SESSION['auth_user'],
                                 $to, $cc, $subject, $body);
        break;
      }

Форма для создания нового сообщения показана на рисунке 1:

function display_new_message_form($auth_user, $to='',$cc='',$subject='', $message='')
{
  // Выводит HTML-форму либо для нового сообщения, либо для сообщения,
  // на которое будет отправляться ответ

  global $table_width;
  
?>
  <table cellpadding = 4 cellspacing = 0 border = 0 width = <?php echo 
  $table_width; ?>>
  <form action = "index.php?action=send-message" method = "post">
  <tr>
    <td bgcolor = "#cccccc">
      Адрес Кому:
    </td>
    <td bgcolor = "#cccccc"> 
      <input type = "text" name = "to" value = "<?php echo $to; ?>" 
	  size = 60>
    </td>
  </tr>
  <tr>
    <td bgcolor = "#cccccc">
      Адрес CC:
    </td>
    <td bgcolor = "#cccccc"> 
      <input type = "text" name = "cc" value = "<?php echo $cc; ?>" 
	  size = 60 >
    </td>
  </tr>
  <tr>
    <td bgcolor = "#cccccc">
      Тема:
    </td>
    <td bgcolor = "#cccccc">
      <input type = "text" name = "subject" value = "<?php echo $subject;
	  ?>" size = 60 ></td>
  </tr>
  <tr>
    <td colspan = 2 bgcolor = "#cccccc">
      <textarea name = "message" rows = 10 cols = 72><?php echo 
	  $message; ?></textarea>
    </td>
  </tr>
  <tr>
    <td colspan = 2 align = "center" bgcolor = "#cccccc">
      <?php display_form_button('send-message'); ?>
    </td>
  </tr>
  </form>
  </table>
<?php
}
?>
Рисунок 1.
Рисунок 1.
Рисунок 1.

После заполнения формы и нажатия кнопки Send Message (отправить сообщение) инициируется действие send-message, которое в свою очередь влечет выполнение следующего участка кода:

case 'send-message' :
      {
        if(send_message($to, $cc, $subject, $message))
          echo '<p>Сообщение отправлено.</p><br /><br /><br /><br />
		  <br /><br />';
        else
          echo '<p>Невозможно отправить сообщение.</p><br /><br />
		  <br /><br />
                <br /><br />';
        break;
      }

В этом месте вызывается функция send_message(), которая и осуществляет отправку сообщения. Код функции приводится ниже:

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;
    }
  }
}

Эта функция в своей работе по отправке сообщения использует функцию mail(). Выполняется загрузка из базы данных адреса электронной почты, который вставляется в поле FROM, после чего и выполняется отправка сообщения.

Ответ и переадресация сообщения

Опции веб-интерфейса Replay и Replay All а также Forward выполняют отправку сообщений схожим образом, как и в случае работы опции New Message. Разница состоит в том, что при их работе форма уже частично заполненная подается пользователю на «доработку» для его окончательного редактирования и пополнения. При этом текст пересылаемого сообщения выводится с отступом. Его строки начинаются с символа >, а в начало строки Subject помещается выполняемое действие, то есть опция Re (Replay). Опции Replay и Replay All обеспечивают заполнение всех требуемых полей для адреса получателя и темы сообщения. Кроме этого, они также выводят текст предыдущего сообщения с аналогичным уже рассмотренному отступом. Все описанное успешно реализуется в соответствующей части главного управляющего сценария index.php:

case 'reply-all' :
      {
        // Установить значение переменной cc равным строке cc текущего 
		//сообщения
        if(!$imap)
          $imap = open_mailbox($_SESSION['auth_user'],
                               $_SESSION['selected_account']);
        if($imap)
        {
          $header = imap_header($imap, $messageid);
          if($header->reply_toaddress)
            $to = $header->reply_toaddress;
          else
            $to = $header->fromaddress;
          $cc = $header->ccaddress;
          $subject = 'Re: '.$header->subject;
          $body = add_quoting(imap_body($imap, $messageid));
          imap_close($imap);

          display_new_message_form($_SESSION['auth_user'],
                                   $to, $cc, $subject, $body);
        }
        break;
      }
      case 'reply' :
      {
        // Установить значение переменной to равным полю reply-to
        // или from текущего сообщения
        if(!$imap)
          $imap = open_mailbox($_SESSION['auth_user'],
                               $_SESSION['selected_account']);
        if($imap)
        {
          $header = imap_header($imap, $messageid);
          if($header->reply_toaddress)
            $to = $header->reply_toaddress;
          else
            $to = $header->fromaddress;
          $subject = 'Re: '.$header->subject;
          $body = add_quoting(stripslashes(imap_body($imap, $messageid)));
          imap_close($imap);

          display_new_message_form($_SESSION['auth_user'],
                                   $to, $cc, $subject, $body);
        }

        break;
      }
      case 'forward' :
      {
        // Установить значение переменной body равным телу
        // текущего сообщения, взятого в кавычки
        if(!$imap)
          $imap = open_mailbox($_SESSION['auth_user'],
                               $_SESSION['selected_account']);

        if($imap)
        {
          $header = imap_header($imap, $messageid);
          $body = add_quoting(stripslashes(imap_body($imap, $messageid)));
          $subject = 'Fwd: '.$header->subject;
          imap_close($imap);

          display_new_message_form($_SESSION['auth_user'],
                                   $to, $cc, $subject, $body);
        }
        break;
      }
      case 'new-message' :
      {
        display_new_message_form($_SESSION['auth_user'],
                                 $to, $cc, $subject, $body);
        break;
      }
    }
  }
//*****************************************************************************
// Начало этапа 4. Вывод нижнего колонтитула
//***************************************************************************
**
  do_html_footer();
?>

Вывод нижнего колонтитула формы (функция do_html_footer()):

function do_html_footer()
{
  // Выводит завершающие HTML-дексрипторы
  global $table_width;
?>
  </td></tr>
  </table>
  <table width = <?php echo $table_width;?> cellspacing = 0 cellpadding = 6 border = 0>
  <tr>
  <td bgcolor = "#ff6600" align = right><img src = "images/warm-mail.gif"
                 width = 103 height = 45 alt ="" valign = "middle" />
  </td>
  </tr>
  </table>
  </body>
  </html>
<?php
}

Каждая рассмотренная опция создает соответствующие заголовки и реализует требуемое форматирование, а также вызывает функцию display_new_message() для вывода нужной формы.

Этой фразой и заканчивается обсуждение учебного проекта и его функциональных возможностей как приложения для управления электронной почтой с веб-интерфейсом.

Возможности по дальнейшему расширению проекта

Оценивая все рассмотренные возможности этого проекта можно наметить несколько реальных путей для его усиления и превращения в более действенный, более реальный сайт. Если все изложенное на протяжении шести частей взять за основу, то добавление следующих элементов непременно усилит имеющуюся техническую реализацию:

  1. Необходимо предусмотреть возможность регистрации пользователей прямо на сайте;
  2. Реализовать возможность для пользователей получения нескольких адресов, а также включить способность использования этого сайта (почтового домена) как основного среди прочих используемых. Многие пользователи имеют несколько адресов для электронной почты, как минимум, для личных и служебных целей. Было бы неплохо предоставить им возможность применять эти адреса за счет перемещения сохраненных адресов из таблицы пользователей в таблицу для учетных записей. В этом случае нужно будет внести ряд изменений и в другие фрагменты кода. В частности, форма отправки сообщения должна будет содержать поле со списком выбора адреса из числа имеющихся.
  3. Реализовать возможность добавления отправки, приема и просмотра сообщений с вложениями. Необходимость отправки сообщений с вложениями не вызывает ни у кого никаких сомнений и ее реализация пришлась бы как нельзя кстати. Для этого придется предусмотреть использование функций для работы с файлами, а именно обеспечить возможность их загрузки (было рассмотрено ранее в статьях предыдущего цикла).
  4. Реализовать возможность использования адресной книги на почтовом сайте.
  5. Добавить возможность чтения сетевых новостей с NNTP-сервера. Чтение новостей из NNTP сервера с помощью IMAP функций в общих чертах не особо отличается от чтения сообщений из простого почтового ящика. В этом случае придется при вызове функции imap_open() указать другой номер порта и протокол, а вместо имени почтового ящика INBOX задавать имя группы новостей, из которой и будет выполняться чтение. Сделав все это, можно будет получить реальное многопоточное веб-приложение в том числе и для чтения новостей.

Выводы

В заключительной части общего цикла, подробно рассмотрены вопросы структуры создаваемой почтовой системы с веб-интерфейсом и порядка ее функционирования. Приведены и описаны фрагменты кода главного управляющего сценария системы электронной почты с веб-интерфейсом, отвечающие за организацию описываемых компонентов системы и их взаимодействия. Рассмотрены функции вывода HTML-форм для отправки почтового сообщения пользователя, формирования ответа и переадресации сообщений. Обзорно рассмотрен логический порядок работы частей сценария, показано для чего и как они функционируют, что является источником инициализации тех или иных событий в описываемой работе.

Рассмотрены подробно функции, используемые в главном управляющем сценарии, и приведен их код с комментариями.

В завершении даны рекомендации по усилению проекта и превращению его в полнофункциональный сайт – многопоточное приложение в том числе с функцией чтения новостей по протоколу NNTP.


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


Похожие темы


Комментарии

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

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux, Open source
ArticleID=587789
ArticleTitle=Реальные веб-проекты на PHP и MySQL. Разработка почтовой службы с веб-интерфейсом: Часть 6. Отправка почты. Ответ и переадресация
publish-date=11182010