简体   繁体   English

MailKit:如何从MimeMessage在本地下载所有附件

[英]MailKit: How to download all attachments locally from a MimeMessage

I have looked at other examples online, but I am unable to figure out how to download and store ALL the attachments from a MimeMessage object. 我在线上看过其他示例,但无法弄清楚如何从MimeMessage对象下载和存储所有附件。 I did look into the WriteTo(), but I could not get it to work. 我确实调查了WriteTo(),但无法正常工作。 Also wondering whether attachments will be saved according to the original file name, and type inside the email. 还想知道是否将根据原始文件名保存附件,然后在电子邮件中键入内容。 Here is what I have so far: 这是我到目前为止的内容:

using (var client = new ImapClient())
{
    client.Connect(Constant.GoogleImapHost, Constant.ImapPort, SecureSocketOptions.SslOnConnect);
    client.AuthenticationMechanisms.Remove(Constant.GoogleOAuth);
    client.Authenticate(Constant.GoogleUserName, Constant.GenericPassword);

    if (client.IsConnected == true)
    {
        FolderAccess inboxAccess = client.Inbox.Open(FolderAccess.ReadWrite);
        IMailFolder inboxFolder = client.GetFolder(Constant.InboxFolder);
        IList<UniqueId> uids = client.Inbox.Search(SearchQuery.All);

        if (inboxFolder != null & inboxFolder.Unread > 0)
        {
            foreach (UniqueId msgId in uids)
            {
                MimeMessage message = inboxFolder.GetMessage(msgId);

                foreach (MimeEntity attachment in message.Attachments)
                {
                    //need to save all the attachments locally
                }
            }
        }
    }
}

This is all explained in the FAQ in the "How do I save attachments?" 常见问题”中的“如何保存附件?”对此进行了全部解释。 section. 部分。

Here is a fixed version of the code you posted in your question: 这是您在问题中发布的代码的固定版本:

using (var client = new ImapClient ()) {
    client.Connect (Constant.GoogleImapHost, Constant.ImapPort, SecureSocketOptions.SslOnConnect);
    client.AuthenticationMechanisms.Remove (Constant.GoogleOAuth);
    client.Authenticate (Constant.GoogleUserName, Constant.GenericPassword);

    client.Inbox.Open (FolderAccess.ReadWrite);
    IList<UniqueId> uids = client.Inbox.Search (SearchQuery.All);

    foreach (UniqueId uid in uids) {
        MimeMessage message = client.Inbox.GetMessage (uid);

        foreach (MimeEntity attachment in message.Attachments) {
            var fileName = attachment.ContentDisposition?.FileName ?? attachment.ContentType.Name;

            using (var stream = File.Create (fileName)) {
                if (attachment is MessagePart) {
                    var rfc822 = (MessagePart) attachment;

                    rfc822.Message.WriteTo (stream);
                } else {
                    var part = (MimePart) attachment;

                    part.Content.DecodeTo (stream);
                }
            }
        }
    }
}

A few notes: 一些注意事项:

  1. There's no need to check if client.IsConnected after authenticating. 验证后无需检查client.IsConnected If it wasn't connected, it would have thrown an exception in the Authenticate() method. 如果未连接,它将在Authenticate()方法中引发异常。 It would have thrown an exception in the Connect() method as well if it didn't succeed. 如果不成功,它也会在Connect()方法中引发异常。 There is no need to check the IsConnected state if you literally just called Connect() 2 lines up. 如果您只是叫Connect() 2行,则无需检查IsConnected状态。
  2. Why are you checking inboxFolder.Unread if you don't even use it anywhere? 您为什么要检查inboxFolder.Unread即使您在任何地方都不使用它? If you just want to download unread messages, change your search to be SearchQuery.NotSeen which will give you only the message UIDs that have not been read. 如果您只想下载未读的邮件,请将搜索更改为SearchQuery.NotSeen ,它将仅为您提供未读的邮件UID。
  3. I removed your IMailFolder inboxFolder = client.GetFolder(Constant.InboxFolder); 我删除了您的IMailFolder inboxFolder = client.GetFolder(Constant.InboxFolder); logic because you don't need it. 逻辑,因为您不需要它。 If you are going to do the SEARCH using client.Inbox , then don't iterate over the results with a different folder object. 如果要使用client.Inbox进行SEARCH,则不要使用其他文件夹对象遍历结果。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM