发送邮件篇
一. 用Asp.net实现邮件系统
1
/// <summary>
2
/// 功能:实现在Web页面中发送Email
3
/// </summary>
4
private void SendMail()
5
{
6
MailMessage m = new MailMessage();
7
8
///发件人地址
9
m.From = tbFrom.Text;
10
11
///收件人地址
12
m.To = tbTo.Text;
13
14
///邮件主题
15
m.Subject = tbSubject.Text;
16
17
///邮件内容
18
m.Body = tbBody.Text;
19
20
///优先级
21
switch(ddlp.SelectedIndex)
22
{
23
case 0:
24
m.Priority = MailPriority.High;
25
break;
26
case 1:
27
m.Priority = MailPriority.Low;
28
break;
29
default:
30
m.Priority = MailPriority.Normal;
31
break;
32
}
33
34
///设置邮件格式
35
if(ddlp.SelectedIndex==0)
36
m.BodyFormat = MailFormat.Text;
37
else
38
m.BodyFormat = MailFormat.Html;
39
40
///设置服务器
41
if(tbServer.Text!="")
42
{
43
SmtpMail.SmtpServer = tbServer.Text;
44
}
45
46
///以下处理附件
47
string strFileName = FileSelect.PostedFile.FileName;
48
if(strFileName!="")
49
m.Attachments.Add(new MailAttachment(strFileName));
50
51
///发送邮件
52
SmtpMail.Send(m);
53
}
/// <summary>2
/// 功能:实现在Web页面中发送Email3
/// </summary>4
private void SendMail()5
{6
MailMessage m = new MailMessage();7
8
///发件人地址9
m.From = tbFrom.Text;10

11
///收件人地址12
m.To = tbTo.Text;13

14
///邮件主题15
m.Subject = tbSubject.Text;16

17
///邮件内容18
m.Body = tbBody.Text;19

20
///优先级21
switch(ddlp.SelectedIndex)22
{23
case 0:24
m.Priority = MailPriority.High;25
break;26
case 1:27
m.Priority = MailPriority.Low;28
break;29
default:30
m.Priority = MailPriority.Normal;31
break;32
}33

34
///设置邮件格式35
if(ddlp.SelectedIndex==0)36
m.BodyFormat = MailFormat.Text;37
else38
m.BodyFormat = MailFormat.Html;39

40
///设置服务器41
if(tbServer.Text!="")42
{43
SmtpMail.SmtpServer = tbServer.Text;44
}45

46
///以下处理附件 47
string strFileName = FileSelect.PostedFile.FileName;48
if(strFileName!="")49
m.Attachments.Add(new MailAttachment(strFileName));50

51
///发送邮件52
SmtpMail.Send(m);53
}二. 利用Socket来接收邮件
1
/// <summary>
2
/// 接收邮件
3
/// </summary>
4
private void SocketPopMail()
5
{
6
POP3 pop = new POP3(tbServer.Text,tbUser.Text,tbPass.Text);
7
int n = pop.GetNumberOfNewMessages();
8
if(n==-1)
9
{
10
Response.Write("<script language='javascript'>alert('服务器连接错误!')</script>");
11
return;
12
}
13
ddlNew.Items.Clear();
14
for(int i=1;i<=n;i++)
15
ddlNew.Items.Add("第"+i.ToString()+"封邮件");
16
if(n>0)
17
{
18
MailMessage msg = pop.GetNewMessages(0);
19
if(msg!=null)
20
tbBody.Text = msg.Body;
21
}
22
}
POP3类的实现如下:
/// <summary>2
/// 接收邮件3
/// </summary>4
private void SocketPopMail()5
{6
POP3 pop = new POP3(tbServer.Text,tbUser.Text,tbPass.Text);7
int n = pop.GetNumberOfNewMessages();8
if(n==-1)9
{10
Response.Write("<script language='javascript'>alert('服务器连接错误!')</script>");11
return;12
}13
ddlNew.Items.Clear();14
for(int i=1;i<=n;i++)15
ddlNew.Items.Add("第"+i.ToString()+"封邮件");16
if(n>0)17
{18
MailMessage msg = pop.GetNewMessages(0);19
if(msg!=null)20
tbBody.Text = msg.Body;21
}22
} 1
/// <summary>
2
/// 接收邮件类
3
/// </summary>
4
public class POP3
5
{
6
string POPServer;
7
string user;
8
string pwd;
9
NetworkStream ns;
10
StreamReader sr;
11
12
public POP3(){}
13
14
public POP3(string server, string _user, string _pwd)
15
{
16
POPServer = server;
17
user = _user;
18
pwd = _pwd;
19
}
20
21
/// <summary>
22
/// 连接服务器
23
/// </summary>
24
/// <returns></returns>
25
private bool Connect()
26
{
27
TcpClient sender = new TcpClient(POPServer,110);
28
byte[] outbytes;
29
string input;
30
31
try
32
{
33
ns = sender.GetStream();
34
sr = new StreamReader(ns);
35
36
sr.ReadLine();
37
input = "user " + user + "\r\n";
38
outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray());
39
ns.Write(outbytes,0,outbytes.Length) ;
40
sr.ReadLine();
41
42
input = "pass " + pwd + "\r\n";
43
outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray());
44
ns.Write(outbytes,0,outbytes.Length) ;
45
sr.ReadLine();
46
return true;
47
48
}
49
catch
50
{
51
return false;
52
}
53
}
54
55
/// <summary>
56
/// 断开与服务器的连接
57
/// </summary>
58
private void Disconnect()
59
{
60
string input = "quit" + "\r\n";
61
Byte[] outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray());
62
ns.Write(outbytes,0,outbytes.Length);
63
ns.Close();
64
}
65
66
public int GetNumberOfNewMessages()
67
{
68
byte[] outbytes;
69
string input;
70
71
try
72
{
73
Connect();
74
75
input = "stat" + "\r\n";
76
outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray());
77
ns.Write(outbytes,0,outbytes.Length);
78
string resp = sr.ReadLine();
79
string[] tokens = resp.Split(new Char[] {' '});
80
81
Disconnect();
82
83
return Convert.ToInt32(tokens[1]);
84
}
85
catch
86
{
87
return -1;
88
}
89
}
90
public ArrayList GetNewMessages(string subj)
91
{
92
93
int newcount;
94
ArrayList newmsgs = new ArrayList();
95
96
try
97
{
98
newcount = GetNumberOfNewMessages();
99
Connect();
100
101
for(int n=1; n<newcount+1; n++)
102
{
103
ArrayList msglines = GetRawMessage(n);
104
string msgsubj = GetMessageSubject(msglines);
105
if(msgsubj.CompareTo(subj) == 0)
106
{
107
System.Web.Mail.MailMessage msg = new MailMessage();
108
msg.Subject = msgsubj;
109
msg.From = GetMessageFrom(msglines);
110
msg.Body = GetMessageBody(msglines);
111
newmsgs.Add(msg);
112
DeleteMessage(n);
113
}
114
}
115
116
Disconnect();
117
return newmsgs;
118
}
119
catch(Exception e)
120
{
121
return newmsgs;
122
}
123
}
124
125
/// <summary>
126
/// 获取新邮件
127
/// </summary>
128
/// <param name="nIndex"></param>
129
/// <returns></returns>
130
public MailMessage GetNewMessages(int nIndex)
131
{
132
int newcount;
133
System.Web.Mail.MailMessage msg = new MailMessage();
134
135
try
136
{
137
newcount = GetNumberOfNewMessages();
138
Connect();
139
int n = nIndex+1;
140
141
if(n<newcount+1)
142
{
143
ArrayList msglines = GetRawMessage(n);
144
string msgsubj = GetMessageSubject(msglines);
145
146
147
msg.Subject = msgsubj;
148
msg.From = GetMessageFrom(msglines);
149
msg.Body = GetMessageBody(msglines);
150
}
151
152
Disconnect();
153
return msg;
154
}
155
catch
156
{
157
return null;
158
}
159
}
160
private ArrayList GetRawMessage (int messagenumber)
161
{
162
Byte[] outbytes;
163
string input;
164
string line = "";
165
166
input = "retr " + messagenumber.ToString() + "\r\n";
167
outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray());
168
ns.Write(outbytes,0,outbytes.Length);
169
170
ArrayList msglines = new ArrayList();
171
do
172
{
173
line = sr.ReadLine();
174
msglines.Add(line);
175
} while (line != ".");
176
msglines.RemoveAt(msglines.Count-1);
177
178
return msglines;
179
}
180
181
/// <summary>
182
/// 获取邮件主题
183
/// </summary>
184
/// <param name="msglines"></param>
185
/// <returns></returns>
186
private string GetMessageSubject(ArrayList msglines)
187
{
188
string[] tokens;
189
IEnumerator msgenum = msglines.GetEnumerator();
190
while (msgenum.MoveNext() )
191
{
192
string line = (string)msgenum.Current;
193
if(line.StartsWith("Subject:") )
194
{
195
tokens = line.Split(new Char[] {' '});
196
return tokens[1].Trim();
197
}
198
}
199
return "None";
200
}
201
202
/// <summary>
203
/// 获取邮件源地址
204
/// </summary>
205
/// <param name="msglines"></param>
206
/// <returns></returns>
207
private string GetMessageFrom (ArrayList msglines)
208
{
209
string[] tokens;
210
IEnumerator msgenum = msglines.GetEnumerator();
211
while (msgenum.MoveNext() )
212
{
213
string line = (string)msgenum.Current;
214
if(line.StartsWith("From:") )
215
{
216
tokens = line.Split(new Char[] {'<'});
217
return tokens[1].Trim(new Char[] {'<','>'});
218
}
219
}
220
return "None";
221
}
222
223
/// <summary>
224
/// 获取邮件内容
225
/// </summary>
226
/// <param name="msglines"></param>
227
/// <returns></returns>
228
private string GetMessageBody(ArrayList msglines)
229
{
230
string body = "";
231
string line = " ";
232
IEnumerator msgenum = msglines.GetEnumerator();
233
234
while(line.CompareTo("") != 0)
235
{
236
msgenum.MoveNext();
237
line = (string)msgenum.Current;
238
}
239
240
while (msgenum.MoveNext() )
241
{
242
body = body + (string)msgenum.Current + "\r\n";
243
}
244
return body;
245
}
246
247
/// <summary>
248
/// 删除邮件
249
/// </summary>
250
/// <param name="messagenumber"></param>
251
private void DeleteMessage(int messagenumber)
252
{
253
Byte[] outbytes;
254
string input;
255
256
try
257
{
258
input = "dele " + messagenumber.ToString() + "\r\n";
259
outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray());
260
ns.Write(outbytes,0,outbytes.Length);
261
}
262
catch(Exception e)
263
{
264
return;
265
}
266
267
}
268
269
}
/// <summary>2
/// 接收邮件类3
/// </summary>4
public class POP35
{6
string POPServer;7
string user;8
string pwd;9
NetworkStream ns;10
StreamReader sr;11

12
public POP3(){}13

14
public POP3(string server, string _user, string _pwd)15
{16
POPServer = server;17
user = _user;18
pwd = _pwd;19
}20
21
/// <summary>22
/// 连接服务器23
/// </summary>24
/// <returns></returns>25
private bool Connect()26
{27
TcpClient sender = new TcpClient(POPServer,110);28
byte[] outbytes;29
string input;30

31
try32
{33
ns = sender.GetStream();34
sr = new StreamReader(ns);35

36
sr.ReadLine();37
input = "user " + user + "\r\n";38
outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray());39
ns.Write(outbytes,0,outbytes.Length) ;40
sr.ReadLine();41
42
input = "pass " + pwd + "\r\n";43
outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray());44
ns.Write(outbytes,0,outbytes.Length) ;45
sr.ReadLine();46
return true; 47
48
}49
catch50
{51
return false;52
}53
}54
55
/// <summary>56
/// 断开与服务器的连接57
/// </summary>58
private void Disconnect()59
{60
string input = "quit" + "\r\n";61
Byte[] outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray());62
ns.Write(outbytes,0,outbytes.Length);63
ns.Close();64
}65

