到目前为止,我一直在使用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