到目前为止,我一直在使用MailSystem.Net的this code从Imap INBOX获取电子邮件,并添加了使用$"SENTSINCE {Date}"检索邮件的选项。

string mailBox = "INBOX";
public IEnumerable<Message> GetMailsSince(string mailBox) {
  return GetMails(mailBox, $"SENTSINCE {DateTime.Now.AddDays(-3).ToString("dd-MMM-yyyy")}").Cast<Message>();
}

private MessageCollection GetMails(string mailBox, string searchPhrase) {
  Mailbox mails = Client.SelectMailbox(mailBox);
  MessageCollection messages = mails.SearchParse(searchPhrase);
  return messages;
}


但是即使学习了数小时的mailkit,我似乎也无法提炼出如何做同样的事情。我的目标是获取消息对象的列表,然后可以将其属性映射到我创建的另一个类,该类将其写入mysql数据库。我也想将附件保存到磁盘。到目前为止,所有这些工作都很好,但是性能是一个问题。我希望mailkit可以大大改善这一点。

我的主要来源是the sample here,但是由于我还不熟悉异步编程和树视图,因此很难看清它。

如何将我希望“ INBOX”作为“ IMailFolder”进行硬编码?
我在哪里或如何在Mailkit中使用“ SENTSINCE {Date}”过滤器?
如何获得与邮件系统中的Message对象等效的Mailkit的“ IEnumerable”(也许是“ IMessageSummary”)?

如果您可以为我提供一些代码,甚至将链接的MailSystem.Net示例转换为Mailkit,那将是非常不错的。

最佳答案

MimeMessage等同于MailSystem.NET的Message对象,但这不是您想要的。您想要的是MailKit的IMessageSummary,它将允许您下载各个MIME部分(也称为“附件”)。

它还可以让您真正快速地获取有关消息的摘要信息(标志,接收日期(又称“ InternalDate”)),这些信息是预先解析/解码的通用标头值(例如主题,发件人,收件人等),因为IMAP服务器拥有这些内容缓存在其数据库中以便快速检索的信息。

using (var client = new ImapClient ()) {
    client.Connect ("imap.mail-server.com", 993, SecureSocketOptions.SslOnConnect);
    client.Authenticate ("username", "password");

    // if you don't care about modifying message flags or deleting
    // messages, you can open the INBOX in read-only mode...
    client.Inbox.Open (FolderAccess.ReadOnly);

    // search for messages sent since a particular date
    var uids = client.Inbox.Search (SearchQuery.SentAfter (date));

    // using the uids of the matching messages, fetch the BODYSTRUCTUREs
    // of each message so that we can figure out which MIME parts to
    // download individually.
    foreach (var item in client.Inbox.Fetch (uids, MessageSummaryItems.BodyStructure MessageSummaryItems.UniqueId)) {
        foreach (var attachment in item.Attachments.OfType<BodyPartBasic> ()) {
            var part = (MimePart) client.Inbox.GetBodyPart (item.UniqueId, attachment);

            using (var stream = File.Create (part.FileName))
                part.ContentObject.DecodeTo (stream);
        }
    }
}


注意:IMessageSummary上的每个属性都有一个对应的MessageSummaryItems枚举值,您需要使用它来填充该属性。

例如,如果要使用IMessageSummary.Envelope,则需要在MessageSummaryItems.Envelope请求中包括Fetch()

由于MessageSummaryItems被标记为[Flags]属性,因此可以按如下方式将值按位或枚举在一起:

MessageSummaryItems.BodyStructure | MessageSummaryItems.Envelope,两条信息都将被提取。

更新:

这是与MailSystem.NET的工作方式更接近的低效方式。

using (var client = new ImapClient ()) {
    client.Connect ("imap.mail-server.com", 993, SecureSocketOptions.SslOnConnect);
    client.Authenticate ("username", "password");

    // if you don't care about modifying message flags or deleting
    // messages, you can open the INBOX in read-only mode...
    client.Inbox.Open (FolderAccess.ReadOnly);

    // search for messages sent since a particular date
    var uids = client.Inbox.Search (SearchQuery.SentAfter (date));

    // using the uids of the matching messages, fetch the BODYSTRUCTUREs
    // of each message so that we can figure out which MIME parts to
    // download individually.
    foreach (var uid in uids) {
        var message = client.Inbox.GetMessage (uid);

        foreach (var attachment in message.Attachments.OfType<MimePart> ()) {
            using (var stream = File.Create (attachment.FileName))
                attachment.ContentObject.DecodeTo (stream);
        }
    }
}


注意:如果您关心保存message / rfc822附件,请查看此StackOverflow答案:MailKit save Attachments

10-08 08:41