自己毕业论文中设计的邮件发送和接收程序(1)

本文介绍了一个基于POP3协议的手动实现收邮件功能的C#程序。该程序通过TCP连接到邮件服务器,发送POP3命令来获取邮件信息。文章还涉及到了文件系统的操作,用于记录已读取的邮件ID。

总算花1天的时间把这个搞定了,贴出自己源代码和大家讨论一下,我菜鸟一个,有错误的地方请大家指正。这个程序开发主要是基于我论文的需要,所以功能肯定不详细,而且由于时间紧迫,只考虑邮件收发成功的情况,对于如果出现网络或者别的问题的情况,程序中没有相应的逻辑处理,我会在以后补上的,毕竟这不是我主要目的,废话少说,开始叙述:

这篇文章中主要参考POP3和SMTP的RFC文档,我比较笨,直到微软提供相应的邮件类,可没有采用,觉得自己写可能某些方面方便一些,不必受制于人,同时也参考了codeproject中一位印尼人写的程序,可惜他写的错误很多,我一一改正了,并且加上了自己的逻辑,哈,就算是自己的成果吧,有一些基本的代码我懒得自己敲,所以copy一下了。

收邮件是SendMail类来实现,发邮件是ReceiveMail类实现,下面的代码都经过我的测试,我自认为没有问题,在你的输入没问题的情况的。当然我没考虑多线程问题,这个不知道麻烦不,现在是没时间考虑了!好了,代码如下:

 

