using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.IO;
namespace ReadMail
{
public partial class Form1 : Form
{
private string pop3Server;
private TcpClient tcpClient;
private NetworkStream networkStream;
private StreamReader sr;
private StreamWriter sw;
public Form1()
{
InitializeComponent();
}
//单击建立连接按钮触发的事件
private void buttonConnect_Click(object sender, EventArgs e)
{
//设置鼠标光标为等待状态
Cursor.Current = Cursors.WaitCursor;
try
{
int index = textBoxUser.Text.IndexOf('@');
//大部分pop3服务器都加前缀pop3.,这里仅获取这种服务器
//对不以pop3.为前缀的这个例子未进行处理
pop3Server = "pop3." + textBoxUser.Text.Substring(index + 1);
//建立与POP3服务器的连接,使用默认端口110
tcpClient = new TcpClient(pop3Server, 110);
listBoxStatus.Items.Add("与pop3服务器连接成功");
}
catch
{
MessageBox.Show("与服务器连接失败");
return;
}
string str;
listBoxStatus.Items.Clear();
//获取 Networkstream对象,以便通过建立好的连接发送和接收数据
networkStream = tcpClient.GetStream();
//得到读对象,并查找字节顺序标记,防止显示乱码
sr = new StreamReader(networkStream);
//得到写对象
sw = new StreamWriter(networkStream);
//读取服务器回送的连接信息
if (ReadDataFromServer() == null)
return;
//向服务器发送用户名,请求确认
if (SendDataToServer("USER " + textBoxUser.Text) == false)
return;
if (ReadDataFromServer() == null)
return;
//向服务器发送密码,请求确认
if (SendDataToServer("PASS " + textBoxPassword.Text) == false)
return;//5~1-a-s-p-x
if (ReadDataFromServer() == null)
return;
//向服务器发送STAT命令,请求获取邮件总数和总字节数
if (SendDataToServer("LIST") == false)
return;
if ((str = ReadDataFromServer()) == null)
return;
string[] splitString = str.Split(' ');
//从字符串中取子串获取邮件总数
int count = int.Parse(splitString[1]);
//判断邮箱中是否有邮件
if (count > 0)
{
//设置对应状态信息
buttonRead.Enabled = true;
buttonDelete.Enabled = true;
listBoxOperation.Items.Clear();
groupBoxOperation.Text = "信箱中共有 " + splitString[1] + " 封邮件";
//向邮件列表框中添加邮件
for (int i = 0; i < count; i++)
{
if ((str = ReadDataFromServer()) == null)
return;
splitString = str.Split(' ');
listBoxOperation.Items.Add(string.Format("第{0}封邮件,{1}字节", splitString[0], splitString[1]));
}
listBoxOperation.SelectedIndex = 0;
//读出结束符
if ((str = ReadDataFromServer()) == null)
return;
}
else
{
groupBoxOperation.Text = "信箱中没有邮件";
buttonRead.Enabled = false;
buttonDelete.Enabled = false;
}
buttonConnect.Enabled = false;
buttonDisconnect.Enabled = true;
//设置鼠标光标为默认光标
Cursor.Current = Cursors.Default;
}
//向服务器发送信息
private bool SendDataToServer(string str)
{
try
{
sw.WriteLine(str);
sw.Flush();
listBoxStatus.Items.Add("发送:" + str);
return true;
}
catch (Exception err)
{
MessageBox.Show(err.Message, "发送 " + str + " 失败");
return false;
}
}
//从网络流中读取服务器回送的信息
private string ReadDataFromServer()
{
//从流中读取服务器返回的信息,写入信息列表框
string str = null;
try
{
str = sr.ReadLine();
listBoxStatus.Items.Add("收到:" + str);//5+1+a+s+p+x
//如果是-ERR,表明有错
if (str[0] == '-')
{
MessageBox.Show(str, "有错了");
str = null;
}
}
catch (Exception err)
{
MessageBox.Show(err.Message, "无法读取");
}
return str;
}
//单击断开连接按钮触发的事件
private void buttonDisconnect_Click(object sender, EventArgs e)
{
//向服务器发送QUIT命令
SendDataToServer("QUIT");
sr.Close();
sw.Close();
networkStream.Close();
tcpClient.Close();
listBoxOperation.Items.Clear();
richTextBox1.Clear();
listBoxStatus.Items.Clear();
buttonConnect.Enabled = true;
buttonDisconnect.Enabled = false;
}
//单击阅读信件按钮触发的事件
private void buttonRead_Click(object sender, EventArgs e)
{
//设置鼠标光标为等待状态
Cursor.Current = Cursors.WaitCursor;
string mailMessage = listBoxOperation.SelectedItem.ToString();
mailMessage = mailMessage.Substring(1, mailMessage.IndexOf("封") - 1);
if (SendDataToServer("RETR " + mailMessage) == false)
return;
string receiveData = sr.ReadToEnd();
//例子未进行解码处理
//而仅仅将源代码原样显示出来,所以看到的涉及具体内容的信息将会是乱码
richTextBox1.Text = "源代码:\r\n";
richTextBox1.AppendText(receiveData);
//设置鼠标光标为默认光标
Cursor.Current = Cursors.Default;
}
//单击删除信件按钮触发的事件
private void buttonDelete_Click(object sender, EventArgs e)
{
string str = listBoxOperation.SelectedItem.ToString();
str = str.Substring(1, str.IndexOf("封") - 1);
if (SendDataToServer("DELE " + str) == true)
{
richTextBox1.Clear();
int j = listBoxOperation.SelectedIndex;
listBoxOperation.Items.Remove(listBoxOperation.Items[j].ToString());//5^1^a^s^p^x
MessageBox.Show("删除成功", "恭喜");
}
}
}
}