Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Разработка клиентского приложения передачи электронной почты с применением протоколов SMTP и TCP на платформе WIN32

Содержание:

Введение

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

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

Развитие электронной почты происходило с развитием многопользовательских систем, которое можно описать последовательными этапами:

  • первый этап - передача сообщений в пределах одного компьютера – мейнфрейма;
  • второй этап - передача сообщений между двумя компьютерами;
  • третий этап - передача сообщений между двумя компьютерами через третий компьютер;
  • четвертый этап был осуществлен после появления распределённой глобальной системы имён DNS , которая была разработана Полом Мокапетрисом в 1983 году.

В терминологии электронной почты выделяются следующие компоненты:

  • MTA (Mail Transfer Agent – агент пересылки почты) – отвечает за пересылку почты между почтовыми серверами;
  • MDA (Mail Delivery Agent – агент доставки почты) – отвечает за доставку почты конечному пользователю.
  • MUA (Mail user agent – почтовый агент пользователя) – программа, обеспечивающая пользовательский интерфейс, отображающая полученные письма и предоставляющая возможность отвечать, создавать, перенаправлять письма.
  • MRA (Mail retrieve agent) – почтовый сервер, забирающий почту с другого сервера по протоколам, предназначенным для MDA.

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

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

Общепринятым в мире протоколом обмена электронной почтой является SMTP (Simple mail transfer protocol – простой протокол передачи почты). В общепринятой реализации он использует DNS для определения правил пересылки почты.

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

Internet протоколы

TCP/IP – сетевая модель передачи данных, представленных в цифровом виде. Модель описывает способ передачи данных от источника информации к получателю. В модели предполагается прохождение информации через четыре уровня, каждый из которых описывается правилом (протоколом передачи). Наборы правил, решающих задачу по передаче данных, составляют стек протоколов передачи данных, на которых базируется Интернет. Набор интернет-протоколов - это концептуальная модель и набор коммуникационных протоколов, используемых в Интернете и подобных компьютерных сетях. Он широко известен как TCP/IP, поскольку базовые протоколы в пакете - это протокол управления передачей (TCP) и интернет-протокол (IP). Набор интернет-протоколов обеспечивает сквозную передачу данных, определяющую, как данные должны пакетироваться, обрабатываться, передаваться, маршрутизироваться и получать. Эта функциональность организована в четыре слоя абстракции, которые классифицируют все связанные протоколы в соответствии с объемом задействованных сетей. От самого низкого до самого высокого уровня:

  • уровень связи, содержащий методы связи для данных, которые остаются в пределах одного сегмента сети (ссылка);
  • интернет-уровень, обеспечивающий межсетевое взаимодействие между независимыми сетями;
  • транспортный уровень, обрабатывающий связь между хостами;
  • прикладной уровень, который обеспечивает обмен данными между процессами для приложений.

Существует несколько протоколов приема передачи почты между многопользовательскими системами.

POP3 (Post Office Protocol Version 3 – протокол почтового отделения, версия 3) – стандартный интернет-протокол прикладного уровня, используемый клиентами электронной почты для получения почты с удалённого сервера по TCP-соединению. POP3 действует на основании следующей концепции – почта на сервере хранится временно, в ограниченном объёме (аналогично почтовому ящику для бумажной почты), а пользователь периодически обращается к ящику и «забирает» письма (то есть почтовый клиент скачивает копию письма к себе и удаляет оригинал из почтового ящика). В протоколе РОРЗ, который является более поздней версией POP, оговорены три стадии процесса получения почты: авторизация, транзакция и обновление. На стадии авторизации клиент себя идентифицирует. Если авторизация прошла успешно, сервер открывает почтовый ящик клиента и начинается стадия транзакции почты. На стадии обновления сеанс связи заканчивается.

Концепция IMAP4 (Internet Message Access Protocol – протокол доступа к электронной почте Internet, версия 4) подразумевает, что вся корреспонденция, связанная с почтовым ящиком (включая копии отправленных писем), хранится на сервере, а пользователь обращается к хранилищу для просмотра корреспонденции и написания новых писем (включая ответы на другие письма). Подобное хранение почтовой переписки требует значительно больших мощностей от почтовых серверов, в результате, во многих случаях происходит разделение между почтовыми серверами, пересылающими почту, и серверами хранения писем. При администрировании почтового сервера на базе протокола IMAP следует быть особенно осторожным с определением лимитов дискового пространства, чтобы система вовремя перестала принимать новые сообщения, не допуская переполнения диска и останова сервера.

