【问题标题】:Aspose.Email.Clients.Imap.ImapClient FetchMessage always return an empty/null MailMessage if not ListMessages() has been called如果没有调用 ListMessages(),Aspose.Email.Clients.Imap.ImapClient FetchMessage 总是返回一个空/null MailMessage
【发布时间】: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(); 

示例 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


    【解决方案1】:

    @JimiSweden,

    感谢您的建议。您还通过Aspose.Email support forum 与我们分享了您的回复,我们将考虑您的建议并在文档中进行必要的更改。

    我在 Aspose 担任支持开发人员/宣传员。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      • 1970-01-01
      • 2011-07-17
      相关资源
      最近更新 更多