C# ImapX 2 电子邮件检查代码似乎很慢
C# ImapX 2 email check code seems very slow
我正在使用 ImapX 2 我的 C# 程序来检查 Gmail 帐户中的电子邮件,但是整个过程似乎花费了太多时间,我将在代码中解释:
public static string checkForSubject() {
ImapX.ImapClient client = new ImapX.ImapClient();
client.Port = 993;
client.UseSsl = true;
client.Host = "imap.gmail.com";
if (client.Connect()) {
client.Login(Constants.EMAIL_SENDER, Constants.EMAIL_SENDER_PASSWORD);
var messages = client.Folders.Inbox.Search("ALL"); // THIS LINE takes like 5-10 seconds to complete
foreach (var item in messages) {
if (item.Subject.StartsWith("HELLO_")) {
string s = item.Subject;
return s;
}
}
}
return null;
}
是我的代码有问题,还是 IMAP 访问正常?
好吧,您要的是文件夹中所有邮件的 UID 或索引。如果文件夹有很多消息,并且 IMAP 服务器不支持 ESEARCH 扩展(and/or ImapX 不利用 ESEARCH 扩展),那么服务器将发回大量文本,可以好久没传了。
我指的文字墙看起来像这样:
* SEARCH 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... 9999 10000
每条消息您将获得一个号码。
使用 ESEARCH,您将获得:
* ESEARCH 1:10000
但这有点离题,因为看起来 ImapX 会下载所有匹配的邮件,在您的情况下是文件夹中的所有邮件。
您的搜索效率也极低。如果您只想要以 "HELLO_"
开头的消息,您可以这样做:
var messages = client.Folders.Inbox.Search("SUBJECT HELLO_");
foreach (var item in messages) {
if (item.Subject.StartsWith("HELLO_")) {
string s = item.Subject;
return s;
}
}
您仍然必须保留 item.Subject.StartsWith() 检查,因为 IMAP 无法检查字符串是以字符串开头还是以字符串结尾,它只是进行 "contains" 类型的搜索.
但是此搜索查询将 return 少得多的匹配项,这意味着 ImapX 将下载少得多的消息,这意味着它应该快得多。
不幸的是,它仍然非常低效,因为您只关心主题字符串,而不是整个消息。
我对 ImapX 不够熟悉,无法提高效率,但如果您要使用 MailKit,例如,您可以这样做:
client.Inbox.Open (FolderAccess.ReadOnly);
var uids = client.Inbox.Search (SearchQuery.SubjectContains ("HELLO_"));
if (uids.Count > 0) {
var summaries = client.Inbox.Fetch (uids, MessageSummaryItems.Envelope);
foreach (var summary in summaries) {
if (summary.Envelope.Subject.StartsWith ("HELLO_"))
return summary.Envelope.Subject;
}
}
希望对您有所帮助。
您可以通过限制电子邮件的下载部分来稍微提高性能。
client.Folders.Inbox.Search("SUBJECT HELLO_", ImapX.Enums.MessageFetchMode.Minimal);
只有主题和 header 将被下载。
我正在使用 ImapX 2 我的 C# 程序来检查 Gmail 帐户中的电子邮件,但是整个过程似乎花费了太多时间,我将在代码中解释:
public static string checkForSubject() {
ImapX.ImapClient client = new ImapX.ImapClient();
client.Port = 993;
client.UseSsl = true;
client.Host = "imap.gmail.com";
if (client.Connect()) {
client.Login(Constants.EMAIL_SENDER, Constants.EMAIL_SENDER_PASSWORD);
var messages = client.Folders.Inbox.Search("ALL"); // THIS LINE takes like 5-10 seconds to complete
foreach (var item in messages) {
if (item.Subject.StartsWith("HELLO_")) {
string s = item.Subject;
return s;
}
}
}
return null;
}
是我的代码有问题,还是 IMAP 访问正常?
好吧,您要的是文件夹中所有邮件的 UID 或索引。如果文件夹有很多消息,并且 IMAP 服务器不支持 ESEARCH 扩展(and/or ImapX 不利用 ESEARCH 扩展),那么服务器将发回大量文本,可以好久没传了。
我指的文字墙看起来像这样:
* SEARCH 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... 9999 10000
每条消息您将获得一个号码。
使用 ESEARCH,您将获得:
* ESEARCH 1:10000
但这有点离题,因为看起来 ImapX 会下载所有匹配的邮件,在您的情况下是文件夹中的所有邮件。
您的搜索效率也极低。如果您只想要以 "HELLO_"
开头的消息,您可以这样做:
var messages = client.Folders.Inbox.Search("SUBJECT HELLO_");
foreach (var item in messages) {
if (item.Subject.StartsWith("HELLO_")) {
string s = item.Subject;
return s;
}
}
您仍然必须保留 item.Subject.StartsWith() 检查,因为 IMAP 无法检查字符串是以字符串开头还是以字符串结尾,它只是进行 "contains" 类型的搜索.
但是此搜索查询将 return 少得多的匹配项,这意味着 ImapX 将下载少得多的消息,这意味着它应该快得多。
不幸的是,它仍然非常低效,因为您只关心主题字符串,而不是整个消息。
我对 ImapX 不够熟悉,无法提高效率,但如果您要使用 MailKit,例如,您可以这样做:
client.Inbox.Open (FolderAccess.ReadOnly);
var uids = client.Inbox.Search (SearchQuery.SubjectContains ("HELLO_"));
if (uids.Count > 0) {
var summaries = client.Inbox.Fetch (uids, MessageSummaryItems.Envelope);
foreach (var summary in summaries) {
if (summary.Envelope.Subject.StartsWith ("HELLO_"))
return summary.Envelope.Subject;
}
}
希望对您有所帮助。
您可以通过限制电子邮件的下载部分来稍微提高性能。
client.Folders.Inbox.Search("SUBJECT HELLO_", ImapX.Enums.MessageFetchMode.Minimal);
只有主题和 header 将被下载。