AE.Net.Mail message.value为null

时间:2014-01-20 19:34:56

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

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

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

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

1 个答案:

答案 0 :(得分:0)

我建议改用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);
                }
            }
        }
    }
}