2013-04-20 89 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的假设。