66
public int GetNumberOfNewMessages()67
{68
byte[] outbytes;69
string input;70

71
try72
{73
Connect();74

75
input = "stat" + "\r\n";76
outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray());77
ns.Write(outbytes,0,outbytes.Length);78
string resp = sr.ReadLine();79
string[] tokens = resp.Split(new Char[] {' '});80

81
Disconnect();82

83
return Convert.ToInt32(tokens[1]);84
}85
catch86
{87
return -1;88
}89
}90
public ArrayList GetNewMessages(string subj)91
{92

93
int newcount;94
ArrayList newmsgs = new ArrayList();95

96
try97
{98
newcount = GetNumberOfNewMessages();99
Connect();100

101
for(int n=1; n<newcount+1; n++)102
{103
ArrayList msglines = GetRawMessage(n);104
string msgsubj = GetMessageSubject(msglines);105
if(msgsubj.CompareTo(subj) == 0)106
{107
System.Web.Mail.MailMessage msg = new MailMessage();108
msg.Subject = msgsubj;109
msg.From = GetMessageFrom(msglines);110
msg.Body = GetMessageBody(msglines);111
newmsgs.Add(msg);112
DeleteMessage(n);113
}114
}115

116
Disconnect();117
return newmsgs;118
}119
catch(Exception e)120
{121
return newmsgs;122
}123
}124

