⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 formreceivemail.cs

📁 邮件收发的基本实现,可以作为邮件开发初学者的参考.
💻 CS
字号:
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 ReceiveMailExample
{
    public partial class FormReceiveMail : Form
    {
        private string pop3Server;
        private TcpClient tcpClient;
        private NetworkStream networkStream;
        private StreamReader sr;
        private StreamWriter sw;
        public FormReceiveMail()
        {
            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;
            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);
                //如果是-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());
                MessageBox.Show("删除成功", "恭喜");
            }
        }

        private void FormReceiveMail_Load(object sender, EventArgs e)
        {

        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -