C#使用maikit

时间:2017-12-11 02:48:23

标签: c# pop3 mailkit

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

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,以便在使用此数组后为字符串提供标头,但是使用此代码是不可能的。我是C#newbie,我在这里要求一些帮助。

非常感谢!

1 个答案:

答案 0 :(得分:1)

将所有标题序列化为单个字符串的方法是执行以下操作:

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);
}

但请注意,每个标头可能包含未声明的8位“文本”数据,这些数据可能不在iso-8859-1或甚至UTF-8中(可能在任何中)编码)。不仅如此,每个包含8位“文本”数据的标头甚至可能使用不同的编码。

尝试将其表示为字符串是一个傻瓜的差事。

将它表示为Stream或字节数组要好得多。

如果您只想将标题打印到控制台,则可以执行以下操作:

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");
    }
}

或者,如果您更愿意看到已解码的标头值:

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");
    }
}