IMAP响应限制的大小

IMAP响应限制的大小

问题描述:

我正在致力于一个电子邮件客户端,它将连接到Gmail邮箱并检索特定的电子邮件。IMAP响应限制的大小

现在我可以连接到我的邮箱,并且可以检索部分电子邮件,而不是所有电子邮件,无论我的缓冲区有多大,我仍然只从我的电子邮件中获得1400个字符,然后为邮件正文的其余部分填充空字符。

你可以找到一个截屏的电子邮件正文在这个环节提前

http://www.elzouhery.com/Mail%20Snapshot.png

感谢

编辑

看到完整的代码

static void Main(string[] args) 
     { 
      TcpIMAP imap = ConnectToEmail(); 
      Console.WriteLine("Total Messages " + imap.MailCount()); 
      Console.WriteLine("Total Unread Messages " + imap.MailUnreadCount()); 
      Console.WriteLine("******************************************************"); 
      imap.SelectInbox(); 

      StreamWriter writer = null; 
      int mailCount = imap.MailCount(); 
      var mailSize = string.Empty; 
      var content = string.Empty; 
      var subject = string.Empty; 


      for (int i = 1; i < mailCount; i++) 
      { 
       try 
       { 
        writer = new StreamWriter(@"c:\Mails\" + i + ".txt", true); 
        content = imap.GetMessage(i).ToString(); 
        writer.Write(content); 
        writer.Close(); 
       } 
       catch(Exception ex) 
       { 
        writer.Write(content); 
        Console.Write(ex.Message); 
        writer.Close(); 
       } 
      } 
     } 

     private static TcpIMAP ConnectToEmail() 
     { 
      string host = "imap.gmail.com"; 
      string username = "************"; 
      string password = "************"; 

      TcpIMAP imap = new TcpIMAP(); 
      imap.Connect(host, 993); 
      imap.AuthenticateUser(username, password); 
      return imap; 
     } 

     public static string GetMailSubject(string Header) 
     { 
      var headerLines = Header.Split(Environment.NewLine.ToCharArray()); 
      foreach (var line in headerLines) 
      { 
       if (line.IndexOf("Subject") > -1) 
       { 
        return line.Replace("Subject: ", ""); 
       } 
      } 
      return ""; 
     } 
/***************************************************/ 
class TcpIMAP 
{ 
    private TcpClient _imapClient; 
    private Stream _imapNs; 
    private StreamWriter _imapSw; 
    private StreamReader _imapSr; 

    public TcpIMAP() 
    { 

    } 

    public TcpIMAP(string hostname, int port) 
    { 
     InitializeConnection(hostname, port); 
    } 

    public void Connect(string hostname, int port) 
    { 
     InitializeConnection(hostname, port); 
    } 

    private void InitializeConnection(string hostname, int port) 
    { 
     try 
     { 
      _imapClient = new TcpClient(hostname, port); 
      System.Net.Security.SslStream sslstream = new System.Net.Security.SslStream(_imapClient.GetStream()); 
      sslstream.AuthenticateAsClient("imap.gmail.com"); 
      _imapNs = sslstream; 
      _imapSw = new StreamWriter(_imapNs); 
      _imapSr = new StreamReader(_imapNs); 

      Console.WriteLine("*** Connected ***"); 
      Response(); 
     } 
     catch (SocketException ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    } 


    public void AuthenticateUser(string username, string password) 
    { 
     _imapSw.WriteLine("$ LOGIN " + username + " " + password); 
     _imapSw.Flush(); 
     Response(); 
    } 


    public int MailCount() 
    { 
     _imapSw.WriteLine("$ STATUS INBOX (messages)"); 
     _imapSw.Flush(); 

     string res = Response(); 
     Match m = Regex.Match(res, "[0-9]*[0-9]"); 
     return Convert.ToInt32(m.ToString()); 
    } 

    public int MailUnreadCount() 
    { 
     _imapSw.WriteLine("$ STATUS INBOX (unseen)"); 
     _imapSw.Flush(); 

     string res = Response(); 
     Match m = Regex.Match(res, "[0-9]*[0-9]"); 
     return Convert.ToInt32(m.ToString()); 
    } 


    public string SelectInbox() 
    { 
     _imapSw.WriteLine("$ SELECT INBOX"); 
     _imapSw.Flush(); 
     return Response(); 
    } 


    public object GetMessageHeaders(int index) 
    { 
     _imapSw.WriteLine("$ FETCH " + index + " (body[header.fields (from subject date)])"); 
     _imapSw.Flush(); 

     return Response(); 
    } 

    public object GetMessage(int index) 
    { 
     _imapSw.WriteLine("$ FETCH " + index + " BODY.PEEK[]"); 
     _imapSw.Flush(); 

     return Response(); 
    } 
    private string Response() 
    { 
     byte[] data = new byte[_imapClient.ReceiveBufferSize]; 
     int ret = _imapNs.Read(data, 0, data.Length); 
     string output = Encoding.ASCII.GetString(data).TrimEnd().Replace("\0", ""); 
     return output; 
    } 



    public void Disconnect() 
    { 
     _imapSw.WriteLine("$ LOGOUT"); 
     _imapSw.Flush(); 
     _imapClient.Close(); 
    } 

    public string SendCommand(string command) 
    { 
     _imapSw.WriteLine("$ " + command); 
     _imapSw.Flush(); 
     return Response(); 
    } 
下方
+0

邮政编码请。听起来就像你只收到邮件的第一个数据包。 – Joe 2012-07-11 16:23:39

+0

以上代码 – 2012-07-12 09:30:35

+0

什么是_imapClient,什么是设置ReceiveBufferSize?我猜你必须根据其他事件/触发反复调用。 – Joe 2012-07-12 11:08:24

看起来你正在使用的代码从这里,或类似:

http://www.codeproject.com/Articles/29594/How-to-Access-Emails-Using-the-IMAP-Protocol

书面该代码是错误的,并不会为较大的邮件工作。 Response()调用需要循环调用.Read(),追加结果直到方法返回0(表示没有更多可用数据。)查看NetworkStream.Read的文档。

此外,使用IMAP库会更好(请参阅Accessing Imap in C#)。

+0

是的,我用你上面提到的代码,我试图循环读取加载整个消息体,但能够读取我必须发送一个命令到服务器,例如我不得不在一个循环中发送STATE命令,直到我看到OK成功,这个消息已经完成,但它是越野车,所以我认为有可能在1次调用中获得整个消息体。 – 2012-07-12 14:06:42

+0

此外,您发送的链接不工作替代链接http://hellowebapps.com/products/imapx/ – 2012-07-12 14:09:42

你只需改变你的接收缓冲区大小