При передаче по протоколу SMTP электронное письмо состоит из следующих частей:

  • Данные SMTP-конверта, полученные сервером;
  • Самого сообщения, которое, в свою очередь, состоит из следующих частей, разделённых пустой строкой:
  • Заголовков письма. В заголовке указывается служебная информация и пометки почтовых серверов, через которые прошло письмо, пометки о приоритете, указание на адрес и имя отправителя и получателя письма, тема письма и другая информация.
  • Тела письма. В теле письма находится, собственно, сообщение письма.

Примерно половина всех TCP соединений заняты передачей почтовых сообщений с использованием простого протокола передачи почты (SMTP).

SMTP является одной из самых используемых служб в Глобальной сети. Основная задача данного протокола – обеспечивать передачу электронных сообщений. Взаимодействие в рамках SMTP строится по принципу двусторонней связи, которая устанавливается между отправителем (SMTP-клиент) и получателем (SMTP-сервер) почтового сообщения. Отправитель инициирует соединение и посылает запросы на обслуживание, а получатель – отвечает на эти запросы.

Веб-сервера

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

Рисунок 1. Взаимодействие браузера и веб-сервера

Чтобы опубликовать веб-сайт, необходим либо статический, либо динамический веб-сервер.

Статический веб-сервер, или стек, состоит из компьютера (железо) с сервером HTTP (ПО). Это называется «статикой», потому что сервер посылает размещенные файлы в браузер «как есть».

Динамический веб-сервер состоит из статического веб-сервера и дополнительного программного обеспечения, чаще всего сервера приложения и базы данных. Называется «динамическим», потому что сервер приложений изменяет исходные файлы перед отправкой в ваш браузер по HTTP.

Наиболее распространённым веб-сервером, является Apache HTTP-сервер – свободный веб-сервер. Apache является кроссплатформенным ПО, поддерживает операционные системы Linux, BSD, Mac OS, Microsoft Windows, Novell NetWare, BeOS.

Если упрощенно смотреть на Apache исключительно, как на HTTP сервер, то выполняет он следующие действия:

  • Получает запрос от клиента;
  • Обрабатывает клиентский запрос;
  • Ищет ресурс, указанный в запросе клиента;
  • Отправляет специальный HTTP ответ клиенту, снабженный кодом состояния, по которому клиент узнает, как его понял сервер и смог ли он выполнить указанное действие.

Основными достоинствами Apache считаются надёжность и гибкость конфигурации. Он позволяет подключать внешние модули для предоставления данных, использовать СУБД для аутентификации пользователей, модифицировать сообщения об ошибках.

IIS (Internet Information Services) – проприетарный набор серверов для нескольких служб Интернета от компании Майкрософт. Основным компонентом IIS является веб-сервер, который позволяет размещать в Интернете сайты. IIS поддерживает протоколы HTTP, HTTPS, FTP, POP3, SMTP. Кроме того, IIS содержит службы, необходимые для предоставления доступа к файлам по протоколу FTP, для отправки электронной почты по протоколу SMTP. Несомненным достоинством IIS является его тесная интеграция с другими технологиями и средствами разработки Microsoft. В частности веб-решения для IIS могут использовать богатые возможности .NET и легко взаимодействовать с настольными приложениями на этой платформе.

PHP (Hypertext Preprocessor – препроцессор гипертекста) – скриптовый язык общего назначения, интенсивно применяемый для разработки веб-приложений. В настоящее время поддерживается подавляющим большинством хостинг-провайдеров и является одним из лидеров среди языков, применяющихся для создания динамических веб-сайтов. В области веб-программирования, в частности серверной части, PHP – один из популярных сценарных языков. Популярность в области построения веб-сайтов определяется наличием большого набора встроенных средств для разработки веб-приложений. Значительным отличием PHP от какого-либо кода, выполняющегося на стороне клиента, например, JavaScript, является то, что PHP-скрипты выполняются на стороне сервера. PHP позволяет создавать качественные Web-приложения за очень короткие сроки, получая продукты, легко модифицируемые и поддерживаемые в будущем. Этот язык прост для освоения, и вместе с тем способен удовлетворить запросы профессиональных программистов.

Рабочий проект

Общие сведения о программе

Программа разработана в среде программирования Visual Code с применением HTML и CSS Style, на языке программирования PHP. Для создания программы разворачивался WampServer. Это платформа для веб-разработки под Windows для динамических веб-приложений с помощью сервера Apache2, интерпретатора скриптов PHP и базы данных MySQL. WampServer прост в использовании, что позволяет быстро производить конфигурации не прибегая к конфигурационным файлам.

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

