2013-04-20 88 views
-1

我試圖從電子郵件中提取標題和正文信息,下面的代碼以其原始格式檢索標題和正文。我有一個電子郵件對象,其中包含字段from,subject,datebody。我想從電子郵件中提取這些值並將它們分配給電子郵件對象。我如何解決它?我嘗試了幾種方法,例如獲取標題信息並使用streamReader.ReadLine()獲得一行,但我得到illegal path exceptions。我知道我可以使用一個庫,但我需要這樣做。解析IMAP消息並提取標題信息

我的意思是這個,IMAP命令返回標題信息。我想提取subject值,date值,sender電子阿米爾等,並將它們分配給相應的值我的電子郵件對象,如

emailObject.subject = "subjectValue" 


public class Imap 
{ 

    static void Main(string[] args) 
    { 
     try 
     { 
      path = Environment.CurrentDirectory + "\\emailresponse.txt"; 

      if (System.IO.File.Exists(path)) 
       System.IO.File.Delete(path); 

      sw = new System.IO.StreamWriter(System.IO.File.Create(path)); 

      tcpc = new System.Net.Sockets.TcpClient("imap.gmail.com", 993); 

      ssl = new System.Net.Security.SslStream(tcpc.GetStream()); 
      ssl.AuthenticateAsClient("imap.gmail.com"); 
      receiveResponse(""); 

      Console.WriteLine("username : "); 
      username = Console.ReadLine(); 

      Console.WriteLine("password : "); 
      password = Console.ReadLine(); 
      receiveResponse("$ LOGIN " + username + " " + password + " \r\n"); 
      Console.Clear(); 

      receiveResponse("$ LIST " + "\"\"" + " \"*\"" + "\r\n"); 

      receiveResponse("$ SELECT INBOX\r\n"); 

      receiveResponse("$ STATUS INBOX (MESSAGES)\r\n"); 


      Console.WriteLine("enter the email number to fetch :"); 
      int number = int.Parse(Console.ReadLine()); 

      Console.WriteLine("*************Header************"); 
      Console.WriteLine(""); 
      // receiveResponse("$ FETCH " + number + " body[header]\r\n"); 
      // BODY.PEEK[HEADER.FIELDS (SUBJECT)] 

     // StringBuilder sb = receiveResponse("$ FETCH " + number + " BODY.PEEK[HEADER.FIELDS (From Subject Date)]\r\n"); 
      StringBuilder sb= receiveResponse("$ FETCH " + number + " body.peek[header]\r\n"); 

      Console.WriteLine(sb); 

      Console.WriteLine(""); 
      Console.WriteLine("Body"); 
      sb = new StringBuilder(); 
      sb=receiveResponse("$ FETCH " + number + " body[text]\r\n"); 

      System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); 
      byte[] serverbuff = new Byte[1024]; 
      int count = 0; 
      string retval = enc.GetString(serverbuff, 0, count); 

      Console.WriteLine(sb.ToString()); 

      receiveResponse("$ LOGOUT\r\n"); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("error: " + ex.Message); 
     } 
     finally 
     { 
      if (sw != null) 
      { 
       sw.Close(); 
       sw.Dispose(); 
      } 
      if (ssl != null) 
      { 
       ssl.Close(); 
       ssl.Dispose(); 
      } 
      if (tcpc != null) 
      { 
       tcpc.Close(); 
      } 
     } 


     Console.ReadKey(); 
    } 
    static StringBuilder receiveResponse(string command) 
    { 
     sb = new StringBuilder(); 
     try 
     { 
      if (command != "") 
      { 
       if (tcpc.Connected) 
       { 
        dummy = Encoding.ASCII.GetBytes(command); 
        ssl.Write(dummy, 0, dummy.Length); 
       } 
       else 
       { 
        throw new ApplicationException("TCP CONNECTION DISCONNECTED"); 
       } 
      } 
      ssl.Flush(); 


      buffer = new byte[2048]; 
      bytes = ssl.Read(buffer, 0, 2048); 
      sb.Append(Encoding.ASCII.GetString(buffer)); 


      // Console.WriteLine(sb.ToString()); 
      sw.WriteLine(sb.ToString()); 
      // sb = new StringBuilder(); 

      return sb; 

     } 
     catch (Exception ex) 
     { 
      throw new ApplicationException(ex.Message); 
     } 
    } 
+0

爲什麼不使用專門爲IMAP設計的庫?參見[http://stackoverflow.com/questions/670183/accessing-imap-in-c-sharp](http://stackoverflow.com/q/670183/960195)。 – 2013-04-20 01:25:53

+0

謝謝,這是有幫助的,需要做到沒有圖書館雖然 – 2013-04-20 01:42:58

+0

你可以請你提到這個非法路徑異常的細節嗎? – Gigi 2013-04-21 13:02:31

回答

2

你說你不想使用IMAP庫。這意味着你將不得不實施你自己的。您應該從閱讀RFC 3501開始,因爲如果不仔細閱讀文檔,您無法獲得協議。特別是,您在當前選定的郵箱上發出STATUS命令,該協議規範明確禁止該郵箱。其餘代碼支持您尚未閱讀RFC的假設。