【问题标题】:AE.Net.Mail message.value is nullAE.Net.Mail message.value 为空
【发布时间】:2014-04-26 03:20:35
【问题描述】:

我正在使用 AE.net.mail 从 hotmail 帐户下载附件。以下是代码。 Messages 数组根据给定条件获取所有邮件。问题是每条记录的 message.Value 属性都是空的,除了第一条记录。

ImapClient ic = new ImapClient("imap-mail.outlook.com", "xxx@hotmail.com",                "xxx", ImapClient.AuthMethods.Login, 993, true))
    {
        ic.SelectMailbox("INBOX");

        Lazy<MailMessage>[] messages = ic.SearchMessages(SearchCondition.From("xxx@yahoo.com"));

        foreach (Lazy<MailMessage> message in messages)
        {
            MailMessage m = message.Value;
        }

  foreach (Attachment attachment in m.Attachments)
    {
        fileExtension = Path.GetExtension(attachment.Filename);
        attachment.Save(@"H:\Demo\" + fileName + Path.GetExtension(attachment.Filename));
    }
    }

我无法理解为什么。请指导。谢谢。

【问题讨论】:

  • 请检查您的大括号 - 据我所知,您发布的代码不应编译,因为MailMessage m 的范围仅限于第一个 foreach。另外,这不应该以using(ImapClient ic = ...开头吗?
  • @Marijn。这应该从使用开始,但不使用也可以正常工作并且执行良好。我所问的只是因为懒惰。

标签: c# asp.net .net lazy-loading imap


【解决方案1】:

我建议改用MailKit。这是一个更好的 IMAP 客户端实现,实际上遵循规范。

MailKit 建立在 MimeKit 之上,这是可用的 .NET 的最佳/最快/最强大的 MIME 解析器库。它比 OpenPOP.NET 的解析器快 25 倍,比 SharpMimeTools 快 75 倍,比 Mail.dll 快 70 倍,比 MIMER 快 65 倍,并且比所有开源 ImapClient 实现中包含的所有 MIME 解析器快得多(并且可能比商业 MIME 解析器更好/更快)。

MimeKit 和 MailKit 都基于标记化流解析器,这不仅意味着它们比其他库更快,还意味着它们可以更好地符合规范,最重要的是,这意味着它们不需要阅读整个在解析消息之前来自 IMAP 服务器的响应到一个巨大的字符串缓冲区 - MailKit 直接从套接字解析消息,这大大减少了大消息的内存使用量。

using System;
using System.Net;
using System.Threading;

using MailKit.Net.Imap;
using MailKit.Search;
using MailKit;
using MimeKit;

namespace TestClient {
    class Program
    {
        public static void Main (string[] args)
        {
            using (var client = new ImapClient ()) {
                var credentials = new NetworkCredential ("xxx@hotmail.com", "xxx");
                var uri = new Uri ("imaps://imap-mail.outlook.com");

                using (var cancel = new CancellationTokenSource ()) {
                    client.Connect (uri, cancel.Token);
                    client.Authenticate (credentials, cancel.Token);

                    // Open the Inbox folder
                    client.Inbox.Open (FolderAccess.ReadOnly, cancel.Token);

                    var query = SearchQuery.FromContains ("xxx@yahoo.com");
                    foreach (var uid in client.Inbox.Search (query, cancel.Token)) {
                        var message = client.Inbox.GetMessage (uid, cancel.Token);
                    }

                    client.Disconnect (true, cancel.Token);
                }
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 2014-09-02
    • 2012-06-07
    • 2012-08-14
    相关资源
    最近更新 更多