如果尚未调用ListMessages,则Aspose.Email.Clients.Imap.ImapClient FetchMessage始终返回空/空MailMessage

问题描述

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(); 

示例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中担任支持开发人员/宣传人员。