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


{11

/**//// <summary>12
/// Mail Receive13
/// </summary>14
public class ReceiveMail15

{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 cursor31
Cursor cr = Cursor.Current;32
Cursor.Current = Cursors.WaitCursor;33
string szTemp;34
try35

{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 size47
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 parameter53
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
else76

{77
szTemp = RdStrm.ReadLine();78
}79

80
}81
temp1 = temp1.Remove(temp1.Length - 1);82
Cursor.Current = cr;83
return temp1;84
}85
else86

{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 cursor95
// 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
try109

{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
try143

{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
try187

{188
if (table.Count == 0)189

{190
MessageBox.Show("no");191
return;192
}193
else194

{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 li215
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 cursor226
Cursor cr = Cursor.Current;227
Cursor.Current = Cursors.WaitCursor;228
string szTemp;229
string usefulMessage = "";230
try231

{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 size243
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
else273

{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
else281

{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
else293

{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
else325

{326
szTemp = RdStrm.ReadLine();327
}328
}329
}330
else331

{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

待续。。。

浙公网安备 33010602011771号