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

用户名

我在线上看过其他示例,但无法弄清楚如何从MimeMessage对象下载和存储所有附件。我确实调查了WriteTo(),但无法正常工作。还想知道是否会根据原始文件名保存附件,然后在电子邮件中键入内容。这是我到目前为止的内容:

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
                }
            }
        }
    }
}
jstedfast

常见问题”中的“如何保存附件?”对此进行了全部解释。部分。

这是您在问题中发布的代码的固定版本:

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);
                }
            }
        }
    }
}

一些注意事项:

  1. client.IsConnected验证后无需检查如果未连接,它将在Authenticate()方法中引发异常Connect()如果不成功,它也会在方法中引发异常IsConnected如果您真的只是调用了Connect()2行,无需检查状态
  2. 您为什么要检查自己inboxFolder.Unread是否甚至不在任何地方使用它?如果您只想下载未读的邮件,请将搜索更改为SearchQuery.NotSeen,以便只给您提供未读的邮件UID。
  3. 我删除了您的IMailFolder inboxFolder = client.GetFolder(Constant.InboxFolder);逻辑,因为您不需要它。如果要使用进行搜索client.Inbox,则不要使用其他文件夹对象遍历结果。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用python从azure容器本地下载所有blob文件

如何在Haskell中本地下载Internet文件

重用本地下载的Android库

Python Pip 本地下载

如何在本地下载p4文件?

如何使用boto3从Glacier Deep Archive本地下载档案?

代码从colab本地下载文件

Jasper PDF本地下载与PDF制作不同

使网络爬虫在本地下载多个网页

如何将文件从我的Google云端硬盘下载到我的本地下载文件

如何将图像从公共数据库传输到Google Cloud Bucket,而无需在本地下载

如何解决 Ansible 中本地下载包的依赖关系?当包 A 依赖于包 B

C# - 在文件下载时读取本地下载路径

创建SSL本地网络以从本地下载iOS应用

将文件上传到Google Cloud Storage而不在本地下载文件?

阅读从Azure中的Blob容器拼花数据,而本地下载它

直接在线运行 Jupyter notebook(无需在本地下载)

gsutil rsync bucket1 bucket2是否在本地下载/上传文件?

从Maven本地下载人工制品的人工制品

从地图集本地下载无业游民的盒子文件并进行配置

Java-直接读取文件,而无需在本地下载和存储

可以在本地下载Hosted Office 365数据以进行大规模备份吗?

更新SQLite数据库而无需在本地下载数据

AWS S3复制对象是否在本地下载?

如何使用pdfminer从存储在S3存储桶中的PDF文件中提取文本而无需在本地下载?

欺骗游戏客户端以本地下载文件,而不是从远程服务器下载文件

在使用psql在本地下载/保存之前,将gzip表保存到AWS实例上的csv

将zip文件本地下载到tempfile,将文件提取到tempfile,然后列出文件

如果我只想使用TFS 2013在本地下载和测试文件,该怎么做?