Курсовая работа: Разработка приложения клиента электронной почты
Название: Разработка приложения клиента электронной почты Раздел: Рефераты по информатике Тип: курсовая работа |
AСТРAХAНСКИЙ ГОСУДAРСТВEННЫЙ УНИВEРСИТEТ Кaфeдрa информaционных систeм и тeхнологий Курсовaя рaботa по дисциплинe «Объeктно-ориeнтировaнноe прогрaммировaниe» нa тeму: “Разработка приложения – клиента электронной почты” Выполнили: студeнты группы ЗИ-31 Егоров Д.С. Арушанов С.С. Курсовaя рaботa допущeнa к зaщитe Руководитeль: aсс. Пaвлов A.A. Курсовaя рaботa выполнeнa с оцeнкой ___________ Пaвлов A.A.___________ Aстрaхaнь – 2009 г. СОДЕРЖАНИЕ2.1. Общие сведения о работе программы 2.2. Функциональное назначение 2.3. Инсталляция и выполнение программы 2.4. Общий алгоритм программного обеспечения 2.5. Разработанные меню и интерфейсы 2.6. Описание основных классов и методов приложения 3. ПРОГРАММА И МЕТОДИКА ИСПЫТАНИЙ СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ ВВЕДЕНИЕЯзык С++, разработанный Microsoft имеет массу преимуществ перед другими языками типа С, С++, Java: простота, объектная ориентированность, типовая защищенность, «сборка мусора», поддержка совместимости версий и многое другое. Данные возможности позволяют быстро и легко разрабатывать приложения. При создании С++ его авторы учитывали достижения многих других языков программирования: C++, С, Java, Visual Basic и т.д. Надо заметить, что поскольку С++ разрабатывался что называется «с нуля», у его авторов была возможность не переносить в него все неудачные особенности любого из предшествующих языков. Особенно это касается проблемы совместимости с предыдущими версиями. В результате получился действительно простой, удобный и современный язык, который по мощности не уступает C++, но существенно повышает продуктивность разработок. Ввиду высокой объектной ориентированности, язык С++ великолепно подходит для быстрого конструирования различных компонентов — от высокоуровневой бизнес-логики до системных приложений, использующих низкоуровневый код. Также следует отметить, что С++ является и Web-ориентированным — с помощью простых встроенных конструкций языка ваши компоненты легко превратятся в Web-сервисы, к которым можно будет обращаться из Интернета, используя любой язык на любой операционной системе. Дополнительные возможности и преимущества С++ перед другими языками приносит использование современных Web-технологий, таких как: XML (Extensible Markup Language) и SOAP (Simple Object Access Protocol). Удобные методы для разработки Web-приложений позволяют программистам, владеющим навыками объектно-ориентированного программирования, легко освоиться в разработке Web-сервисов. Цель данной курсовой работы укрепить и улучшить практические навыки основ объектно-ориентированного программирования, полученных во время изучения курса, по данному предмету, а также научиться применять полученные знания в сетевом программировании .NET. 1. ТЕХНИЧЕСКОЕ ЗАДАНИЕРазработка приложения-клиента электронной почты. В ходе разработки клиентского приложения электронной почты, необходимо разработать и реализовать с использование двух основных протоколов передачи электронной почты POP3 и SMTP: · методы приема и отправки сообщений; · интуитивно понятный интерфейс, обеспечивающий удобную работу с приложением; · сохранение почтовых сообщений на локальном диске компьютера; · реализовать алгоритмы построения списка сообщений; · при выборе сообщения обеспечить отображение темы сообщения, отправителя и адресата письма, а также текст самого сообщения; · дополнительно необходимо реализовать возможность сворачивания приложения в трей панели задач Windows; · проверку наличия новых сообщений по времени и смену иконки в трее при получении новых сообщений. 2. РАБОЧИЙ ПРОЕКТ2.1. Общие сведения о работе программы Программа разработaнa в среде программирования Microsoft Visual Studio 2008, на языке программирования C++. Программа отправляет запрос на сервер электронной почты. Протокол POP3 проверяет правильность ввода имени и пароля электронной почты. После этого программа получает ответ от протокола о статусе ввода пароля и имени (правильно, не правильно). Если все переменные введены правильно, то происходит подключение к серверу. После этого программа получает список сообщений с сервера, а после этого сохраняет их на локальном компьютере. После завершения получения сообщения происходит отсоединение от сервера POP3. При отправке сообщений используется протокол SMTP. В начале происходит авторизация на сервере SMTP, а после этого непосредственная передача сообщения почтовому демону. 2.2. Функциональное назначение Программа предназначена для получения и отправки электронных писем, содержит теоретические и практические материалы, позволяющие систематизировать знания по работе с сетевыми протоколами электронной почты. 2.3. Инсталляция и выполнение программы Для запуска программы из среды «Microsoft Visual Studio 2008» необходимо, зайдя в «Microsoft Visual Studio 2008» запустить файл Mail client.sln. 2.4. Общий алгоритм программного обеспечения Программа состоит из методов, которые используются для подключения к серверам электронной почты, используя протоколы электронной почты, а так же для получения и отправки электронных писем. При нажатии на меню «Получить почту», происходит подключение к серверу через протокол, и получение списка входящих писем. Рис. 1.1. «Диаграмма работы протокола POP3» При нажатии на кнопку написать письмо в меню «Файл», загружается окно нового письма, в котором содержатся поля: кому адресовано письмо, поле темы, поле для текста письма и кнопка для отправки письма. При нажатии на кнопку «SendMail», происходит отправка письма, используя протокол SMTP. При нажатии кнопки выход в меню «Файл», происходит завершение работы программы. Рис. 1.2. «Диаграмма работы протокола SMTP» 2.5. Разработанные меню и интерфейсы При запуске программы на экране появляется главное окно программы с элементами управления (Рис. 2.1). Рис. 2.1. «Главное окно» Для настройки почтового клиента необходимо нажать на меню «Настройки». В результате, загружается окно настроек (рис. 2.2.). Рис. 2.2. «Настройки» Для отправки письма необходимо запустить окно «Написать письмо» (рис 2.3.), нажатием на кнопку «Написать письмо» в меню «Файл». Рис. 2.3. окно «Написать сообщение» 2.6. Описание основных классов и методов приложения Рис. 3.1. «Диаграмма классов» Класс POP3 Класс POP3, также как и одноименный протокол используется для извлечения сообщений с почтового сервера. Данный класс наследуется от System.Net.Sockets.TcpClient реализованного в VS 2008. Класс содержит несколько методов: · ConnectPOP – используется для установки соединения с сервером; · DisconnectPOP – закрывает соединение с сервером; · ListMessages – получаем список сообщений с сервера; · RetriveMessage – получение сообщения с сервера; · DeleteMessage – удаление сообщения на сервере; · Write – принимает сообщение на входе и записывает его в сетевой поток TCP; · Response – метод обратный от Write. Класс SMTP Класс SMTP как и одноименный протокол обеспечивает отправку сообщений. Содержит метод SendMail , который обеспечивает отправку сообщения по протоколу SMTP. Класс Form1 Класс Form1 обеспечивает интерфейс главного окна программы, а также обеспечивает функциональность сохранения и отображения принятых сообщений. Основные методы: · LoadProfile – загрузка файла профиля почтового ящика; · ReadMess – чтение сообщения из файла; · FileCreate – сохранение почтового сообщения; · ListMess – загрузка сообщений в элемент ListView; · ItemsAdd – добавление новых сообщений в элемент ListView; Класс FormSettings Класс FormSettings обеспечивает интерфейс окна настроек почтового ящика, а также обеспечивает сохранение этих настроек в файл профиля. Основные методы: · LoadProfile – загрузка файла профиля почтового ящика; · EditProfile – сохранение изменений профиля почтового ящика; 3. ПРОГРАММА И МЕТОДИКА ИСПЫТАНИЙЗапуск программы осуществляется с помощью запуска файла Mail client.sln из среды разработки «MVS-2008». Вверху окна расположены кнопки главного меню (рис. 3.5.1). Ниже расположено поле, в которое загружается список полученных писем. В самое нижнее поле загружается текст письма. Результатом нажатия на меню «Получить почту», будет загрузка входящих писем в верхнее поле. Результатом нажатия на любое письмо, будет загрузка текста письма в нижнее поле. Для отправки письма нужно загрузить окно «Написать письмо» (рис 3.5.3) в меню файл. Результатом нажатия кнопки «SendMail» в окне «Написать письмо» будет отправка Эл. письма адресату. Результатом нажатия кнопки «выход» в меню «файл», будет выход из программы. ЗАКЛЮЧЕНИЕРезультатом выполнения курсовой работы на тему «Разработка приложения-клиента электронной почты» стала программа, содержащая в себе методы реализации протоколов электронной почты POP3 и SMTP, так как, все современные почтовые сервера используют эти протоколы, а также методы отправки и приема писем. Программа представляет собой удобный пользовательский интерфейс, интуитивно понятный для любого пользователя, программе не требуется установка, что позволяет использовать программу с любых носителей информации. СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ1. Герберт Шилдт «Полный справочник по C++», 2004 г. 2. Лабор В.В «Создание приложений для Windows», 2003 г. 3. Агуров П.В «Разработка компонентов в MS Visual Studio», 2008 г. 4. Э.Кровчик, В.Кумар, Н.Логари, А.Мунгале, К.Нагел, Т.Паркер, Ш.Шивакумар «NET сетевое программирование для профессионалов»,2005г. ПРИЛОЖЕНИЕ 1Form1.cs namespace Mail_client { public partial class Form1 : Form { private string dir; public static int countMesStart; public static int countMes=0; public static string sServerName ; public static string sUserName; public static string sPassword; public static string SMTPserver; private FormSettings fset= new FormSettings (); private FormNewMess fnewmess = new FormNewMess (); public Form1() { InitializeComponent(); this .ShowInTaskbar = false ; dir = Directory .GetCurrentDirectory(); ItemsAdd(); LoadProfile(); } public string LoadProfile() //загрузка файла профиля { FileStream fs = new FileStream (dir+"\\messages\\profile\\porfile.txt", FileMode .Open, FileAccess .Read); StreamReader sr = new StreamReader (fs); string CurLine; int i = 0; while ( (CurLine = sr.ReadLine()) != null ) { i++; if (i==1) countMes = Convert .ToInt32(CurLine); if (i == 2) { sServerName = CurLine; } if (i == 3) sUserName = CurLine; if (i == 4) sPassword = CurLine; if (i == 4) SMTPserver = CurLine; } countMesStart = countMes; fs.Close(); sr.Close(); return CurLine; } public string ReadMess(string num, int c) //чтение сообщения { String fil=""; if (c==2 ) fil = ""; if (c == 1) fil = ".txt"; FileStream fs = new FileStream (dir+"\\messages\\" + num + fil, FileMode .Open, FileAccess .Read); StreamReader sr = new StreamReader (fs); string CurLine=""; CurLine = sr.ReadToEnd(); fs.Close(); sr.Close(); return CurLine; } public void Get() //получение сообщений с сервера { string content; POPException.POP3 oPOP = new POPException.POP3 (); oPOP.ConnectPOP(sServerName, sUserName, sPassword); ArrayList MessageList= oPOP.ListMessages(); foreach (POPException.POP3EmailMessage POPMsg in MessageList) { POPException.POP3EmailMessage POPMsgContent= oPOP.RetriveMessage(POPMsg); content= POPMsgContent.msgContent; string filename = Theme(content); FileCreate(filename,content); // richTextBox2.Text += content; ItemsAdd(); } oPOP.DisconnectPOP(); } public string Theme(string content) //процедура получения темы сообщения { string resultValue=""; char m='\r' ; int i = content.LastIndexOf("Subject:"); i += 9; for ( char c=content[i];content[i]!=m; i++) { c = content[i]; resultValue +=c; } return resultValue; } public string FromMess(string content) //получение поля ОТ { string resultValue = ""; char m = '\r'; int i = content.IndexOf("From:"); i+=6; for (char c = content[i]; content[i] != m; i++) { c = content[i]; resultValue += c; } return resultValue; } public string ToMess(string content) //получения поля кому { string resultValue = ""; char m = '\r'; int i = content.IndexOf("\nTo:"); i += 4; for (char c = content[i]; content[i] != m; i++) { c = content[i]; resultValue += c; } return resultValue; } public void FileCreate(string filename,string content) //процедура создания файла { countMes++; FileStream myStream=File .Create(dir+"\\messages\\"+countMes+".txt"); int z = content.Length; for ( int i=0; i < z; i++) { char c = content[i]; myStream.WriteByte((byte )c); } myStream.Close(); } public void ListMess(string num,string theme, string from) // добавление сообщений в листвью { ListViewItem lvi = new ListViewItem ((listView1.Items.Count + 1).ToString()); lvi.SubItems.Add(theme); lvi.SubItems.Add(from); listView1.Items.Add(lvi); } public void ItemsAdd()// Добавление новых сообщений {string strin=""; // listBox1.Items.Clear(); listView1.Items.Clear(); //char c; string [] catchword = System.IO.Directory .GetFileSystemEntries(dir + @"\messages\"); foreach (string s in catchword) { if ((s.IndexOf("profile") == -1)) { for (int z = s.LastIndexOf("\\")+1; z < s.Length; z++) { char c = s[z]; strin += c; } string content=ReadMess(strin, 2); string from = FromMess(content); ListMess(strin,Theme(content), from); // listBox1.Items.Add(strin); strin = ""; } } } public string ShowMes() //процедура показа выделенного сообщения { string resultValue = ""; if (listView1.SelectedItems.Count == 0) return resultValue ; string x = listView1.SelectedItems[0].Text; string content = ReadMess(listView1.SelectedItems[0].Text, 1); // ListMess(x,Theme(content), FromMess(content)); Them.Text = Theme(content); From.Text = FromMess(content); To.Text = ToMess(content); char m = '\n'; char z = '0'; int i = content.LastIndexOf("Content-Transfer-Encoding:"); i += 9; while (content[i] != m) i++; for (char c = content[i+1]; i < (content.Length); i++) { c = content[i]; resultValue += c; } return resultValue ; } private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { string content = ShowMes(); richTextBox3.Text = content; } private void настройкиЯщикаToolStripMenuItem_Click(object sender, EventArgs e) //показ формы настройки ящмка { fset.ShowDialog(this ); } private void mnuShow_Click(object sender, EventArgs e) //отображение главной формы { //Включаем отображения приложения на панели задач при запуске this .ShowInTaskbar = true ; //Показываем форму this .Show(); timer1.Enabled = false ; notifyIcon1.Icon =new Icon (dir+@"\messages\profile\Folder1.ico"); //Отключаем доступность пункта меню mnuShow mnuShow.Enabled = false ; //Включаем доступность пункта меню mnuHide mnuHide.Enabled = true ; //Переменной Hidden устанавливаем значение false } private void mnuHideToolStripMenuItem_Click(object sender, EventArgs e)//сворачивание главной формы в трей { this .ShowInTaskbar = false ; this .Hide(); mnuShow.Enabled = true ; mnuHide.Enabled = false ; timer1.Enabled = true ; } private void notifyIcon1_DoubleClick(object sender, EventArgs e) //открытие формы по щелчку на иконке в трее { mnuShow_Click(this , new EventArgs ()); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) //закрытие главной формы { if (e.CloseReason == CloseReason .UserClosing) { e.Cancel = true ; this .Hide(); mnuShow.Enabled = true ; mnuHide.Enabled = false ; timer1.Enabled = true ; } } private void выходToolStripMenuItem_Click(object sender, EventArgs e) // процедура выхода из программы { notifyIcon1.Visible = false ; this .ShowInTaskbar = false ; this .Hide(); listView1.Items.Clear(); Application .Exit(); } private void написатьПисьмоToolStripMenuItem_Click(object sender, EventArgs e)//показ формы Нового сообщения { fnewmess.ShowDialog(this ); private void timer1_Tick(object sender, EventArgs e) //таймер отвечает за проверку сообщений по времени { Get(); if (countMesStart < countMes) { notifyIcon1.Icon = new Icon (dir + @"\messages\profile\NotePad.ico"); } } private void listView1_ItemActivate(object sender, EventArgs e)//изменение выброного сообщения { string content = ShowMes(); richTextBox3.Text = content; } private void получитьПочтуToolStripMenuItem_Click(object sender, EventArgs e) { Get(); } private void Form1_Deactivate(object sender, EventArgs e) { if (WindowState == FormWindowState .Minimized) { this .ShowInTaskbar = false ; this .Hide(); mnuShow.Enabled = true ; mnuHide.Enabled = false ; timer1.Enabled = true ; } } private void Form1_Activated(object sender, EventArgs e) { if (WindowState == FormWindowState .Normal) { this .ShowInTaskbar = true ; //Показываем форму this .Show(); timer1.Enabled = false ; mnuShow.Enabled = false ; mnuHide.Enabled = true ; notifyIcon1.Icon = new Icon (dir + @"\messages\profile\Folder1.ico"); } } } } Program.cs namespace Mail_client { namespace POPException { public class POPException : System.ApplicationException { public POPException(string str) : base (str) { } } static class Program { static Form1 frm = null ; public static Form1 MainForm { get { return frm; } } /// <summary> /// The main entry point for the application. /// </summary> [STAThread ] static void Main() { Application .EnableVisualStyles(); Application .SetCompatibleTextRenderingDefault(false ); Application .Run(frm = new Form1 ()); } } public class POP3EmailMessage //класс описывающий emailMessage { public long msgNumber; public long msgSize; public bool msgReceived; public string msgContent; } public class SMTP { public void SendMail(string sSMTPServer, string sFrom, string sTo, string sSubject, string sBody)//класс SMTP отвечающий за отправку сообщений { SmtpClient client = new SmtpClient (sSMTPServer, 25); client.Credentials = new NetworkCredential (Form1 .sUserName, Form1 .sPassword); MailMessage message = new MailMessage (Form1 .sUserName, sTo, sSubject, sBody); client.Send(message); } } public class POP3 : System.Net.Sockets.TcpClient // Класс POP3 отвечающий за доставку смс сообщений { public void ConnectPOP(string sServerName, string sUserName, string sPassword) // соединение с POP сервером { string sMessages; string sResult; //вызываем метод connect класса TcpClient Connect(sServerName, 110); sResult = Response(); //проверка ответа if (sResult.Substring(0, 3) != "+OK") throw new POPException (sResult); //отправляем имя пользователя sMessages = "USER " + sUserName + "\r\n"; Write(sMessages); sResult = Response(); //проверка ответа if (sResult.Substring(0, 3) != "+OK") throw new POPException (sResult); //отправляем пароль sMessages = "PASS " + sPassword + "\r\n"; Write(sMessages); sResult = Response(); //проверка ответа if (sResult.Substring(0, 3) != "+OK") throw new POPException (sResult); } public void DisconnectPOP() //отсоединение от POP сервера { string sMessage; string sResult; sMessage = "QUIT\r\n"; Write(sMessage); sResult = Response(); //проверка ответа if (sResult.Substring(0, 3) != "+OK") throw new POPException (sResult); } public ArrayList ListMessages() //получение списка сообщений с сервера { string sMessage; string sResult; ArrayList returnValue = new ArrayList (); sMessage = "LIST\r\n"; Write(sMessage); sResult = Response(); //проверка ответа if (sResult.Substring(0, 3) != "+OK") throw new POPException (sResult); while (true ) { sResult = Response(); if (sResult == ".\r\n") { // Program.MainForm.Add(returnValue); return returnValue; } else { POP3EmailMessage oMailMessage = new POP3EmailMessage (); //Определяем разделитель char [] sep = { ' ' }; //используем метод Split, чтобы разбить массив string [] values = sResult.Split(sep); //Помещаем данные в объект OMailMessage long count=Int32 .Parse(values[0]); // ToString(count); // Program.MainForm.Add(rv); oMailMessage.msgNumber = Int32 .Parse(values[0]); oMailMessage.msgSize = Int32 .Parse(values[1]); oMailMessage.msgReceived = false ; returnValue.Add(oMailMessage); continue ; } } } public POP3EmailMessage RetriveMessage(POP3EmailMessage msgRETR) //доставка сообщений с POP сервера { string sMessage; string sResult; POP3EmailMessage oMailMessage = new POP3EmailMessage (); oMailMessage.msgNumber = msgRETR.msgNumber; oMailMessage.msgSize = msgRETR.msgSize; //для получения соответсвующего сообщения посылаем RETR sMessage = "RETR " + msgRETR.msgNumber + "\r\n"; Write(sMessage); sResult = Response(); if (sResult.Substring(0, 3) != "+OK") throw new POPException (sResult); //поскольку сообщение получено устанавливаем во флаге true oMailMessage.msgReceived = true ; while (true ) { sResult = Response(); if (sResult == ".\r\n") break ; else oMailMessage.msgContent += sResult; } string content = oMailMessage.msgContent; return oMailMessage; } public void DeleteMessage(POP3EmailMessage msgDELE) //удаление сообщений с POP сервера { string sMessage; string sResult; sMessage = "DELE" + msgDELE.msgNumber + "\r\n"; Write(sMessage); sResult = Response(); if (sResult.Substring(0, 3) != "+OK") throw new POPException (sResult); } private void Write(string sMessage) {//используется для перекодирования данных System.Text.ASCIIEncoding oEncodeData = new System.Text.ASCIIEncoding (); //теперь пересылаем сообщение в буфер для отправки в сетевой поток TCP byte [] WriteBuffer = new byte [1024]; WriteBuffer = oEncodeData.GetBytes(sMessage); //выводим содержимое буффера в поток TCP NetworkStream NetStream = GetStream(); NetStream.Write(WriteBuffer, 0, WriteBuffer.Length); } private string Response() //перекодировка сообщений { System.Text.ASCIIEncoding oEncodedData = new System.Text.ASCIIEncoding (); byte [] ServerBuffer = new Byte [1024]; NetworkStream NetStream = GetStream(); int count = 0; while (true ) { byte [] buff = new Byte [2]; int bytes = NetStream.Read(buff, 0, 1); if (bytes == 1) { ServerBuffer[count] = buff[0]; count++; if (buff[0] == '\n') break ; } else break ; } string ReturnValue = oEncodedData.GetString(ServerBuffer, 0, count); return ReturnValue; } } } } FormSettings.cs namespace Mail_client { public partial class FormSettings : Form { private string dir1; public FormSettings() { InitializeComponent(); dir1=Directory .GetCurrentDirectory(); LoadProfile(); } public string LoadProfile() //считывание файла профиля { FileStream fs = new FileStream (dir1+ "\\messages\\profile\\porfile.txt", FileMode .Open, FileAccess .Read); StreamReader sr = new StreamReader (fs); string CurLine; int i = 0; while ((CurLine = sr.ReadLine()) != null ) { i++; if (i == 1) { Form1 .countMes = Convert .ToInt32(CurLine); } if (i == 2) { POP3.Text = CurLine; Form1 .sServerName = CurLine; } if (i == 3) { UserName.Text = CurLine; Form1 .sUserName = CurLine; } if (i == 4) { Pass.Text = CurLine; Form1 .sPassword = CurLine; } if (i == 5) { SMTP.Text = CurLine; Form1 .SMTPserver = CurLine; } } fs.Close(); sr.Close(); return CurLine; } public void EditProfile() // изменение профиля почтового ящика { StreamWriter sw = new StreamWriter (dir1+ "\\messages\\profile\\porfile.txt"); //сохраняем данные почтового ящика { sw.WriteLine(Form1 .countMes.ToString()); sw.WriteLine(POP3.Text); sw.WriteLine(UserName.Text); sw.WriteLine(Pass.Text); sw.WriteLine(SMTP.Text); } // FileStream myStream = File.Create("F:\\messages\\profile\\porfile.txt"); string str = Form1 .countMes.ToString(); sw.Close(); } private void Cancel_Click(object sender, EventArgs e) //отмена { this .Hide(); } private void FormSettings_FormClosing(object sender, FormClosingEventArgs e) //при закрытии формы { //отменятся все изменения и форма скрывается e.Cancel = true ; this .Hide(); } private void Save_Click_1(object sender, EventArgs e) //сохранение профиля { EditProfile(); } private void Ok_Click(object sender, EventArgs e) //при нажатии клавиши Ок сохраняется профиль {//и форма сворачивается EditProfile(); this .Hide(); } } } |