当前位置: 首页 > 知识库问答 >
问题:

IMAP响应有限大小

柯良骏
2023-03-14

我正在使用一个电子邮件客户端,它将连接到Gmail邮箱并检索特定的电子邮件。

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

您可以在此链接中找到电子邮件正文的屏幕截图

http://www.elzouhery.com/Mail 快照.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();
    }

共有2个答案

郤玉书
2023-03-14

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

方高丽
2023-03-14

看起来您正在使用此处或类似的代码:

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

编写的代码是错误的,不能用于更大的消息。Response()调用需要循环调用.Read(),并附加结果,直到方法返回0(表示没有更多可用数据)。请查看NetworkStream.Read的文档。

此外,使用 IMAP 库会更好(请参阅在 C# 中访问 Imap)。

 类似资料:
  • 我正在为gmail编写一个简单的IMAP客户端。由于这是使用套接字等的赋值,因此我无法使用python的imaplib库。我在这段代码中遇到了一个问题: 一切正常,直到第二个命令发出。我不太清楚我现在在干什么。 这是被问到的sendData: 启动程序后,我只得到对第一个命令的响应: > 好,Gimap已准备好接受IPGOESHERE 47if12049394eef.11的请求 功能IMAP4re

  • 问题内容: 我正在通过jQuery的getJson()调用跨域Web服务。由于响应对象的大小很大,因此我在Web服务中使用了最大的JSon大小。我已经检查过getJson()提供正确的响应对象。但是仍然没有调用我的回调函数。Firebug表示已超过(firefox)响应大小。 谁能告诉我标准浏览器(例如,Firefox)处理的最大浏览器响应大小限制是多少,以及如何处理该问题? 这是相同的代码段。

  • 我想使用具有大量数据的HTTP客户端来测试我们的应用程序。是否可以使用 WireMock 创建无限或几千兆字节长度的输出,而无需分配具有该大小的字节数组或字符串? 据我所知有三个的方法: 我已经尝试但我得到了以下异常: 另外两个需要一个巨大的内存数组或字符串,这也是我想要避免的。 我还检查了枚举,但它似乎不可扩展。

  • 我正在使用Spring WebFlux编写http爬虫程序,它很容易并行执行和设置http超时: 但是如何限制页面响应大小,比如我不想为每个URL下载超过500KB的数据。读取HTTP头Content-Length是不可靠的。我想我需要降低一个级别,直接使用字节缓冲区和Netty事件,但最好使用flux/mono来包装它,以继续使用这些原语

  • 我现在正在开发一个简单的IMAP-客户端。要接收消息正文,我使用命令“UID FETCH mage-UID BODY. PEEK[]”。问题是我能确定命令上的服务器响应之一将是“*消息序列号FETCH(UID mage-UID BODY[]mage-body)”吗?或者我应该准备好接收任何可能的FETCH响应(如消息信封)?我知道我可以以“*消息序列号FETCH(FLAGS标志)”的形式接收消息标

  • 请问react native如何处理或者做响应式字体?例如,在iphone 4s中,我的字体大小是:14,而在iphone 6中,我的字体大小是:18。