C# 使用 maikit 获取所有 headers

C# get all headers using maikit

我正在尝试连接到一个 pop3 帐户并获取包含所有 header 的所有电子邮件。我使用 mailkit 在 C# 中执行此任务。 问题是我搜索了如何在一个字符串中获取所有 header 的示例,但我没有找到这样做的方法。

using (var client = new Pop3Client())
{
    try
    {
        client.ServerCertificateValidationCallback = (s, c, h, e) => true;
        client.Connect("pop3.host.com", 110, false);
        client.AuthenticationMechanisms.Remove("XOAUTH2");
        client.Authenticate("mail@host.com", "password");
        for (int i = 0; i < client.Count; i++)
        {
                    // below I have the problem. I dont know how request the complete headers of a message/mail
                    header = client.getGetMessageHeaders(i).ToArray;
                    Console.WriteLine("..." + header);
        }
        client.Disconnect(true);
    }
    catch (Exception ex)
    {
        Console.WriteLine("Checking error: \n\n" + ex.Message + "\n\n\n");
    }
}

如您所见,我尝试在一个数组中获取 Headers,然后使用此数组将 header 赋给一个字符串,但无法使用此代码。我是 C# 新手,我在这里请求帮助。

非常感谢!

将所有 header 序列化为单个字符串的方法如下:

var headers = client.GetMessageHeaders (i);
using (var stream = new MemoryStream ()) {
    headers.WriteTo (stream);

    var bytes = memory.ToArray ();
    var latin1 = Encoding.GetEncoding (28591);
    string header = latin1.GetString (bytes, 0, bytes.length);
}

但是请记住,每个 header 可能包含未声明的 8 位 "text" 数据,这些数据可能不在 iso-8859-1 甚至 UTF-8 中(它可能在任意编码)。不仅如此,每个包含 8 位 "text" 数据的 header 甚至可能使用 不同的 编码。

试图将其表示为字符串是徒劳的。

将其表示为流或字节数组要好得多。

如果您只想将 header 打印到控制台,您可以改为执行以下操作:

using (var client = new Pop3Client())
{
    try
    {
        client.ServerCertificateValidationCallback = (s, c, h, e) => true;
        client.Connect("pop3.host.com", 110, false);
        client.AuthenticationMechanisms.Remove("XOAUTH2");
        client.Authenticate("mail@host.com", "password");
        for (int i = 0; i < client.Count; i++)
        {
                    header = client.GetMessageHeaders(i);
                    header.WriteTo (Console.OpenStandardOutput ());
        }
        client.Disconnect(true);
    }
    catch (Exception ex)
    {
        Console.WriteLine("Checking error: \n\n" + ex.Message + "\n\n\n");
    }
}

或者,如果您希望看到 解码的 header 值:

using (var client = new Pop3Client())
{
    try
    {
        client.ServerCertificateValidationCallback = (s, c, h, e) => true;
        client.Connect("pop3.host.com", 110, false);
        client.AuthenticationMechanisms.Remove("XOAUTH2");
        client.Authenticate("mail@host.com", "password");
        for (int i = 0; i < client.Count; i++)
        {
                    var headers = client.GetMessageHeaders(i);
                    foreach (var header in headers)
                        Console.WriteLine ("{0}: {1}", header.Field, header.Value);
        }
        client.Disconnect(true);
    }
    catch (Exception ex)
    {
        Console.WriteLine("Checking error: \n\n" + ex.Message + "\n\n\n");
    }
}