http://www.cnblogs.com/Terrylee/archive/2005/11/30/287933.html
一. 用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
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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类的实现如下:2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
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
}
2
3
4
5
6
7
8
9
10
11
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
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
浙公网安备 33010602011771号