我在我的C#程序中使用ImapX 2来检查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访问是否正常?
答案 0 :(得分:3)
好吧,你要求文件夹中所有消息的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;
}
}
希望有所帮助。
答案 1 :(得分:2)
您可以通过限制电子邮件的下载部分来略微提高性能。
mySolution <- list()
if(input$nTraces =='1')
{
mySolution <- solveCalc(dat=dat,tox=tox,area=area,temp=temp,model=modelIn)
} else
{
mySolution <- switch(input$parVary,
"model" = lapply(modelIn,solveCalc,dat=dat,tox=tox,area=area,temp=temp),
"temp" = lapply(temp,solveCalc,dat=dat,tox=tox,area=area,model=modelIn),
"tox" = lapply(tox,solveCalc,dat=dat,temp=temp,area=area,model=modelIn),
"Vt" = lapply(dat,solveCalc,tox=tox,temp=temp,area=area,model=modelIn),
"area" = lapply(area,solveCalc,dat=dat,tox=tox,temp=temp,model=modelIn)
)
}
只会下载主题和标题。