Главная страница
Навигация по странице:

  • УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

  • Постановка задачи: Разработать клиентское ПО для получения/отправки почтовых сообщений. Приложение должно реализовывать следующие задачи

  • Выполнение: SMTP

  • Результаты

  • Описание используемых классов и библиотек: В программе используются следующие модули: Form1.cs

  • System

  • Выводы: Приложение было написано на языке программирования C в среде разработки Visual Studio. Поставленная задача была выполнена в полном объеме. Листинг

  • фывфывфывфывфывфыв. Разработка почтового клиента по дисциплине Математические методы и вычислительные алгоритмы современных систем связи


    Скачать 153.75 Kb.
    НазваниеРазработка почтового клиента по дисциплине Математические методы и вычислительные алгоритмы современных систем связи
    Анкорфывфывфывфывфывфыв
    Дата07.09.2022
    Размер153.75 Kb.
    Формат файлаdocx
    Имя файлаKyrsovaya_Sharkeev_a (1).docx
    ТипКурсовая
    #665869

    ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ

    ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ

    УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

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

    ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»

    (СПбГУТ)

    Кафедра программной инженерии и вычислительной техники

    Курсовая работа

    На тему: Разработка почтового клиента

    по дисциплине «Математические методы и вычислительные алгоритмы современных систем связи»



    Выполнил: студент группы ИКПИ-81, Шаркеев Е.Д.

    Подпись_____________

    Проверил: Доцент кафедры ПИиВТ, Коробов С.А.

    Подпись_____________

    Постановка задачи:

    Разработать клиентское ПО для получения/отправки почтовых сообщений.

    Приложение должно реализовывать следующие задачи:

    1) Запрос статистики электронных сообщений у сервера.

    2) Получение сообщений с вложенными файлами по протоколу

    IMAP или POP3.

    3) Отправка сообщений с вложенными файлами по протоколу SMTP.

    4) Удаление писем с почтового сервера.

    5) Приложение должно использовать только безопасные (зашифрованные соединения), иметь графический интерфейс, достаточный для выполнения всех задач.

    Выполнение:

    SMTP (англ. Simple Mail Transfer Protocol — простой протокол передачи почты) — это широко используемый сетевой протокол, предназначенный для передачи электронной почты в сетях TCP/IP.

    POP3 (англ. Post Office Protocol Version 3 — протокол почтового отделения, версия 3) — стандартный интернет-протокол прикладного уровня, используемый клиентами электронной почты для получения почты с удалённого сервера по TCP-соединению.

    IMAP (англ. Internet Message Access Protocol) — протокол прикладного уровня для доступа к электронной почте.

    Для решения поставленной задачи мною был выбран язык программирования C#. В качестве протокола пересылки электронных писем был взят SMTP. Также, из протоколов для приема сообщений электронной почты был выбран IMAP, как более современный аналог POP3.

    Результаты:

    Рис. 1 (Вкладка авторизации)

    Для того, чтобы пользоваться функционалом приложения сперва необходимо пройти авторизацию (рисунок 1). После этого появится возможность отправлять/получать письма.



    Рис. 2 (Отправка письма)

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



    Рис 3. (Сообщение об успешной отправке письма)



    Рис 4. (Получение письма в почтовой службе gmail)

    На сервере видны изменения, что можно заметить на рисунке 4.



    Рис. 5 (Входящие письма)

    Во вкладке “Входящие” можно получить список писем (рисунок 5), а также удалить/прочитать конкретное письмо.



    Рис. 6 (Удаление письма)

    На рисунке 6, при нажатии на кнопку “Удалить” происходит удаление письма и вывод сообщения об успешном действии.



    Рис. 7 (Письмо удалено в почтовой службе)



    Рис. 8 (Чтение выбранного письма)

    Нажав на кнопку “Открыть” во вкладке “Входящие” можно прочитать некоторое выбранное письмо. Нажав на кнопку “Скачать” (рисунок 8), все прикрепленные файлы можно загрузить в корневую директорию проекта, в папку Emails.



    Рис. 9 (Корневая папка проекта)



    Рис. 10 (Загруженный файл в папке Emails)

    Описание используемых классов и библиотек:

    В программе используются следующие модули:

    Form1.cs - основной модуль, содержащий всю логику программы.

    MailListItem.cs - класс, используемый для хранения информации о конкретном письме

    Также, для реализации поставленной задачи были использованы следующие библиотеки:

    MailKit - это кроссплатформенная библиотека почтового клиента, построенная на основе MimeKit. С помощью этого класса была реализована возможность чтения писем по протоколу IMAP

    MimeKit - это библиотека C#, которую можно использовать для создания и анализа сообщений с использованием Multipurpose Internet Mail Extension (MIME), как это определено многочисленными спецификациями IETF.

    System.Net - Предоставляет простой программный интерфейс для многих современных сетевых протоколов. Он был использован для реализации отправки писем по протоколу SMTP.

    А также, был использован ряд классов пространства имен System.

    Описание интерфейса программы:

    Интерфейс программы состоит из 4 вкладок:

    • Авторизация

    • Письмо

    • Входящие

    • Отправить письмо

    Во вкладке “Авторизация”, как можно заменить на рисунке 1, есть 2 поля: Логин и Пароль. Для успешной авторизации необходимо указать корректный логин и пароль от почтового ящика. После, можно переходить на любую из оставшихся вкладок.

    На рисунке 2, во вкладке “Отправить письмо” существует ряд полей, которые необходимо указать для успешной отправки письма, а именно: адресат, тему письма и само сообщение. Также существует возможность прикрепить к письму файл. Для этого, в поле “Прикрепить файл” необходимо указать путь к файлу и нажать на кнопку “Загрузить”. После этого, нажать на кнопку “Отправить письмо”. В случае успешной отправки письма, произойдет вывод сообщения об успешной отправке.

    На рисунке 5, во вкладке “Входящие” необходимо нажать на кнопку “Обновить”, после этого произойдет загрузка писем из почтового ящика. Любое письмо можно удалить или прочитать, нажав на соответствующую кнопку.

    На рисунке 8, во вкладке “Письмо” можно прочитать конкретное письмо, предварительно выбрав его во вкладке “Входящие” и нажав на кнопку “Открыть”. Таким образом, можно прочитать любое письмо, а также, при наличии приложенных файлов можно нажать на кнопку “Скачать”, тем самым загрузив приложенные к письму файлы на компьютер.


    Выводы:

    Приложение было написано на языке программирования C# в среде разработки Visual Studio. Поставленная задача была выполнена в полном объеме.

    Листинг:

    Form1.cs

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;

    using System.Net;

    using System.Net.Mail;

    using MimeKit;

    using System.Windows.Forms;

    using MailKit.Net.Imap;

    using MailKit.Search;

    using MailKit;

    using System.Security.Authentication;

    using System.IO;

    namespace Client_mail_CSharp

    {

    public partial class Form1 : Form

    {

    MailMessage _Message;

    private List m_FileNames = new List();

    private string m_MailAdressTo;

    private MailAddress _MailFrom;

    private MailAddress _MailTo;

    private string m_MailTheme;

    private string m_MailText;

    private string m_Password;

    private string m_Login;

    public Form1()

    {

    InitializeComponent();

    }

    private void Form1_Load(object sender, EventArgs e)

    {

    client = new ImapClient();

    }

    private void textBox2_TextChanged(object sender, EventArgs e)

    {

    m_Password = textBox2.Text;

    }

    private void textBox1_TextChanged(object sender, EventArgs e)

    {

    m_Login = textBox1.Text;

    }

    private void button3_Click(object sender, EventArgs e)

    {

    if (String.IsNullOrEmpty(textBox1.Text) ||

    String.IsNullOrEmpty(textBox2.Text) ||

    String.IsNullOrEmpty(textBox4.Text)

    )

    {

    MessageBox.Show("Введите все поля");

    }

    else

    {

    _MailFrom = new MailAddress(m_Login, m_MailTheme);

    _MailTo = new MailAddress(m_MailAdressTo, "Name");

    _Message = new MailMessage(_MailFrom, _MailTo);

    _Message.Body = m_MailText;

    _Message.Subject = m_MailTheme;

    for (int i = 0; i < m_FileNames.Count; i++)

    {

    _Message.Attachments.Add(new Attachment(m_FileNames[i]));

    }

    SmtpClient smptClientz = new SmtpClient();

    smptClientz.Host = "smtp.gmail.com";

    smptClientz.Port = 587;

    smptClientz.EnableSsl = true;

    smptClientz.DeliveryMethod = SmtpDeliveryMethod.Network;

    smptClientz.UseDefaultCredentials = false;

    smptClientz.Credentials = new NetworkCredential(_MailFrom.Address, m_Password);

    smptClientz.Send(_Message);

    MessageBox.Show("Письмо отправлено");

    }

    }

    ImapClient client;

    IList messages;

    private List GetMail()

    {

    var list = new List();

    client.ServerCertificateValidationCallback = (mysender, certificate, chain, sslPolicyErrors) => { return true; };

    client.CheckCertificateRevocation = false;

    client.Connect("imap.gmail.com", 993, true);

    client.Authenticate(m_Login, m_Password);

    client.Inbox.Open(MailKit.FolderAccess.ReadWrite);

    var uids = client.Inbox.Search(SearchQuery.DeliveredAfter(DateTime.Today.AddDays(-90)));

    messages = client.Inbox.Fetch(uids, MessageSummaryItems.Envelope | MessageSummaryItems.BodyStructure);

    if (messages != null && messages.Count > 0)

    {

    foreach (var msg in messages)

    {

    // var textPart = msg.BodyParts.First(b => b.ContentType.MediaType == "text");

    //MimeKit.TextPart body = null;

    //if (textPart != null)

    //{

    // body = client.Inbox.GetBodyPart(msg.UniqueId, msg.BodyParts.First()) as MimeKit.TextPart;

    //}

    list.Add(new MailListItem

    {

    Date = msg.Date.ToString(),

    From = msg.Envelope.From.ToString(),

    Subj = msg.Envelope.Subject,

    HasAttachments = msg.Attachments != null && msg.Attachments.Count() > 0,

    Body = msg.Body.ToString(),

    //body?.Text,

    });

    }

    count = list.Count;

    label8.Text = "Количество писем в почтовом ящике: " + list.Count;

    }

    return list;

    }

    private int count;

    private void textBox5_TextChanged(object sender, EventArgs e)

    {

    }

    private void label7_Click(object sender, EventArgs e)

    {

    }

    private void button1_Click_1(object sender, EventArgs e)

    {

    if (textBox5.Text != "")

    {

    string fileName = textBox5.Text;

    m_FileNames.Add(fileName);

    label7.Text += " " + fileName;

    textBox5.Text = "";

    }

    }

    private void textBox4_TextChanged(object sender, EventArgs e)

    {

    m_MailTheme = textBox4.Text;

    }

    private void richTextBox1_TextChanged(object sender, EventArgs e)

    {

    m_MailText = richTextBox1.Text;

    }

    private void textBox3_TextChanged(object sender, EventArgs e)

    {

    m_MailAdressTo = textBox3.Text;

    }

    private List list;

    private void button2_Click(object sender, EventArgs e)

    {

    list = GetMail();

    bindingSource1.DataSource = list;

    }

    private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)

    {

    if(e.ColumnIndex == 5)

    {

    MessageBox.Show("Письмо было удалено");

    client.Inbox.AddFlags(count-1-e.RowIndex, MessageFlags.Deleted, false);

    client.Inbox.Expunge();

    }

    if(e.ColumnIndex == 6)

    {

    MessageBox.Show("Письмо было открыто");

    tabControl1.SelectTab(tabPage4);

    MailListItem mail = list[e.RowIndex];

    textBox7.Text = mail.From;

    textBox6.Text = mail.Subj;

    var body = client.Inbox.GetBodyPart(e.RowIndex, messages[count - 1 - e.RowIndex].BodyParts.First());

    richTextBox2.Text = body.ToString();

    foreach (var att in messages[count - 1 - e.RowIndex].Attachments.OfType())

    {

    var part = (MimePart)client.Inbox.GetBodyPart(count - 1 - e.RowIndex, att);

    var pathDir = Path.Combine(Environment.CurrentDirectory, "Emails", (count - 1 - e.RowIndex).ToString());

    if(!Directory.Exists(pathDir))

    {

    Directory.CreateDirectory(pathDir);

    }

    var path = Path.Combine(pathDir, part.FileName);

    label13.Text = "Прикрепленные файлы: " + part.FileName;

    if (!File.Exists(path))

    {

    var strm = File.Create(path);

    part.Content.DecodeTo(strm);

    }

    }

    }

    }

    private void label13_Click(object sender, EventArgs e)

    {

    }

    }

    }

    MailListItem.cs

    namespace Client_mail_CSharp

    {

    internal class MailListItem : Form1 {

    public string Index { get; internal set; }

    public string Date { get; internal set; }

    public string From { get; internal set; }

    public string Subj { get; internal set; }

    public bool HasAttachments { get; internal set; }

    public string Body { get; internal set; }

    }

    }


    написать администратору сайта