【发布时间】:2021-09-29 15:05:00
【问题描述】:
如果我们有UniqueId 到我们希望通过使用ImapClient 将附件移动到的邮件中,我们究竟如何才能做到这一点?
谢谢!
【问题讨论】:
标签: c# .net-core email-attachments mailkit mimekit
如果我们有UniqueId 到我们希望通过使用ImapClient 将附件移动到的邮件中,我们究竟如何才能做到这一点?
谢谢!
【问题讨论】:
标签: c# .net-core email-attachments mailkit mimekit
UniqueId? AddAttachmentToMessage (ImapClient client, ImapFolder folder, UniqueId uid, MimeEntity attachment)
{
var message = folder.GetMessage (uid);
var body = message.Body;
Multipart multipart;
if (message.Body is Multipart && message.Body.ContentType.IsMimeType ("multipart", "mixed")) {
multipart = (Multipart) message.Body;
} else {
multipart = new Multipart ("mixed");
multipart.Add (message.Body);
message.Body = multipart;
}
multipart.Add (attachment);
var newUid = folder.Append (message);
folder.AddFlags (uid, MessageFlags.Deleted, true);
if (client.Capabilities.HasFlag (ImapCapabilities.UidPlus))
folder.Expunge (new UniqueId[] { uid });
return newUid;
}
如果服务器不支持 UIDPLUS 并且您需要 newUid 值,那么您可以这样做:
if (!client.Capabilities.HasFlag (ImapCapabilities.UidPlus)) {
var initialUids = folder.Search (SearchQuery.All);
folder.Append (message);
var updatedUids = folder.Search (SearchQuery.All);
// find the new uids
var newUids = new UniqueIdSet (SortOrder.Ascending);
for (int i = updatedUids.Count - 1; i >= 0; i--) {
if (!initialUids.Contains (updatedUids[i]))
newUids.Add (updatedUids[i]);
}
// get envelope info for each of the new messages
var newItems = folder.Fetch (newUids, MessageSummaryItems.UniqueId | MessageSummaryItems.Envelope);
foreach (var item in newItems) {
var msgid = MimeUtils.ParseMessageId (item.Envelope.MessageId);
if (message.MessageId.Equals (msgid))
return item.UniuqeId;
// Note: if you want to be more pedantic, you can compare the From/To/Cc/ReplyTo and Subject fields as well.
}
}
【讨论】:
folder.Append(message) 返回一个空的newUid,我们可以使用哪个SearchQuery 通过folder.Search 找到创建的邮件的UniqueId 最好?在我们可以使用的消息中是否有一些独特的东西,或者我们能做的最好的事情是SearchQuery.SubjectContains(message.Subject).And(SearchQuery.YoungerThan(400))我在服务器繁忙或其他情况下使用了数字 400 - 不确定我是否准确地理解了这个概念,但如果有没有这样的危险,我也会使用像 40 这样的数字。