Общий алгоритм программного обеспечения

Программа состоит из методов, которые используются для подключения к серверам электронной почты, используя протоколы электронной почты для отправки писем.

При запуске программы на экране появляется главное окно с элементами управления. В нем содержатся поля: «Email» - кому адресовано письмо, поле темы, поле для текста письма и кнопка для отправки письма.

Рисунок 2. Главное окно программы

При нажатии на кнопку «Отправить» происходит отправка письма с использованием протокола SMTP.

Рисунок 3. Схема взаимодействия по протоколу SMTP

Для отправки письма используются публичные Google сервера smtp.gmail.com. Электронный адрес отправителя зашит в коде программы и только там может происходить его замена.

Описание алгоритма

Раздел конфигурации:

  • SMTP username – логин удаленного почтового сервера;
  • SMTP port – порт для подключения к SMTP серверу;
  • SMTP host – адрес SMTP сервера;
  • SMTP password – пароль;
  • SMTP debug – настройка для отладки программы;
  • SMTP charset - кодировка сообщений;
  • SMTP from – псевдоним, от чьего имени будут отправляться письма.

Функция smtpmail.

Проверка валидности переменных конфигурации и вывод пойманных ошибок в случае наличия таковых. Если ни одной ошибки отловить не удалось, то вывод метода smtpmail($to, $mail_to, $subject, $message).

Контрольный пример реализации проекта

Для проверки правильности работы программы отправляется тестовое письмо – заполняется поле «Email», «Тема» и «Сообщение».

Рисунок 4. Отправка тестового письма

Результатом нажатия кнопки «Отправить» будет отправка электронного письма адресату (в данном случае на свою же почту).

Рисунок 5. Получение письма

Заключение

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

SMTP — требующий соединения текстовый протокол, по которому отправитель сообщения связывается с получателем посредством выдачи командных строк и получения необходимых данных через надёжный канал, в роли которого обычно выступает TCP-соединение.

Результатом выполнения курсовой работы на тему «Разработка клиентского приложения передачи электронной почты с применением протоколов SMTP и TCP на платформе WIN32» стала программа, содержащая в себе методы реализации протоколов электронной почты SMTP и TCP. Программа представляет собой удобный и понятный пользовательский интерфейс.

Используемые источники

  1. Национальная электронная библиотека им. Н. Э. Баумана: https://ru.bmstu.wiki
  2. XServer.ru онлайн библиотека: http://www.xserver.ru/
  3. Википедия: https://ru.wikipedia.org/

Приложение 1. Исходный код программы

<?php

$config['smtp_username'] = 'imp31h@gmail.com'; //Адрес своего почтового ящика.

$config['smtp_port'] = '465'; // Порт работы.

$config['smtp_host'] = 'ssl://smtp.gmail.com'; //сервер для отправки почты

$config['smtp_password'] = '***********'; //Измените пароль

$config['smtp_debug'] = true; //Если Вы не хотите видеть сообщения ошибок, укажите false вместо true

$config['smtp_charset'] = 'utf-8'; //кодировка сообщений. (windows-1251 или utf-8, итд)

$config['smtp_from'] = 'МегаСервис'; //Ваше имя - или имя Вашего сайта. Будет показывать при прочтении в поле "От кого"

$sendInfo = null;