125
/// <summary>126
/// 获取新邮件127
/// </summary>128
/// <param name="nIndex"></param>129
/// <returns></returns>130
public MailMessage GetNewMessages(int nIndex)131
{132
int newcount;133
System.Web.Mail.MailMessage msg = new MailMessage();134

135
try136
{137
newcount = GetNumberOfNewMessages();138
Connect();139
int n = nIndex+1;140

141
if(n<newcount+1)142
{143
ArrayList msglines = GetRawMessage(n);144
string msgsubj = GetMessageSubject(msglines);145
146
147
msg.Subject = msgsubj;148
msg.From = GetMessageFrom(msglines);149
msg.Body = GetMessageBody(msglines);150
}151

152
Disconnect();153
return msg;154
}155
catch156
{157
return null;158
}159
}160
private ArrayList GetRawMessage (int messagenumber)161
{162
Byte[] outbytes;163
string input;164
string line = "";165

166
input = "retr " + messagenumber.ToString() + "\r\n";167
outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray());168
ns.Write(outbytes,0,outbytes.Length);169

170
ArrayList msglines = new ArrayList();171
do172
{173
line = sr.ReadLine();174
msglines.Add(line);175
} while (line != ".");176
msglines.RemoveAt(msglines.Count-1);177

178
return msglines;179
}180

