【发布时间】:2021-01-16 11:39:10
【问题描述】:
如果未调用 ListMessages(),Aspose.Email.Clients.Imap.ImapClient FetchMessage 和 Save(所有版本,异步或非同步)总是返回空/null MailMessage
注意:在 aspose 论坛上报告了类似的问题,例如:https://forum.aspose.com/t/imapclient-empty-mailmessage-with-fetch-command/213289 (但 Aspose 团队在支持论坛中的回答并没有真正的帮助:( )
所以我真正的问题是,是否总是需要调用 imapClient.ListMessagesAsync /ListMessages? 或者我可以在获取之前使用其他命令来“激活”所需的内容吗?
哦..在这种情况下,Gmail 是 Imap 帐户 - 我没有测试过其他人。
//this lists all mail in the current folder (inbox if nothing else selected)
var messageInfoCollection = await imapClient.ListMessagesAsync();
- 用于所有获取消息的示例 (https://github.com/aspose-email/Aspose.Email-for-.NET/blob/master/Examples/CSharp/IMAP/ImapFetchGroupMessages.cs)
- 使用 IDLE 监控的唯一示例没有实现任何获取,它只打印从事件参数https://github.com/aspose-email/Aspose.Email-for-.NET/blob/master/Examples/CSharp/IMAP/SupportIMAPIdleCommand.cs返回的每个 MessageInfo 的 id@
示例 1(不起作用)
//
//in the case of monitoring the mailbox we get a list of messageInfo as an event argument
var manualResetEvent = new ManualResetEvent(false);
ImapMonitoringEventArgs eventArgs = null;
await imapClient.StartMonitoringAsync(callback: delegate (object sender, ImapMonitoringEventArgs e)
{
eventArgs = e;
manualResetEvent.Set(); //same as Release in SemaphoreSlim
});
//set timeout for imap idle/monitoring, shuold be max 30 minutes ackoring (IMAP standard)
var signaled = manualResetEvent.WaitOne(IdleTimeoutInMilliseconds);
manualResetEvent.Reset();
//after messages arrives we loop over them to get UniqueId and fetch complete message
if (signaled)
var messageInfos = eventArgs.NewMessages;
var message = await imapClient.FetchMessageAsync(messageInfo[n].UniqueId);
//However.. the message above will be null (or an empty object depending on what fetch method is used)
// FetchMessageAsync, FetchMessagesAsync, FetchMessage, FetchMessages, SaveMessage
示例 2(有效,但感觉像是一种解决方法;不必调用 ListMessages)
(注意:我添加了“监控循环”的完整实现细节,它“永远”监控,在处理新消息后重新启动监控周期。请注意,监控(即空闲)最多应启用 30 分钟,我将它设置为 10,并且 f ex GMAIL 会在 24 小时后断开您的连接,因此在 12 小时重新连接似乎是合理的)
//in the case of monitoring the mailbox we get a list of messageInfo as an event argument
var imapClient = new Aspose.Email.Clients.Imap.ImapClient(...)
var manualResetEvent = new ManualResetEvent(false);
ImapMonitoringEventArgs eventArgs = null;
do
{
await imapClient.StartMonitoringAsync(callback: delegate (object sender, ImapMonitoringEventArgs e)
{
eventArgs = e;
manualResetEvent.Set(); //same as Release in SemaphoreSlim
});
//set timeout for imap idle/monitoring, shuold be max 30 minutes ackoring (IMAP standard)
var signaled = manualResetEvent.WaitOne(IdleTimeoutInMilliseconds);
manualResetEvent.Reset();
//this will work ->
// for some reason it seem we need to "activate" something.. to be able to fetch
await imapClient.ListMessagesAsync(); //not using the data, just a "wake up call" to make Fetch work
if (signaled)
{
var messageInfos = eventArgs.NewMessages;
var message = await imapClient.FetchMessageAsync(messageInfo[n].UniqueId);
//... Do your stuff..
}
//remember to stop monitoring before restarting the monitoring cycle
await imapClient.StopMonitoringAsync();
} while (!CancellationToken.IsCancellationRequested);
希望我能就它的工作原理以及我是否做得对得到一个明确的答案,但至少 我希望这个“workaraound”可以帮助其他人——因为我花了大约 6-8 个小时来思考并考虑使用 MimeKit 代替或其他东西,但是由于我们使用其他 Aspose 库并拥有 Total 许可证,所以更有意义使用 Aspose.Email(用于此项目)。
编码愉快! //吉米
【问题讨论】:
标签: imap aspose gmail-imap