Разработка почтового клиента для операционной системы Windows

Федеральное агентство по образованию

ПЕНЗЕНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

Институт систем управления и информационной безопасности























Пояснительная записка к курсовому проекту

«Разработка почтового клиента для операционной системы Windows»

























Пенза 2007

	
Реферат



СЕТЕВОЙ ПРОТОКОЛ, СОКЕТЫ, ЭЛЕКТРОННАЯ ПОЧТА, АУТЕНТИФИКАЦИЯ, СЕТЕВОЕ ПРОГРАММИРОВАНИЕ, ОПЕРАЦИОННАЯ СИСТЕМА WINDOWS

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

Целью курсового проекта является разработка приложения, реализующего работу с подмножеством протокола POP3. Приложение должно реализовывать три вида аутентификации, запрос статистики электронных сообщений у сервера и разрыв соединения. Приложение должно быть разработано для операционной системы WINDOWS. Для реализации должен быть использован язык программирования Си. Приложение должно иметь графический интерфейс.




Содержание



Реферат

Задание на курсовое проектирование

Введение

1. Описание программы

1.1 Описание класса pop3Socket

1.2 Описание класса pop3ClientDlg

1.3 Простая аутентификачия

1.4 APOP аутентификация

1.5 AUTH аутентификация

2. Описание реализации функций

2.1 Простая аутентификачия

2.2 APOP аутентификация

2.3 AUTH аутентификация

3. Руководство пользователя

Заключение

Список источников

Приложение А. Обязательное. Алгоритмы функционирования программы




Введение



Post Office Protocol (POP) - протокол доставки почты пользователю из почтового ящика почтового сервера РОР. Многие концепции, принципы и понятия протокола POP выглядят и функционируют подобно SMTP. Команды POP практически идентичны командам SMTP, отличаясь в некоторых деталях. На рис.7 изображена модель клиент-сервер по протоколу POP. Сервер POP находится между агентом пользователя и почтовыми ящиками.

В настоящее время существуют две версии протокола POP - РОР2 и РОРЗ, обладающими примерно одинаковыми возможностями, однако несовместимыми друг с другом. Дело в том, что у РОР2 и РОРЗ разные номера портов протокола. Между ними отсутствует связь, аналогичная связи между SMTP и ESMTP. Протокол РОРЗ не является расширением или модификацией РОР2 - это совершенно другой протокол. РОР2 определен в документе RFC 937 (Post Office Protocol-Version 2, Butler, et al, 1985), a РОРЗ - в RFC 1225 (Post Office Protocol-Version 3, Rose, 1991). Далее кратко рассмотрим POP вообще и более подробно - РОРЗ. PОРЗ разработан с учетом специфики доставки почты на персональные компьютеры и имеет соответствующие операции для этого.

Ранее почтовые сообщения большинства сетей доставлялись непосредственно от одного компьютера к другому. И если пользователь часто менял рабочие компьютеры или один компьютер принадлежал нескольким пользователям, существовали определенные проблемы. В наши дни общепринята доставка сообщения не на компьютеры пользователя, а в специальные почтовые ящики почтового сервера организации, который круглосуточно работает (включен).

Конструкция протокола РОРЗ обеспечивает возможность пользователю обратиться к своему почтовому серверу и изъять накопившуюся для него почту. Пользователь может получить доступ к РОР-серверу из любой точки доступа к Интернет. При этом он должен запустить специальный почтовый агент (UA), работающий по протоколу РОРЗ, и настроить его для работы со своим почтовым сервером. Итак, во главе модели POP находится отдельный персональный компьютер, работающий исключительно в качестве клиента почтовой системы (сервера). Подчеркнем также, что сообщения доставляются клиенту по протоколу POP, а посылаются по-прежнему при помощи SMTP. То есть на компьютере пользователя существуют два отдельных агента-интерфейса к почтовой системе - доставки (POP) и отправки (SMTP). Разработчики протокола РОРЗ называет такую ситуацию "раздельные агенты" (split UA). Концепция раздельных агентов кратко обсуждается в спецификации РОРЗ.

