总算花1天的时间把这个搞定了,贴出自己源代码和大家讨论一下,我菜鸟一个,有错误的地方请大家指正。这个程序开发主要是基于我论文的需要,所以功能肯定不详细,而且由于时间紧迫,只考虑邮件收发成功的情况,对于如果出现网络或者别的问题的情况,程序中没有相应的逻辑处理,我会在以后补上的,毕竟这不是我主要目的,废话少说,开始叙述:
这篇文章中主要参考POP3和SMTP的RFC文档,我比较笨,直到微软提供相应的邮件类,可没有采用,觉得自己写可能某些方面方便一些,不必受制于人,同时也参考了codeproject中一位印尼人写的程序,可惜他写的错误很多,我一一改正了,并且加上了自己的逻辑,哈,就算是自己的成果吧,有一些基本的代码我懒得自己敲,所以copy一下了。
收邮件是SendMail类来实现,发邮件是ReceiveMail类实现,下面的代码都经过我的测试,我自认为没有问题,在你的输入没问题的情况的。当然我没考虑多线程问题,这个不知道麻烦不,现在是没时间考虑了!好了,代码如下:

Code
1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4
using System.Windows.Forms;
5
using System.Collections;
6
using System.Net;
7
using System.Net.Sockets;
8
using System.IO;
9
namespace ConsoleApplication2
10

