c# - 如何使用 MailKit/MimeKit 将附件从一封电子邮件移动到另一封电子邮件?
问题描述
如果我们有UniqueId
想要通过使用将附件移动到的邮件ImapClient
,我们究竟如何实现呢?
谢谢!
解决方案
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.
}
}
推荐阅读
- mongoose - Mongoose 使用 $and 应用相同属性的两个过滤器
- out-of-memory - 关于 OPCache 的问题
- dataset - Tableau CRM 迁移数据集
- python - 如何在 Python 中使用 numpy 快速计算两个不同矩阵的每一行的点积
- python - 更改数据框中的列名称并将其融化
- amazon-web-services - 如何在字典列表中使用 set_fact?
- java - 在 Java 中处理多个 CompletableFuture
- .net - Team Foundation Server 2013 构建失败/在本地构建但不在服务器上
- amazon-web-services - 无法为 AWS EKS 集群创建 Fargate 配置文件
- visual-studio-code - vscode上的终端问题