根据主题编号下载附件(MailKit库)
Download attachments according to number in subject (MailKit library)
我正在使用以下代码从电子邮件中下载附件:
int count = client.Count();
List<MimeMessage> allMessages = new List<MimeMessage>(count);
for (int i = 0; i < count; i++)
{
allMessages.Add(client.GetMessage(i));
foreach (var attachment in allMessages[i].Attachments)
{
using (var stream = File.Create(AppDomain.CurrentDomain.BaseDirectory + "/folderForSegments/" + attachment.ContentType.Name))
{
if (attachment is MessagePart)
{
var part = (MessagePart)attachment;
part.Message.WriteTo(stream);
}
else
{
var part = (MimePart)attachment;
part.ContentObject.DecodeTo(stream);
}
}
}
}
效果很好,但我想根据主题中的编号顺序下载附件。例如:如果我的收件箱看起来像这样
附件将按顺序保存在我的光盘上:6、8、7、3、2...我想按顺序保存附件:1、2、3、4、5...我该怎么做?
对于 POP3,如果不提前知道邮件在服务器上的顺序,就无法按该顺序下载邮件。
如果顺序比浪费的带宽更重要,您可以先为每条消息使用 client.GetHeader(i)
下载 header,这样您就可以使用 Subject
header值来确定顺序,但这会浪费大量带宽,因为当您下载邮件时,您将再次下载邮件 headers。
另一种选择是下载所有邮件,将它们添加到 List<T>
,然后根据 Subject
对它们进行排序,然后遍历邮件并保存附件,但这也可能会用到多少 RAM 取决于您的消息有多大。
编辑:
对于 IMAP,假设您的服务器支持 SORT 扩展,您可以这样做:
if (client.Capabilities.HasFlag (ImapCapabilities.Sort)) {
var query = SearchQuery.SubjectContains ("damian_mistrz_");
var orderBy = new OrderBy[] { OrderBy.Subject };
foreach (var uid in folder.Sort (query, orderBy) {
var message = folder.GetMessage (uid);
// save attachments...
}
}
如果您的服务器不支持 SORT,那么您可能会这样做:
var query = SearchQuery.SubjectContains ("damian_mistrz_");
var orderBy = new OrderBy[] { OrderBy.Subject };
var uids = folder.Search (query);
var items = folder.Fetch (uids, MessageSummaryItems.Envelope | MessageSummaryItems.UniqueId);
items.Sort (orderBy);
foreach (var item in items) {
var message = folder.GetMessage (item.UniqueId);
// save the attachments...
}
我正在使用以下代码从电子邮件中下载附件:
int count = client.Count();
List<MimeMessage> allMessages = new List<MimeMessage>(count);
for (int i = 0; i < count; i++)
{
allMessages.Add(client.GetMessage(i));
foreach (var attachment in allMessages[i].Attachments)
{
using (var stream = File.Create(AppDomain.CurrentDomain.BaseDirectory + "/folderForSegments/" + attachment.ContentType.Name))
{
if (attachment is MessagePart)
{
var part = (MessagePart)attachment;
part.Message.WriteTo(stream);
}
else
{
var part = (MimePart)attachment;
part.ContentObject.DecodeTo(stream);
}
}
}
}
效果很好,但我想根据主题中的编号顺序下载附件。例如:如果我的收件箱看起来像这样
对于 POP3,如果不提前知道邮件在服务器上的顺序,就无法按该顺序下载邮件。
如果顺序比浪费的带宽更重要,您可以先为每条消息使用 client.GetHeader(i)
下载 header,这样您就可以使用 Subject
header值来确定顺序,但这会浪费大量带宽,因为当您下载邮件时,您将再次下载邮件 headers。
另一种选择是下载所有邮件,将它们添加到 List<T>
,然后根据 Subject
对它们进行排序,然后遍历邮件并保存附件,但这也可能会用到多少 RAM 取决于您的消息有多大。
编辑:
对于 IMAP,假设您的服务器支持 SORT 扩展,您可以这样做:
if (client.Capabilities.HasFlag (ImapCapabilities.Sort)) {
var query = SearchQuery.SubjectContains ("damian_mistrz_");
var orderBy = new OrderBy[] { OrderBy.Subject };
foreach (var uid in folder.Sort (query, orderBy) {
var message = folder.GetMessage (uid);
// save attachments...
}
}
如果您的服务器不支持 SORT,那么您可能会这样做:
var query = SearchQuery.SubjectContains ("damian_mistrz_");
var orderBy = new OrderBy[] { OrderBy.Subject };
var uids = folder.Search (query);
var items = folder.Fetch (uids, MessageSummaryItems.Envelope | MessageSummaryItems.UniqueId);
items.Sort (orderBy);
foreach (var item in items) {
var message = folder.GetMessage (item.UniqueId);
// save the attachments...
}