{
11
/**//// <summary>
12
/// Mail Receive
13
/// </summary>
14
public class ReceiveMail
15
{
16
// public Hashtable table1;
17
// private Hashtable table2;
18
// kai shi jiu diao yong
19
private string Statics(string usermail, string pass, string serverText)
20
{
21
// table1 = new Hashtable();
22
// table2 = new Hashtable();
23
TcpClient Pop3Serv = new TcpClient(serverText, 110);
24
string CRLF = "\r\n";
25
string Data;
26
byte[] szData;
27
NetworkStream NetStrm = Pop3Serv.GetStream();
28
StreamReader RdStrm = new StreamReader(NetStrm, Encoding.GetEncoding("GB2312"));
29
30
// change cursor into wait cursor
31
Cursor cr = Cursor.Current;
32
Cursor.Current = Cursors.WaitCursor;
33
string szTemp;
34
try
35
{
36
Data = "USER " + usermail + CRLF;
37
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
38
NetStrm.Write(szData, 0, szData.Length);
39
// Status.Items.Add(RdStrm.ReadLine());
40
Console.WriteLine(RdStrm.ReadLine());
41
Data = "PASS " + pass + CRLF;
42
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
43
NetStrm.Write(szData, 0, szData.Length);
44
// Status.Items.Add(RdStrm.ReadLine());
45
Console.WriteLine(RdStrm.ReadLine());
46
// Send STAT command to get information ie: number of mail and size
47
Data = "STAT" + CRLF;
48
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
49
NetStrm.Write(szData, 0, szData.Length);
50
// Status.Items.Add(RdStrm.ReadLine());
51
Console.WriteLine(RdStrm.ReadLine());
52
// retrieve mail with number mail parameter
53
Data = "UIDL" + CRLF;
54
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
55
NetStrm.Write(szData, 0, szData.Length);
56
// Console.WriteLine(RdStrm.ReadLine());
57
szTemp = RdStrm.ReadLine();
58
string temp1 = "";
59
if (szTemp[0] != '-')
60
{
61
// string usefulMessage = "";
62
while (szTemp != ".")
63
{
64
// byte[] temp = System.Text.Encoding.GetEncoding("GBK").GetBytes(szTemp.ToCharArray());
65
// szTemp = System.Text.Encoding.GetEncoding("GBK").GetString(temp);
66
// MessageBox.Show(szTemp);
67
68
// Message.Text += szTemp + CRLF;
69
if (!szTemp.StartsWith("+"))
70
{
71
string[] temp = szTemp.Split(new char[]
{ ' ' });
72
temp1 += temp[1] + ",";
73
szTemp = RdStrm.ReadLine();
74
}
75
else
76
{
77
szTemp = RdStrm.ReadLine();
78
}
79
80
}
81
temp1 = temp1.Remove(temp1.Length - 1);
82
Cursor.Current = cr;
83
return temp1;
84
}
85
else
86
{
87
// Status.Items.Add(szTemp);
88
Console.WriteLine("Wrong");
89
Cursor.Current = cr;
90
return String.Empty;
91
}
92
// Cursor.Current = cr;
93
// return string.Empty;
94
// back to normal cursor
95
// Cursor.Current = cr;
96
97
}
98
catch (InvalidOperationException err)
99
{
100
// Status.Items.Add("Error: " + err.ToString());
101
Console.WriteLine("Error: " + err.ToString());
102
return string.Empty;
103
}
104
}
105
// di yi ci chu li diao yong
106
public bool Create_New(string usermail, string pass, string serverText)
107
{
108
try
109
{
110
string stat = Statics(usermail, pass, serverText);
111
// xie wen jian xi tong
112
string val = usermail + ":" + stat;
113
if (!Directory.Exists("./usermail_info"))
114
{
115
DirectoryInfo info = Directory.CreateDirectory("./usermail_info");
116
StreamWriter writer = new StreamWriter(new FileStream("./usermail_info/" + usermail + ".txt", FileMode.Create));
117
writer.WriteLine(val);
118
writer.Flush();
119
writer.Close();
120
return true;
121
}
122
/**//*
123
* StreamWriter writer = new StreamWriter(new FileStream("./usermail_info/" + usermail + ".txt", FileMode.Create));
124
writer.WriteLine(val);
125
writer.Flush();
126
writer.Close();
127
return true;
128
*/
129
return false;
130
}
131
catch (Exception ex)
132
{
133
Console.WriteLine("Error:" + ex.Message);
134
return false;
135
}
136
// return false;}
137
}
138
// fu zhu
139
private bool IsEmailIn(string uidlid, string usermail)
140
{
141
// StreamReader reader;
142
try
143
{
144
StreamReader reader = new StreamReader(new FileStream("./usermail_info/" + usermail + ".txt", FileMode.Open));
145
string temp = "";
146
temp = reader.ReadLine();
147
string val = "";
148
while (temp != null)
149
{
150
val += temp;
151
temp = reader.ReadLine();
152
}
153
// MessageBox.Show(val);
154
int index = val.IndexOf(':');
155
string v = val.Substring(index + 1);
156
// MessageBox.Show(v);
157
string[] li = v.Split(',');
158
bool re = false;
159
/**//*for (int i = 0; i < li.Length; i++)
160
{
161
if (li[i].Equals(uidlid))
162
{
163
re = true; ;
164
}
165
}*/
166
foreach (string tt in li)
167
{
168
if (tt.Equals(uidlid))
169
{
170
re = true; ;
171
}
172
}
173
reader.Close();
174
return re;
175
}
176
catch (Exception ex)
177
{
178
MessageBox.Show(ex.Message);
179
// reader.Close();
180
return true;
181
}
182
// return false;
183
}
184
private void ReWriteNew(Hashtable table, string usermail)
185
{
186
try
187
{
188
if (table.Count == 0)
189
{
190
MessageBox.Show("no");
191
return;
192
}
193
else
194
{
195
StreamWriter writer = new StreamWriter(new FileStream("./usermail_info/" + usermail + ".txt", FileMode.Append));
196
foreach (string key in table.Values)
197
{
198
// StreamWriter writer = new StreamWriter(new FileStream("./usermail_info/" + usermail + ".txt", FileMode.Append));
199
writer.WriteLine("," + key);
200
}
201
// DirectoryInfo info = Directory.CreateDirectory("./usermail_info");
202
// StreamWriter writer = new StreamWriter(new FileStream("./usermail_info/" + usermail + ".txt", FileMode.Append));
203
// writer.WriteLine(old);
204
writer.Flush();
205
writer.Close();
206
}
207
}
208
catch (Exception ex)
209
{
210
MessageBox.Show(ex.Message);
211
}
212
}
213
214
// zhuang tai zhi mei you chu li
215
public string Receiver_Mail(string serverText,string usermail,string pass)
216
{
217
Hashtable table = new Hashtable();
218
TcpClient Pop3Serv = new TcpClient(serverText, 110);
219
string CRLF = "\r\n";
220
string Data;
221
byte[] szData;
222
NetworkStream NetStrm = Pop3Serv.GetStream();
223
StreamReader RdStrm = new StreamReader(NetStrm, Encoding.GetEncoding("GB2312"));
224
225
// change cursor into wait cursor
226
Cursor cr = Cursor.Current;
227
Cursor.Current = Cursors.WaitCursor;
228
string szTemp;
229
string usefulMessage = "";
230
try
231
{
232
Data = "USER " + usermail + CRLF;
233
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
234
NetStrm.Write(szData, 0, szData.Length);
235
// Status.Items.Add(RdStrm.ReadLine());
236
Console.WriteLine(RdStrm.ReadLine());
237
Data = "PASS " + pass + CRLF;
238
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
239
NetStrm.Write(szData, 0, szData.Length);
240
// Status.Items.Add(RdStrm.ReadLine());
241
Console.WriteLine(RdStrm.ReadLine());
242
// Send STAT command to get information ie: number of mail and size
243
Data = "STAT" + CRLF;
244
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
245
NetStrm.Write(szData, 0, szData.Length);
246
Console.WriteLine(RdStrm.ReadLine());
247
// Status.Items.Add(RdStrm.ReadLine());
248
Data = "UIDL" + CRLF;
249
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
250
NetStrm.Write(szData, 0, szData.Length);
251
252
szTemp = RdStrm.ReadLine();
253
// string temp1 = "";
254
if (szTemp[0] != '-')
255
{
256
// string usefulMessage = "";
257
while (szTemp != ".")
258
{
259
// byte[] temp = System.Text.Encoding.GetEncoding("GBK").GetBytes(szTemp.ToCharArray());
260
// szTemp = System.Text.Encoding.GetEncoding("GBK").GetString(temp);
261
// MessageBox.Show(szTemp);
262
263
// Message.Text += szTemp + CRLF;
264
if (!szTemp.StartsWith("+"))
265
{
266
string[] temp = szTemp.Split(new char[]
{ ' ' });
267
// temp1 += temp[1] + ",";
268
if (IsEmailIn(temp[1], usermail))
269
{
270
szTemp = RdStrm.ReadLine();
271
}
272
else
273
{
274
// HashSet<string> set = new HashSet<string>();
275
table.Add(temp[0], temp[1]);
276
szTemp = RdStrm.ReadLine();
277
}
278
// szTemp = RdStrm.ReadLine();
279
}
280
else
281
{
282
szTemp = RdStrm.ReadLine();
283
}
284
285
}
286
}
287
if (table.Count == 0)
288
{
289
Console.WriteLine("No New Mail");
290
return string.Empty;
291
}
292
else
293
{
294
foreach (string key in table.Keys)
295
{
296
int number = Convert.ToInt32(key);
297
Data = "RETR " + number + CRLF;
298
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
299
NetStrm.Write(szData, 0, szData.Length);
300
szTemp = RdStrm.ReadLine();
301
if (szTemp[0] != '-')
302
{
303
// string usefulMessage = "";
304
while (szTemp != ".")
305
{
306
if (szTemp.StartsWith("SUBJECT:"))
307
{
308
int index_1 = szTemp.IndexOf(":");
309
usefulMessage += "Mail_Subject:" + szTemp.Substring(index_1 + 1) + ";";
310
}
311
if (szTemp.StartsWith("BODY:"))
312
{
313
int index = szTemp.IndexOf(":");
314
usefulMessage += "Mail_Body:" + szTemp.Substring(index + 1);
315
// string usefulMessage =
316
szTemp = RdStrm.ReadLine();
317
while (szTemp != ".")
318
{
319
usefulMessage += szTemp;
320
szTemp = RdStrm.ReadLine();
321
}
322
usefulMessage += "|";
323
}
324
else
325
{
326
szTemp = RdStrm.ReadLine();
327
}
328
}
329
}
330
else
331
{
332
Console.WriteLine("Wrong");
333
return String.Empty;
334
}
335
}
336
}
337
ReWriteNew(table,usermail);
338
Cursor.Current = cr;
339
return usefulMessage;
340
}
341
catch (InvalidOperationException err)
342
{
343
// Status.Items.Add("Error: " + err.ToString());
344
Console.WriteLine("Error: " + err.ToString());
345
return string.Empty;
346
}
347
}
348
}
349
}
350
待续。。。