您的位置:首页 > 编程语言 > C#

用C#从POP3服务器取得邮件

2006-09-11 13:54 295 查看
it's easy to implement an application if we know the algorithm to retrieve mail from a POP server. In this article, I use the
TcpClient
and
NetworkStream
classes. Firstly, declare public variables:

public TcpClient Server;
public NetworkStream NetStrm;
public StreamReader  RdStrm;
public string Data;
public byte[] szData;
public string CRLF = "/r/n";

here's the code for when the Connect Button is clicked:

private void ConnectBtn_Click(object sender, System.EventArgs e)
{
// change cursor into wait cursor
Cursor cr = Cursor.Current;
Cursor.Current = Cursors.WaitCursor;
// create server POP3 with port 110
Server = new TcpClient(POPServ.Text,110);
Status.Items.Clear();
try
{
// initialization
NetStrm = Server.GetStream();
RdStrm= new StreamReader(Server.GetStream());
Status.Items.Add(RdStrm.ReadLine());
// Login Process
Data = "USER "+ User.Text+CRLF;
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData,0,szData.Length);
Status.Items.Add(RdStrm.ReadLine());
Data = "PASS "+ Passw.Text+CRLF;
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData,0,szData.Length);
Status.Items.Add(RdStrm.ReadLine());
// Send STAT command to get information ie: number of mail and size
Data = "STAT"+CRLF;
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData,0,szData.Length);
Status.Items.Add(RdStrm.ReadLine());
// change enabled - disabled button
ConnectBtn.Enabled = false;
DisconnectBtn.Enabled = true;
RetrieveBtn.Enabled = true;
// back to normal cursor
Cursor.Current = cr;
}
catch(InvalidOperationException err)
{
Status.Items.Add("Error: "+err.ToString());
}
}

here's the code for when the Disconnect Button is clicked:

private void DisconnectBtn_Click(object sender, System.EventArgs e)
{
// change cursor into wait cursor
Cursor cr = Cursor.Current;
Cursor.Current = Cursors.WaitCursor;
// Send QUIT command to close session from POP server
Data = "QUIT"+CRLF;
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData,0,szData.Length);
Status.Items.Add(RdStrm.ReadLine());
//close connection
NetStrm.Close();
RdStrm.Close();
// change enabled - disabled button
ConnectBtn.Enabled = true;
DisconnectBtn.Enabled = false;
RetrieveBtn.Enabled = false;
// back to normal cursor
Cursor.Current = cr;
}

here's code when Retrieve Button clicked:

private void RetrieveBtn_Click(object sender, System.EventArgs e)
{
// change cursor into wait cursor
Cursor cr = Cursor.Current;
Cursor.Current = Cursors.WaitCursor;
string szTemp;
Message.Clear();
try
{
// retrieve mail with number mail parameter
Data = "RETR "+ Number.Text+CRLF;
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData,0,szData.Length);
szTemp = RdStrm.ReadLine();
if(szTemp[0]!='-')
{

while(szTemp!=".")
{
Message.Text += szTemp;
szTemp = RdStrm.ReadLine();
}
}
else
{
Status.Items.Add(szTemp);
}

// back to normal cursor
Cursor.Current = cr;
}
catch(InvalidOperationException err)
{
Status.Items.Add("Error: "+err.ToString());
}
}

Testing

build and run this project. Set the POP server, user and password. After that you'll get a response message from the POP server (you can see on status box) ie: +OK 2 624 if success or -ERR if fail. The words "+OK 2 624" mean you have two emails and total size 624.

now, you can set the mail message number and then click Retrieve button. Then you'll get the mail according to the mail number that you wrote on Mail Number Box.

Reference

MSDN for .NET framework

RFC 1725

History

20 Jan 2002 - fixed non-critical GUI problem

About Agus Kurniawan

He gradueted from Sepuluh Nopember Institute of Technology (ITS) in Department of Electrical Engineering, Indonesia. His programming interest is VC++, C#, VB, VB.NET, .NET, VBScript, Delphi, C++ Builder, Assembly, ASP/ASP.NET, and JSP. He's consultant and architect for DMC Server (www.dmcserver.com). He's currently based in Jakarta, Indonesia.
Click here to view Agus Kurniawan's online profile.
[align=right]Add by : Huobazi (2006-3-05:12:46) [/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: