我使用以下代码从电子邮件下载附件:
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);
}
}
}
}
它完美无缺,但我希望按照主题中的数字顺序下载附件。例如:如果我的收件箱看起来像这样
答案 0 :(得分:2)
对于POP3,如果不提前知道邮件在服务器上的顺序,就无法按顺序下载邮件。
如果订单比浪费的带宽更重要,您可以先为每条消息使用client.GetHeader(i)
下载标题,以便您可以使用Subject
标题值来确定订单,但这很多浪费带宽,因为您只是在下载邮件时第二次下载邮件标题。
另一种选择是下载所有消息,将它们添加到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...
}