В протоколе РОРЗ оговорены три стадии процесса получения почты: авторизация, транзакция и обновление. После того как сервер и клиент РОРЗ установили соединение, начинается стадия авторизации. На стадии авторизации клиент идентифицирует себя для сервера. Если авторизация прошла успешно, сервер открывает почтовый ящик клиента и начинается стадия транзакции. В ней клиент либо запрашивает у сервера информацию (например, список почтовых сообщений), либо просит его совершить определенное действие (например, выдать почтовое сообщение. На стадии обновления сеанс связи заканчивается.


Описание программы



В ходе выполнение курсового проекта была разработана, реализующая функции клиентского приложения, функционирующего по протоколу pop3. Программа была разработана в среде Microsoft Visual Studio 2005. Проект приложения имеет диалоговый тип. В ходе разработки приложения использована библиотека классов MFC. В частности был использован базовый класс CSocket, который является производным классом от CsynkSocket – класс синхронных сокетов. Использование механизма синхронных сокетов позволяет организовать упорядоченное функционирование приложения, не используя дополнительных механизмов для синхронизации. Синхронный механизм не позволяет начать выполнение действия до того, как было получено подтверждение о выполнении предыдущего. 

В разработанном проекте был реализован класс pop3Socket, который является наследником класса CSocket. 

В ходе реализации приложения использовался класс md5Capi, который содержит реализации хэш-функции MD5 с использованием библиотеки wincrypt.h



1.1 Описание класса pop3Socket



Разработанный класс имеет следующую структуру:



class pop3Socket: public CSocket

{

public:

	pop3Socket(Cpop3ClientDlg* Dlg);

	virtual ~pop3Socket();

	virtual void OnReceive(int nErrorCode);

	virtual void OnClose(int nErrorCode);

	virtual void OnSend(int nErrorCode);

	char fl;

	Cpop3ClientDlg* m_Dlg;

};



В секции public класса находятся следующие свойства и методы:

pop3Socket(Cpop3ClientDlg* Dlg) – конструктор класса. Данный конструктор перегружен в соответствии с логикой работы программы, для того чтобы позволить установить зависимость создаваемого сокета от диалогового окна.

virtual ~pop3Socket() – Виртуальный деструктор класса;

virtual void OnReceive(int nErrorCode) – виртуальный метод класса, вызывающийся при получени сокетом входного сообщения;

virtual void OnClose(int nErrorCode) – виртуальный метод класса, вызывающийся при закрытии сокета;

virtual void OnSend(int nErrorCode) – виртуальный метод класса, вызывающийся при отправки информации через сокет;

char fl – свойство класса, которое используется при анализе ответа сервера.

Cpop3ClientDlg* m_Dlg – свойство – указатель на диалоговое окно типа Cpop3ClientDlg (главное диалоговое окно программы).

Определение класса приведено в файле pop3Socket.h проекта.

Реализация методов класса приведена в файле pop3Socket.срр проекта.

В реализации класса был перегружен конструктор, который настраивал указатель m_Dlg на адрес диалогового окна из которого происходит вызов конструктора.




1.2 Описание класса pop3ClientDlg



Класс pop3ClientDlg является наследником класса CDialog. 

Класс имеет следующую структуру:



class Cpop3ClientDlg: public CDialog

{

public:

	Cpop3ClientDlg(CWnd* pParent = NULL);	// standard constructor



// Dialog Data

	enum { IDD = IDD_POP3CLIENT_DIALOG };

	protected:

	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV support

// Implementation

protected:

	HICON m_hIcon;

	// Generated message map functions

	virtual BOOL OnInitDialog();

	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

	afx_msg void OnPaint();

	afx_msg HCURSOR OnQueryDragIcon();

	DECLARE_MESSAGE_MAP()

public:

	CListBox Protocol;

public:

	afx_msg void OnBnClickedButton1();

public:

	CButton connect_btn;

public:

	CButton disconnect_btn;

public:

	afx_msg void OnBnClickedButton2();

public:

	afx_msg void OnBnClickedRadio1();

public:

	bool simple;

public:

	bool apop;

public:

	bool auth;

public:

	afx_msg void OnBnClickedRadio2();

public:

	afx_msg void OnBnClickedRadio3();

};



Cpop3ClientDlg(CWnd* pParent = NULL) – стандартный конструктор, наследуемый от класса CDialog;

virtual void DoDataExchange(CDataExchange* pDX) – метод, реализующий механизм обмена данными DDX.

Методы, генерирующие сообщения:

 virtual BOOL OnInitDialog(), afx_msg void OnSysCommand(UINT nID, LPARAM lParam), afx_msg void OnPaint(), afx_msg HCURSOR OnQueryDragIcon(), DECLARE_MESSAGE_MAP().

При разработке класса были созданы следующие методы и свойтсва:

CListBox Protocol – Компонент управления типа ClistBox, в который производится вывод строк протокола обмена между сервером и клиентом.

CButton connect_btn – переменная, связанная с кнопкой установки соединения с сервером

CButton disconnect_btn – переменная, связанная с кнопкойразрыва соединения с сервером

bool simple, apop, auth – логические переменные. Они устанавливаются в значение «true» в зависимости от того, какой тип аутентификации выбран пользователем.

afx_msg void OnBnClickedButton1() – метод, вызываемый принажатии на компонент Button1(кнопка соединения).

afx_msg void OnBnClickedButton2() – метод, вызываемый принажатии на компонент Button2(кнопка разрыва соединения).

afx_msg void OnBnClickedRadio1() – метод, вызываемый при нажатии на компонент RadioButton1 – простая аутентификация.

afx_msg void OnBnClickedRadio2() – метод, вызываемый при нажатии на компонент RadioButton1 – APOP аутентификация.

afx_msg void OnBnClickedRadio3() – метод, вызываемый при нажатии на компонент RadioButton1 – AUTH аутентификация.

Описание класса pop3ClientDlg содержится в файле pop3ClientDlg.h. Реализация класса содержится в файле pop3ClientDlg.cpp.

В ходе разработки проекта были модифицированы следующие методы класса: метод BOOL Cpop3ClientDlg::OnInitDialog() – в него добавлена инициализация свойств класса:

this->simple=false;

this->apop=false;

this->auth=false;

Основная часть кода программа содержится в методе void Cpop3ClientDlg::OnBnClickedButton1() – методе, который вызывается при нажатии пользователем на кнопку Button1. 


1.2 Описание метода void Cpop3ClientDlg::OnBnClickedButton1()



Метод содержит следующие локальные переменные:

pop3Socket *pSocket – указатель на объект класса pop3Socket;

Cstring ip – строка типа Cstring, предназначенная для зранения ip адреса сервера 

int port – целочисленная переменная для хранения номера порта сервера;

CString messtr – строка для хранения сформированного сообщения ответа клиента

CString pswd – строка для хранения паролья прользователя;

CString login – строка для хранения имени пользователя;

char * buf = new char [128] – массив для хранения принятов строки от сервера;

char fl=0 – переменная для анализа ответа сервера;

char * stamp = new char[64] – строка для хранения временной метки сервера.

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

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

GetDlgItemText(IDC_EDIT1,ip); - из строки ввода в переменную ip

GetDlgItemText(IDC_EDIT2,login); - из строки ввода имени пользователя в переменную login;

port = atoi(login); - с помощью функции atoi строка login преобразуется в целочисленное значение и присваивается переменной port. 

GetDlgItemText(IDC_EDIT3,login); - из строки ввода имени в строку login

GetDlgItemText(IDC_EDIT4,pswd); - из строки ввода пароля в строку pswd.

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

Если проверка проёдена успешно, происходит создание сокета pSocket=new pop3Socket(this), и его инициализация pSocket->Create().

Далее функционирование программы осуществляется в зависимости от выбранного типа аутентификации. Для этого производится анализ переменных simple, apop и auth.



Простая аутентификачия

	

	Осуществляется соединение с сервером с помощью вызова методоа сокета pSocet: pSocket->Connect(ip,port), где в качестве параметров передаются строка, содержащая адрес сервера и номер порта Если соединение не установлено по каким-либо причинам, то производится вызов окна ошибки и завершение программы.

	Ожидание и получение строки ответа от сервера в массив и buf с помощью вызова метода сокета pSocet->Receive(buf,0). В случае, если данные не были получены этот метод возвращает отрицательное число, в противном случае возвращает количество полученных байт. Количество байт, полученных от сервера присваивается переменной int recived.

	Производится форматирование с помощью метода строки messtr.Format() строки messtr messtr.Format("S: %s",buf). Этот метод добавляет в начало строки символ последовательность “S: ” и далее содеримое массива buf.

	Производится ывод строки messtr в ListBox с помощью вызова метода Protocol->Add(messtr).

	В цикле от 0 до 127 элемента производится обнуление массива buf

	С помощью вызова метода EnableWindow объекта disconect_btn с true в качестве параметра производится установка окна кнопки разрыва соединения с сервером в активное сотояние.

	С помощью вызова метода EnableWindow объекта conect_btn с false в качестве параметра производится установка окна кнопки соединения с сервером в неактивное стостояние.

	Если от сервера получен положительный ответ (проверяется по значению переменной fl: если она имеет значение «+», то ответ положителен, если «-», то отрицателен), тогда производится отправка ему строки с командой USER:

	«pSocket->Send("USER " + login + "\n\r",strlen("USER ")+strlen(login) + strlen("\n\r"),1)», если нет, то осуществляется переход к пункту 14

Повторить 2-7

	 Повторить п 8-9 (с командой PASS: pSocket->Send("PASS " + pswd + "\n\r",strlen("PASS ")+strlen(pswd)+strlen("\n\r"),0))

	Повторить п 8-9 с командой STAT: 

	 pSocket->Send("STAT\n\r",strlen("STAT\n\r"),0)

	Послать серверу команду QUIT:

	 pSocket->Send("QUIT\n\r",strlen("QUIT\n\r"),0)

	

	
1.4 APOP аутентификация

		

	Производится объявление объекта md5Capi класса Cmd5Capi. Этот объект осуществляет вычисление хэш-функции MD5. Объявление переменных – CString out,in,test; int start,end; 

		Если соединение с сервером установлено то 3, инчае вывод окна ошибки:

		Установка окна кнопки соединения с сервером в неактивное сотояние

		Устанвка окна кнопки разрыва соединения в активное стостояние

		Получение строки ответа от сервера в массив и buf. Количество байт, полученных от сервера присваивается переменной int recived.

	Формирование с помощью метода строки messtr.Forma() строки messtr messtr.Format("S: %s",buf)

	Поиск в полученной от сервера строки приветствия уникальной метки.

	Вывод строки messtr в ListBox. 

	Обнуление массива buf

		Если от сервера получен положительный ответ, то 11, иначе 14

		Вычисление MD5 хэша от строки вида: метка_сервера+пароль

		Отправка серверу команды APOP:

out="APOP " + login + " " + md5Capi.Digest(in)+"\n\r"; 

pSocket->Send(out,out.GetLength(),0)

	Если получен положительный ответ, то отправка серверу команды STAT, иначе 14

	Отправка серверу команды QUIT. 	




1.5 AUTH аутентификация



		Если соединение с сервером установлено то 2, инчае вывод окна ошибки:

		Установка окна кнопки соединения с сервером в неактивное сотояние

		Устанвка окна кнопки разрыва соединения в активное стостояние

		Получение строки ответа от сервера в массив и buf. Количество байт, полученных от сервера присваивается переменной int recived.

	Формирование с помощью метода строки messtr.Forma() строки messtr messtr.Format("S: %s",buf)

	Поиск в полученной от сервера строки приветствия уникальной метки.

	Вывод строки messtr в ListBox. 

	Обнуление массива buf

		Если от сервера получен положительный ответ, то 11, иначе 14

		Вычисление MD5 хэша от метки сервера с паролем пользователя в качестве ключа.

		Отправка серверу команды APOP:

out="AUTH " + login + " " + md5Capi.Digest(in)+"\n\r";

pSocket->Send(out,out.GetLength(),0)

	Если получен положительный ответ, то отправка серверу команды STAT, иначе 14

	Отправка серверу команды QUIT. 	


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



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



2.1 Простая аутентификация



После подключения разрабатываемого клиентского приложения к серверу и воду пользователем необходимых строк, серверу отправляется команда USER с именем пользователя. После этого программа переходит в режим ожидания ответа сервера. После того как строка с ответом сервера приходит в сокет клиента, то эта строка сохраняется в соответствующий буфер, который используется для хранения строк, содержащих команды протокола. После этого производится проверка ответной строки сервера. Если строка ответа сервера содержит начальную подстроку –ERR, то значит ящика с данным именем на сервере не существует. В данном случае серверу отправляется команда QUIT и производится выход из процедуры. Если же строка начинается с +ОК, то почтовый ящик с данным именем существует на сервере и сервер ожидает пароля для доступа к нему. Далее производится отправка серверу строки с командой PASS, содержащей пароль пользователя для доступа к почтовому ящику. Далее программа опять переходит в режим ожидания ответа сервера и производится прием и анализ полученной от него строки. Если строка содержит начальную подстроку +ОК, значит пароль, введенный пользователем корректен, и сервер перешел в операционную фазу. Если строка-ответ сервера содержит подстроку –ERR, то серверу отправляется команда QUIT и производится выход из процедуры. 

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



2.2 APOP аутентификация



Если пользователем был выбран тип аутентификации с использованием бесключевой хэш-функции MD5, то алгоритм программы переходит к выполнению данной процедуры. В данном виде аутентификации используется строка, которая была получена из основной части алгоритма. На втором шаге алгоритма функции apop производится склеивание полученной строки метки времени сервера с паролем пользователя. После этого производится вычисление MD5 хэша от этой строки. После этого формируется строка для команды APOP. Эта строка имеет следующий вид: «APOP имя_пользователя хэш-функция». После того, как эта строка сформирована, она отправляется серверу. После этого программа переходит в состояние ожидания ответна от сервера. После получения строки с ответом сервера производится ее разбор. Если строка содержит начальную подстроку –ERR, то аутентификации е пройдена и производится отправка серверу строки с командой QUIT и выход из программы. Если строка содержит начальную подстроку +OK, то значит аутентификация пройдена успешно и программа переходит в операционную фазу. В этой фазе серверу отсылается команда STAT и после этого команда QUIT. После этого производится разрыв связи с сервером и завершение программы.



2.3 AUTH аутентификация (CRAM-MD5)



Вызов данной функции осуществляется в случае, если пользователем был выбран вид аутентификации с использованием ключевой функции MD5. Алгоритм функционирования данной функции практически полностью совпадает с алгоритмом, описным в предыдущем пункте., за исключением того, что:

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

-	Серверу отправляется строка вида «AUTH имя_пользователя хэш-функция»


3. Руководство пользователя



Разработанная программа имеет графический интерфейс





Рис.1 Интерфейс программы



После запуска программы пользователь должен указать адрес сервера к которому он обращается, номер порта, имя пользователя, а так же пароль, после чего должен выбрать вид аутентификации:

простая 

APOP

AUTH

После чего нажать клавишу “Подключиться”. При завершении работы программы или выборе другой аутентификации необходимо нажать клавишу “Отключиться”.

Для выхода из программы необходимо нажать крестик или клавишу “Выход”. 




Заключение



В результате выполнения работы была разработана программа, реализующая функции почтового клиента протокола POP3. Программа реализует функции авторизации, запроса статистики и завершения соединения. Программа реализована на языке программирования Си для ОС WINDOWS и имеет графический интерфейс. 

Таким образом, все требования задания выполнены в полном объеме.


Список использованных источников



		www.rsdn.ru

		www.codenet.ru

		www.firststeps.

			


Приложение А. Алгоритм функционирования программы





Простая аутентификация




Аутентификация с бесключевой хэш-функцией. Команда APOP




Аутентификация с ключевой хэш-функцией CRAM-MD5. AUTH.




Общий алгоритм