Запуск программы осуществляется с помощью запуска файла 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г.
ПРИЛОЖЕНИЕ 1
Form1.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 [] contents = System.IO. Directory. GetFileSystemEntries(dir + @"\messages\");
foreach (string s in contents)
{
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();
}
}
}