181
/// <summary>182
/// 获取邮件主题183
/// </summary>184
/// <param name="msglines"></param>185
/// <returns></returns>186
private string GetMessageSubject(ArrayList msglines)187
{188
string[] tokens;189
IEnumerator msgenum = msglines.GetEnumerator();190
while (msgenum.MoveNext() )191
{192
string line = (string)msgenum.Current;193
if(line.StartsWith("Subject:") )194
{195
tokens = line.Split(new Char[] {' '});196
return tokens[1].Trim();197
}198
}199
return "None";200
}201

202
/// <summary>203
/// 获取邮件源地址204
/// </summary>205
/// <param name="msglines"></param>206
/// <returns></returns>207
private string GetMessageFrom (ArrayList msglines)208
{209
string[] tokens;210
IEnumerator msgenum = msglines.GetEnumerator();211
while (msgenum.MoveNext() )212
{213
string line = (string)msgenum.Current;214
if(line.StartsWith("From:") )215
{216
tokens = line.Split(new Char[] {'<'});217
return tokens[1].Trim(new Char[] {'<','>'});218
}219
}220
return "None";221
}222

223
/// <summary>224
/// 获取邮件内容225
/// </summary>226
/// <param name="msglines"></param>227
/// <returns></returns>228
private string GetMessageBody(ArrayList msglines)229
{230
string body = "";231
string line = " ";232
IEnumerator msgenum = msglines.GetEnumerator();233

234
while(line.CompareTo("") != 0)235
{236
msgenum.MoveNext();237
line = (string)msgenum.Current;238
}239

240
while (msgenum.MoveNext() )241
{242
body = body + (string)msgenum.Current + "\r\n";243
}244
return body;245
}246

