我尝试连接到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,我在这里要求一些帮助。
非常感谢!答案 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");
}
}