maxiaoyu521 发表于 2014-7-14 14:34:00

C# 接收邮件

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.IO;

namespace 接收邮件2__7_14
{
    public partial class Form1 : Form
    {
      public Form1()
      {
            InitializeComponent();
      }
      public TcpClient Server;
      public NetworkStream NetStrm;
      public StreamReader RdStrm;//使其以一种特定的编码从字节流中读取字符
      public string Data;
      public byte[] szData;//8位无符号整数
      public string CRLF = "\r\n";

      //Connect按钮的消息响应函数完成了到POP3服务器的连接工作,
      //并根据用户名和密码进行登录。
      //如果一切顺利,则再向服务器发送STAT命令从而获得邮箱中邮件的相关信息:邮件数量和大小,最终完成连接。




      private void button1_Click(object sender, EventArgs e)
      {
            if (PopServer.Text == "" || Username.Text == "" || Password.Text == "")
            {
                MessageBox.Show("请设置邮件服务器信息!", "信息提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
                return;
            }
            //先检查是否为空


            //将光标置为等待状态
            Cursor cr = Cursor.Current;
            Cursor.Current = Cursors.WaitCursor;//获取等待光标,通常为沙漏形状

            //用110端口新建POP3服务器连接
            TcpClient Server = new TcpClient(PopServer.Text, 110);
            Status.Items.Clear();
            if (Server != null)
            {
                try
                {
                  //初始化
                  NetStrm = Server.GetStream();
                  RdStrm = new StreamReader(Server.GetStream());
                  Status.Items.Add(RdStrm.ReadLine());

                  //登录服务器过程
                  Data = "USER: " + Username.Text + CRLF;
                  szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
                  //将制定字符数组中的所有字符编码为一个字节序列
                  NetStrm.Write(szData, 0, szData.Length);
                  Status.Items.Add(RdStrm.ReadLine());

                  Data = "PASS " + Password.Text + CRLF;
                  szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
                  NetStrm.Write(szData, 0, szData.Length);
                  Status.Items.Add(RdStrm.ReadLine());

                  //向服务器发送STAT命令,从而取得邮箱的相关信息:邮件数量和大小
                  Data = "STAT" + CRLF;
                  szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
                  NetStrm.Write(szData, 0, szData.Length);
                  Status.Items.Add(RdStrm.ReadLine());

                  //改变按钮的状态
                  button1.Enabled = false;//表示该控件是否可以对用户交互作出响应
                  button2.Enabled = true;
                  button3.Enabled = true;

                  //将光标置回原来的状态
                  Cursor.Current = cr;

                }

                catch (InvalidOperationException err)
                {
                  Status.Items.Add("Error: " + err.ToString());
                }
            }

      }
      
      //而Disconnect按钮的消息响应函数则通过向服务器发送QUIT命令来终止和邮件服务器的连接
      private void button2_Click(object sender, EventArgs e)
      {
            //将光标置为等待状态
            Cursor cr = Cursor.Current;
            Cursor.Current = Cursors.WaitCursor;

            //向服务器发送QUIT命令从而结束和POP3服务器的会话
            Data = "QUIT" + CRLF;
            szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
            NetStrm.Write(szData, 0, szData.Length);
            Status.Items.Add(RdStrm.ReadLine());

            //断开连接
            NetStrm.Close();
            RdStrm.Close();

            //改变按钮的状态
            button1.Enabled = true;
            button2.Enabled = false;
            button3.Enabled = false;

            //将光标置回原来的状态
            Cursor.Current = cr;
      }
      //Retrieve按钮的消息响应函数则根据用户在邮件编号文本框中的输入来取得相应的邮件,
      //它向服务器发送的命令为RETR,并根据返回的信息判断邮件的有无。
      //若返回信息的第一个字符为"+",则表示+OK,也即成功;若为"-",则表示-ERR,也即为失败。
      //在成功的情况下,若用户选择了"在邮件服务器上保留备份",
      //则收取邮件后不删除服务器上的备份,否则用DELE命令来进行相应的删除。
      private void button3_Click(object sender, EventArgs e)
      {
//将光标置为等待状态
Cursor cr = Cursor.Current;
Cursor.Current = Cursors.WaitCursor;
string szTemp;
richTextBox1.Clear();

try
{
//根据邮件编号从服务器获得相应邮件
Data = "RETR "+ MailNum.Text+CRLF;
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData,0,szData.Length);
szTemp = RdStrm.ReadLine();//从当前流中读取一行字符,并将数据作为字符串返回

if(szTemp!=0)
{
//不断地读取邮件内容,只到结束标志:英文句号
while(szTemp!=".")
{
richTextBox1.Text+= szTemp;//信息 框的表示
szTemp = RdStrm.ReadLine();
}

//若BackupChBox未选中,则收取邮件后,删除保留在服务器上的邮件
if(checkBox1.Checked == false)
{
Data = "DELE" + MailNum.Text + CRLF;
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData,0,szData.Length);
Status.Items.Add(RdStrm.ReadLine());
}
}
else
{
Status.Items.Add(szTemp);
}

//将光标置回原来的状态
Cursor.Current = cr;
}

catch(InvalidOperationException err)
{
Status.Items.Add("Error: "+err.ToString());
}
}

      


      

      

    }
}
接收邮件的代码,为什么运行不出正确结果?请各位大神帮忙指点一下急!急!

ibcadmin 发表于 2014-7-14 19:06:17

我刚发完发送邮件教程,你就发接收的问题了。。

ibcadmin 发表于 2014-7-14 19:06:31

报什么错

maxiaoyu521 发表于 2014-7-15 14:29:32

ibcadmin 发表于 2014-7-14 19:06
报什么错

1148223289

ibcadmin 发表于 2014-7-15 15:17:42

   //将制定字符数组中的所有字符编码为一个字节序列
                  NetStrm.Write(szData, 0, szData.Length);
                  Status.Items.Add(RdStrm.ReadLine());

没有读取到,试这在前面加个判断非空的方法

if(szData !="" ||szData !=null)
{
Status.Items.Add(RdStrm.ReadLine());
}

maxiaoyu521 发表于 2014-7-15 15:56:50

把收取邮箱信息 下面的                        if ( szData != null)                  {
                        //Status.Items.Add(RdStrm.ReadLine());
                  }
                  注释掉状态栏里会有信息,+Err 提示连接错误 ,但是信息栏里没有相关信息??


页: [1]
查看完整版本: C# 接收邮件