247
/// <summary>248
/// 删除邮件249
/// </summary>250
/// <param name="messagenumber"></param>251
private void DeleteMessage(int messagenumber)252
{253
Byte[] outbytes;254
string input;255

256
try257
{258
input = "dele " + messagenumber.ToString() + "\r\n";259
outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray());260
ns.Write(outbytes,0,outbytes.Length);261
}262
catch(Exception e)263
{264
return;265
}266

267
}268

269
}三. 利用Socket来发送邮件
1
/// <summary>
2
/// 功能:利用Socket来发送邮件
3
/// </summary>
4
private void SocketSendMail()
5
{
6
SMTP smtp = new SMTP();
7
bool bSuccess = smtp.Send(tbSmtp.Text,25,tbSend.Text,tbReceive.Text,tbSubject.Text,tbBody.Text);
8
if(bSuccess)
9
Response.Write("<script language='javascript'>alert('邮件发送成功!')</script>");
10
else
11
Response.Write("<script language='javascript'>alert('邮件发送失败!')</script>");
12
}
/// <summary>2
/// 功能:利用Socket来发送邮件3
/// </summary>4
private void SocketSendMail()5
{6
SMTP smtp = new SMTP();7
bool bSuccess = smtp.Send(tbSmtp.Text,25,tbSend.Text,tbReceive.Text,tbSubject.Text,tbBody.Text);8
if(bSuccess)9
Response.Write("<script language='javascript'>alert('邮件发送成功!')</script>");10
else11
Response.Write("<script language='javascript'>alert('邮件发送失败!')</script>");12
}SMTP类的实现如下:
1
/// <summary>
2
/// 发送邮件类
3
/// </summary>
4
public class SMTP
5
{
6
public SMTP(){}
7
8
public bool Send(string strSmtpServer,int nPort,string strSend,string strReceive
9
,string strSubject,string strContent)
10
{
11
/// smtp服务器的IP地址
12
string smtpserver=strSmtpServer;
13
TcpClient tcpc = new TcpClient();
14
try
15
{
16
tcpc.Connect(smtpserver, nPort);
17
StreamReader sr ;
18
string strCmd;
19
sr = new StreamReader(tcpc.GetStream(),Encoding.Default);
20
21
///服务器连接成功以后,首先向服务器发送HeLlo命令
22
strCmd="HELO shaozhd";
23
SenSmtpCmd(tcpc,strCmd);
24
25
///然后向服务器发送信件的成员的信箱
26
strCmd="mail from:"+ strSend;
27
SenSmtpCmd(tcpc,strCmd);
28
29
///向服务器发送收件人的信箱
30
strCmd="rcpt to:" + strReceive;
31
SenSmtpCmd(tcpc,strCmd);
32
33
///所有的准备工作都已经作好了,下面开始进行邮件的部分
34
strCmd="data";
35
SenSmtpCmd(tcpc,strCmd);
36
37
///邮件内容
38
strCmd="Date: 1234567\r\n";
39
strCmd=strCmd+"From: " + strSend +"\r\n";
40
strCmd=strCmd+"To: " + strReceive +"\r\n";
41
strCmd=strCmd+"Subject: " + strSubject +"\r\n\r\n";
42
strCmd=strCmd + strContent +"\r\n\r\n";
43
SenSmtpCmd(tcpc,strCmd);
44
strCmd="\r\n.\r\n";
45
SenSmtpCmd(tcpc,strCmd);
46
47
///最后 关闭与smtp 服务器的连接
48
tcpc.Close();
49
return true;
50
}
51
catch
52
{
53
return false;
54
}
55
}
56
57
/// <summary>
58
/// 发送SMTP命令
59
/// </summary>
60
/// <param name="tcpc"></param>
61
/// <param name="strCmd"></param>
62
void SenSmtpCmd(TcpClient tcpc,String strCmd)
63
{
64
65
byte[] arrCmd;
66
string strRet;
67
StreamReader sr;
68
Stream s;
69
s=tcpc.GetStream();
70
strCmd = strCmd + "\r\n";
71
arrCmd= Encoding.Default.GetBytes(strCmd.ToCharArray());
72
s=tcpc.GetStream();
73
s.Write(arrCmd, 0, strCmd.Length);
74
75
///以下用于程序调试,显示服务器回应信息
76
sr = new StreamReader(tcpc.GetStream(), Encoding.Default);
77
strRet=sr.ReadLine();
78
return;
79
}
80
}
/// <summary>2
/// 发送邮件类3
/// </summary>4
public class SMTP5
{6
public SMTP(){}7

8
public bool Send(string strSmtpServer,int nPort,string strSend,string strReceive9
,string strSubject,string strContent)10
{11
/// smtp服务器的IP地址 12
string smtpserver=strSmtpServer;13
TcpClient tcpc = new TcpClient();14
try15
{16
tcpc.Connect(smtpserver, nPort);17
StreamReader sr ;18
string strCmd;19
sr = new StreamReader(tcpc.GetStream(),Encoding.Default);20

21
///服务器连接成功以后,首先向服务器发送HeLlo命令22
strCmd="HELO shaozhd";23
SenSmtpCmd(tcpc,strCmd);24

25
///然后向服务器发送信件的成员的信箱26
strCmd="mail from:"+ strSend;27
SenSmtpCmd(tcpc,strCmd);28

29
///向服务器发送收件人的信箱30
strCmd="rcpt to:" + strReceive;31
SenSmtpCmd(tcpc,strCmd);32

33
///所有的准备工作都已经作好了,下面开始进行邮件的部分34
strCmd="data";35
SenSmtpCmd(tcpc,strCmd);36

37
///邮件内容38
strCmd="Date: 1234567\r\n";39
strCmd=strCmd+"From: " + strSend +"\r\n";40
strCmd=strCmd+"To: " + strReceive +"\r\n";41
strCmd=strCmd+"Subject: " + strSubject +"\r\n\r\n";42
strCmd=strCmd + strContent +"\r\n\r\n";43
SenSmtpCmd(tcpc,strCmd);44
strCmd="\r\n.\r\n";45
SenSmtpCmd(tcpc,strCmd);46

47
///最后 关闭与smtp 服务器的连接48
tcpc.Close();49
return true;50
}51
catch52
{53
return false;54
}55
}56

57
/// <summary>58
/// 发送SMTP命令59
/// </summary>60
/// <param name="tcpc"></param>61
/// <param name="strCmd"></param>62
void SenSmtpCmd(TcpClient tcpc,String strCmd)63
{64

65
byte[] arrCmd;66
string strRet;67
StreamReader sr;68
Stream s;69
s=tcpc.GetStream();70
strCmd = strCmd + "\r\n";71
arrCmd= Encoding.Default.GetBytes(strCmd.ToCharArray()); 72
s=tcpc.GetStream();73
s.Write(arrCmd, 0, strCmd.Length);74

75
///以下用于程序调试,显示服务器回应信息76
sr = new StreamReader(tcpc.GetStream(), Encoding.Default);77
strRet=sr.ReadLine();78
return;79
}80
}



浙公网安备 33010602011771号