【问题标题】:GMail IMAP Append {Length}GMail IMAP 附加 {Length}
【发布时间】:2016-07-17 17:53:48
【问题描述】:

当我尝试在 C# 中添加命令时,请参阅代码:

private readonly string n = Environment.NewLine;
public string CreateDraft()
    {
        string output;
        string command = "MIME-Version: 1.0" + n +
                         "From: username@gmail.com" + n +
                         "To: username@gmail.com" + n +
                         "Subject: " + machineId + n +
                         "Content-Type: text/plain; charset=utf-8" + n +
                         "TESTING" + n;
        output =  ReceiveResponse("$$ APPEND [Gmail]/Drafts (\\Draft) {" +      Encoding.UTF8.GetByteCount(command) + "}" + n);

        output += n + ReceiveResponse(command);

        return output;
    }

private string ReceiveResponse(string command)
    {
        try
        {
            if (InternetIsConnected() == true)
            {
                if (!(tcpc.Connected))
                {
                    Connect();
                }

                if (tcpc.Connected)
                {
                    dummy = Encoding.ASCII.GetBytes(command);
                    ssl.Write(dummy, 0, dummy.Length);
                    ssl.Flush();

                    response = "";

                    do
                    {
                        bytes = ssl.Read(buffer, 0, buffer.Length);
                        Decoder decoder = Encoding.UTF8.GetDecoder();
                        char[] chars = new char[decoder.GetCharCount(buffer, 0, bytes)];
                        decoder.GetChars(buffer, 0, bytes, chars, 0);

                        response += new string(chars);
                    } while (response.Contains("$$") == false && (response.Contains("+") == false));

                    return response;
                }

                return "Failure: Terminal Disconnected";
            }
        }
        catch (Exception ex)
        {
        }

        return "Failure";
    }

它说,BAD 无法解析命令。它在Encoding.UTF8.GetByteCount(command) 上崩溃,它的长度为 162,但是当我尝试 160 时,它可以工作。 GMAIL 只是不同意我的计数,然后它就停止工作了。

【问题讨论】:

    标签: c# gmail imap


    【解决方案1】:

    您的命令实际上是错误的;你必须发送文字,然后 CRLF,然后等待服务器告诉你发送更多,然后发送正文。

    {3}foo之类的有错,应该是{3}\r\n,等服务器告诉你继续,foo

    【讨论】:

    • 如你所见,我有一个变量n,它分配给Environment.Newline。我在发送 foo 之前使用它。
    • 问题是,人们算作 3 个字符 (foo),gmail 将其实际字符减去 2,然后就可以了。
    • Environment.Newline 变量是否取决于平台? IMAP 应始终使用\r\n。
    • 数字是参数中的字符数。命令以 CRLF 结尾,即。有一个标签、一个空格、命令名、一些参数,最后是 CRLF。 CRLF 不是文字参数的一部分,它是你必须在最后一个参数之后发送的东西。
    猜你喜欢
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 2011-12-17
    • 2011-01-28
    • 2016-09-01
    • 2016-01-06
    相关资源
    最近更新 更多