Skip to main content
 首页 » 编程设计

C# ImapX 2 电子邮件检查代码似乎很慢

2024年02月01日36telwanggs

我正在使用 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 扩展(和/或 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 无法检查字符串是以字符串开头还是以字符串结尾,它只是执行“包含”类型的搜索。

但此搜索查询将返回更少的匹配项,这意味着 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; 
    } 
} 

希望对您有所帮助。