ContractedBlock.gifExpandedBlockStart.gifCode
  1using System;
  2using System.Collections.Generic;
  3using System.Text;
  4using System.Windows.Forms;
  5using System.Collections;
  6using System.Net;
  7using System.Net.Sockets;
  8using System.IO;
  9namespace ConsoleApplication2
 10ExpandedBlockStart.gifContractedBlock.gif{
 11ExpandedSubBlockStart.gifContractedSubBlock.gif    /**//// <summary>
 12    /// Mail Receive
 13    /// </summary>

 14    public class ReceiveMail
 15ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 16        // public Hashtable table1;
 17        // private Hashtable table2;
 18        // kai shi jiu diao yong 
 19        private string Statics(string usermail, string pass, string serverText)
 20ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 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
 35ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 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!= '-')
 60ExpandedSubBlockStart.gifContractedSubBlock.gif                {
 61                    // string usefulMessage = "";
 62                    while (szTemp != ".")
 63ExpandedSubBlockStart.gifContractedSubBlock.gif                    {
 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("+"))
 70ExpandedSubBlockStart.gifContractedSubBlock.gif                        {
 71ExpandedSubBlockStart.gifContractedSubBlock.gif                            string[] temp = szTemp.Split(new char[] ' ' });
 72                            temp1 += temp[1+ ",";
 73                            szTemp = RdStrm.ReadLine();
 74                        }

 75                        else
 76ExpandedSubBlockStart.gifContractedSubBlock.gif                        {
 77                            szTemp = RdStrm.ReadLine();
 78                        }

 79
 80                    }

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

 85                else
 86ExpandedSubBlockStart.gifContractedSubBlock.gif                {
 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)
 99ExpandedSubBlockStart.gifContractedSubBlock.gif            {
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)
107ExpandedSubBlockStart.gifContractedSubBlock.gif        {
108            try
109ExpandedSubBlockStart.gifContractedSubBlock.gif            {
110                string stat = Statics(usermail, pass, serverText);
111                // xie wen jian xi tong 
112                string val = usermail + ":" + stat;
113                if (!Directory.Exists("./usermail_info"))
114ExpandedSubBlockStart.gifContractedSubBlock.gif                {
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                }

122ExpandedSubBlockStart.gifContractedSubBlock.gif                /**//*
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)
132ExpandedSubBlockStart.gifContractedSubBlock.gif            {
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)
140ExpandedSubBlockStart.gifContractedSubBlock.gif        {
141            // StreamReader reader;
142            try
143ExpandedSubBlockStart.gifContractedSubBlock.gif            {
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)
149ExpandedSubBlockStart.gifContractedSubBlock.gif                {
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;
159ExpandedSubBlockStart.gifContractedSubBlock.gif                /**//*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)
167ExpandedSubBlockStart.gifContractedSubBlock.gif                {
168                    if (tt.Equals(uidlid))
169ExpandedSubBlockStart.gifContractedSubBlock.gif                    {
170                        re = true; ;
171                    }

172                }

173                reader.Close();
174                return re;
175            }

176            catch (Exception ex)
177ExpandedSubBlockStart.gifContractedSubBlock.gif            {
178                MessageBox.Show(ex.Message);
179                // reader.Close();
180                return true;
181            }

182            // return false;
183        }

184        private void ReWriteNew(Hashtable table, string usermail)
185ExpandedSubBlockStart.gifContractedSubBlock.gif        {
186            try
187ExpandedSubBlockStart.gifContractedSubBlock.gif            {
188                if (table.Count == 0)
189ExpandedSubBlockStart.gifContractedSubBlock.gif                {
190                    MessageBox.Show("no");
191                    return;
192                }

193                else
194ExpandedSubBlockStart.gifContractedSubBlock.gif                {
195                    StreamWriter writer = new StreamWriter(new FileStream("./usermail_info/" + usermail + ".txt", FileMode.Append));
196                    foreach (string key in table.Values)
197ExpandedSubBlockStart.gifContractedSubBlock.gif                    {
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)
209ExpandedSubBlockStart.gifContractedSubBlock.gif            {
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)
216ExpandedSubBlockStart.gifContractedSubBlock.gif        {
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
231ExpandedSubBlockStart.gifContractedSubBlock.gif            {
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!= '-')
255ExpandedSubBlockStart.gifContractedSubBlock.gif                {
256                    // string usefulMessage = "";
257                    while (szTemp != ".")
258ExpandedSubBlockStart.gifContractedSubBlock.gif                    {
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("+"))
265ExpandedSubBlockStart.gifContractedSubBlock.gif                        {
266ExpandedSubBlockStart.gifContractedSubBlock.gif                            string[] temp = szTemp.Split(new char[] ' ' });
267                            // temp1 += temp[1] + ",";
268                            if (IsEmailIn(temp[1], usermail))
269ExpandedSubBlockStart.gifContractedSubBlock.gif                            {
270                                szTemp = RdStrm.ReadLine();
271                            }

272                            else
273ExpandedSubBlockStart.gifContractedSubBlock.gif                            {
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
281ExpandedSubBlockStart.gifContractedSubBlock.gif                        {
282                            szTemp = RdStrm.ReadLine();
283                        }

284
285                    }

286                }

287                if (table.Count == 0)
288ExpandedSubBlockStart.gifContractedSubBlock.gif                {
289                    Console.WriteLine("No New Mail");
290                    return string.Empty;
291                }

292                else
293ExpandedSubBlockStart.gifContractedSubBlock.gif                {
294                    foreach (string key in table.Keys)
295ExpandedSubBlockStart.gifContractedSubBlock.gif                    {
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!= '-')
302ExpandedSubBlockStart.gifContractedSubBlock.gif                        {
303                            // string usefulMessage = "";
304                            while (szTemp != ".")
305ExpandedSubBlockStart.gifContractedSubBlock.gif                            {
306                                if (szTemp.StartsWith("SUBJECT:"))
307ExpandedSubBlockStart.gifContractedSubBlock.gif                                {
308                                    int index_1 = szTemp.IndexOf(":");
309                                    usefulMessage += "Mail_Subject:" + szTemp.Substring(index_1 + 1+ ";";
310                                }

311                                if (szTemp.StartsWith("BODY:"))
312ExpandedSubBlockStart.gifContractedSubBlock.gif                                {
313                                    int index = szTemp.IndexOf(":");
314                                    usefulMessage += "Mail_Body:" + szTemp.Substring(index + 1);
315                                    // string usefulMessage = 
316                                    szTemp = RdStrm.ReadLine();
317                                    while (szTemp != ".")
318ExpandedSubBlockStart.gifContractedSubBlock.gif                                    {
319                                        usefulMessage += szTemp;
320                                        szTemp = RdStrm.ReadLine();
321                                    }

322                                    usefulMessage += "|";
323                                }

324                                else
325ExpandedSubBlockStart.gifContractedSubBlock.gif                                {
326                                    szTemp = RdStrm.ReadLine();
327                                }

328                            }

329                        }

330                        else
331ExpandedSubBlockStart.gifContractedSubBlock.gif                        {
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)
342ExpandedSubBlockStart.gifContractedSubBlock.gif            {
343                // Status.Items.Add("Error: " + err.ToString());
344                Console.WriteLine("Error: " + err.ToString());
345                return string.Empty;
346            }

347        }
    
348    }

349}

350

 

待续。。。

转载于:https://www.cnblogs.com/diyunpeng/archive/2009/05/29/1491807.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值