function smtpmail($to='', $mail_to, $subject, $message, $headers='') {

global $config;

$SEND = "Date: ".date("D, d M Y H:i:s") . " UT\r\n";

$SEND .= 'Subject: =?'.$config['smtp_charset'].'?B?'.base64_encode($subject)."=?=\r\n";

if ($headers) $SEND .= $headers."\r\n\r\n";

else

{

$SEND .= "Reply-To: ".$config['smtp_username']."\r\n";

$SEND .= "To: \"=?".$config['smtp_charset']."?B?".base64_encode($to)."=?=\" <$mail_to>\r\n";

$SEND .= "MIME-Version: 1.0\r\n";

$SEND .= "Content-Type: text/html; charset=\"".$config['smtp_charset']."\"\r\n";

$SEND .= "Content-Transfer-Encoding: 8bit\r\n";

$SEND .= "From: \"=?".$config['smtp_charset']."?B?".base64_encode($config['smtp_from'])."=?=\" <".$config['smtp_username'].">\r\n";

$SEND .= "X-Priority: 3\r\n\r\n";

}

$SEND .= $message."\r\n";

if( !$socket = fsockopen($config['smtp_host'], $config['smtp_port'], $errno, $errstr, 30) ) {

if ($config['smtp_debug']) echo $errno."<br>".$errstr;

return false;

}

if (!server_parse($socket, "220", __LINE__)) return false;

fputs($socket, "HELO " . $config['smtp_host'] . "\r\n");

if (!server_parse($socket, "250", __LINE__)) {

if ($config['smtp_debug']) echo '<p>Не могу отправить HELO!</p>';

fclose($socket);

return false;

}

fputs($socket, "AUTH LOGIN\r\n");

if (!server_parse($socket, "334", __LINE__)) {

if ($config['smtp_debug']) echo '<p>Не могу найти ответ на запрос авторизаци.</p>';

fclose($socket);

return false;

}

fputs($socket, base64_encode($config['smtp_username']) . "\r\n");

if (!server_parse($socket, "334", __LINE__)) {

if ($config['smtp_debug']) echo '<p>Логин авторизации не был принят сервером!</p>';

fclose($socket);

return false;

}

fputs($socket, base64_encode($config['smtp_password']) . "\r\n");

if (!server_parse($socket, "235", __LINE__)) {

if ($config['smtp_debug']) echo '<p>Пароль не был принят сервером как верный! Ошибка авторизации!</p>';

fclose($socket);

return false;

}

fputs($socket, "MAIL FROM: <".$config['smtp_username'].">\r\n");

if (!server_parse($socket, "250", __LINE__)) {

if ($config['smtp_debug']) echo '<p>Не могу отправить комманду MAIL FROM: </p>';

fclose($socket);

return false;

}

fputs($socket, "RCPT TO: <" . $mail_to . ">\r\n");

if (!server_parse($socket, "250", __LINE__)) {

if ($config['smtp_debug']) echo '<p>Не могу отправить комманду RCPT TO: </p>';

fclose($socket);

return false;

}

fputs($socket, "DATA\r\n");

if (!server_parse($socket, "354", __LINE__)) {

if ($config['smtp_debug']) echo '<p>Не могу отправить комманду DATA</p>';

fclose($socket);

return false;

}

fputs($socket, $SEND."\r\n.\r\n");

if (!server_parse($socket, "250", __LINE__)) {

if ($config['smtp_debug']) echo '<p>Не смог отправить тело письма. Письмо не было отправленно!</p>';

fclose($socket);

return false;

}

fputs($socket, "QUIT\r\n");

fclose($socket);

return TRUE;

if(isset($_POST['submit'])) {

$mail_to = $_POST['mailTo'];

$subject = $_POST['subject'];

$message = $_POST['message'];

$from = "email@example.com"; // тут можно указать почту свою.

$headers = "From:" . $from;

$to = "toto";

smtpmail($to, $mail_to, $subject, $message);

}

}

function server_parse($socket, $response, $line = __LINE__) {

global $config;

while (@substr($server_response, 3, 1) != ' ') {

if (!($server_response = fgets($socket, 256))) {

if ($config['smtp_debug']) echo "<p>Проблемы с отправкой почты!</p>$response<br>$line<br>";

return false;

}

}

if (!(substr($server_response, 0, 3) == $response)) {

if ($config['smtp_debug']) echo "<p>Проблемы с отправкой почты!</p>$response<br>$line<br>";

return false;

}

return true;

}

?>

<!DOCTYPE html>

<head>

<meta charset="utf-8">

<title>Почтовое отправление</title>

<style>

.main {

background: #cccccc;

width: 500px;

margin: auto;

padding: 10px;

border: #000 solid 1px;

border-radius: 10px;

}

h3 {

padding: 0;

margin: 0 0 10px 0;

text-align: center;

}

input, textarea {

width: 100%;

}

</style>

</head>

<body>

<div class="main">

<div class="mailform">

<h3>Отправка сообщения</h3>

<form action="" method="post">

<p>

<span>Email</span>

<input type="text" name="mailTo">

</p>

<p>

<span>Тема</span>

<input type="text" name="subject">

</p>

<p>

<span>Сообщение</span>

<textarea rows="5" name="message" cols="30"></textarea>

</p>

<p>

<input type="submit" name="submit" value="Отправить">

</p>

<?php

if (is_null($sendInfo)) {

echo 'Variable is NULL';

}

else

{

echo 'Variable is not NULL';

}

?>

</form>

</div>

</div>

</body>

</html>