【问题标题】:How to move an attachment from one e-mail to another using MailKit/MimeKit?如何使用 MailKit/MimeKit 将附件从一封电子邮件移动到另一封电子邮件?
【发布时间】:2021-09-29 15:05:00
【问题描述】:

如果我们有UniqueId 到我们希望通过使用ImapClient 将附件移动到的邮件中,我们究竟如何才能做到这一点?

谢谢!

【问题讨论】:

    标签: c# .net-core email-attachments mailkit mimekit


    【解决方案1】:
    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 这样的数字。
    • 我想如果服务器支持YOUNGER,它也支持UIDPLUS,所以你会从APPEND命令中得到一个UID。我可能会建议在附加消息之前获取 UID 列表,然后附加消息,然后在任何新的 UID 中搜索附加消息。
    • 理论上,所有 IMAP 服务器都支持 SubjectContains、DeliveredSince 和 NotDeleted(它们都是原始规范的一部分)。我没有在我的示例代码中使用它们,因为我认为它们不是真正必要的(虽然 NotDeleted 可能是一个很好的)并且因为 SubjectContains 在某些 IMAP 服务器实现中可能是不确定的。对于所有 IMAP 实现,使用“ALL”查询应该很快,并且由于代码在追加之前获取所有 UID,然后在追加之后再次获取,所以无论如何应该只有 1 条消息。
    • 您应该在 GMail 中编辑您的 IMAP 设置,使其表现得像一个普通的 IMAP 服务器。 当我在 IMAP 中将邮件标记为已删除时: -> 自动删除关闭 - 等待客户端更新服务器。当邮件标记为从最后一个可见的 IMAP 文件夹中删除并清除: -> 立即永久删除邮件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    • 2014-08-01
    • 2019-07-05
    • 1970-01-01
    相关资源
    最近更新 更多