问题描述
Aspose.Email.Clients.Imap.ImapClient FetchMessage和Save(所有版本,无论是否异步)始终返回空/空MailMessage(如果尚未调用ListMessages()的话)
注意:类似的问题在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)
(注意:我添加了“监视循环”的完整实现细节,它监视“永远”,在处理新消息后重新启动监视周期。请注意,监视(即IDLE)应启用最多30分钟,我将其设置为10,并且如果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(用于此项目)。
祝您编程愉快! //吉米
解决方法
@JimiSweden
谢谢您的建议。您还在Managing CSS and JavaScript in Symfony中与我们分享了您的回复,我们将考虑您的建议并在文档中进行必要的更改。
我正在Aspose中担任支持开发人员/宣传人员。