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

2023-11-22

我在网上查看了其他示例,但我无法弄清楚如何从 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
                }
            }
        }
    }
}

这一切都在FAQ在“如何保存附件?”中部分。

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

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,然后不要使用不同的文件夹对象迭代结果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MailKit:如何从 MimeMessage 本地下载所有附件 的相关文章

随机推荐

  • Vis.js 网络:如何获取数据和选项进行保存?

    我的目的是使用 vis js 创建简单的图形编辑器 我想到的第一个功能是手动定位节点并保存它 然而 与设置选项一种直接的方法来获取所有options似乎不存在 是否有任何合理的方法来获取它们 除了尝试使用诸如dragEnd这听起来太脆弱了
  • 如何在java中消除retrofit反应式请求?

    我正在开发一个 android 项目 该项目使用 Rx Java observable 和 subscribe 通过改造来发出请求 但是 在某些交互中 此请求可以被多次调用 我只想在预定义的时间窗口内执行最后一个请求 去抖 我尝试应用deb
  • 如何将 PHP 代码嗅探器 XML 报告转换为 HTML?

    您能否建议一些将 PHP 代码嗅探器 XML 报告转换为 HTML 页面的方法 我想我可能需要一些 XSLT 翻译 提前感谢您的建议 几天前 我在博客上发布了 XSLT 样式表 http phpdojo blogspot com 2010
  • 如何:更新 iCalendar 文件导入的日历事件? [复制]

    这个问题在这里已经有答案了 可能的重复 ICalendar 和事件更新在 Outlook 中不起作用 帮助使用 iCalendar 文件更新 Outlook 2007 中的事件 如何更新 iCalendar 文件导入的日历事件 我需要重新导
  • 如何使用 PlistBuddy 将数组添加到 Plist?

    这个问题是一个子问题 替代方法来解决我试图通过这个问题做的事情 如何使用 PListBuddy 将条目从一个文件复制到另一个文件 我想使用 PlistBuddy 通过 XCode 构建脚本 使用 Bash Shell 将条目从 Plist
  • 将matlab矩阵分成几个相等的部分

    我有一个大小矩阵64500x17 它代表检测到的文本特征 我必须用它来找到 5 个质心kmeans 我需要的是 把这个矩阵分成5份12900x17矩阵 找到方法 将它们连接成一个5x17矩阵输入到开始参数kmeans 我几乎知道如何做所有事
  • 来自 .. 错误有效负载的无效状态代码“400”:“要求失败:会话不活动

    我正在运行 Pyspark 脚本将数据帧写入 jupyter Notebook 中的 csv 如下所示 df coalesce 1 write csv Data1 csv header true 运行一个小时后 我收到以下错误 错误 状态代
  • 为什么我不能多重声明一个类

    我可以做这个 extern int i extern int i 但我不能对班级做同样的事情 class A class A 虽然在这两种情况下都没有分配内存 以下是声明 extern int i class A 接下来的两个是定义 int
  • 如何开始活动 语言和输入

    我想打开 启动 名为 语言和输入 的活动 用户可以在其中更改设备语言 startActivity new Intent Locale 它在区域设置或 设置中 它在哪里 尝试这个 Intent intent new Intent intent
  • Powershell - 检查远程进程,如果完成则继续

    作为备份操作的一部分 我运行 7zip 命令将文件夹压缩为单个 7z 文件 没有问题 因为我正在使用InVoke WMIMethod Example zip cmd c irFolder 7za exe a somedirectory 7z
  • 线程有不同的堆吗?

    据我所知 当操作系统创建线程时 每个线程都会获得一个不同的堆栈 我想知道每个线程是否也有一个独特的堆 不 所有线程共享一个公共堆 Each 线程有一个私有堆栈 它可以快速添加和删除项目 这使得基于堆栈的内存变得更快 但是如果您使用太多堆栈内
  • 将副本集转换为独立服务器后遇到 MongoDB 警告

    将 mongodb 副本集转换为独立服务器后 我遇到了以下警告 我执行了 rs remove host 并在启动 mongo 数据库时删除了 replSet 参数 root sam mongo MongoDB shell version 2
  • 用 PHP 编写的语言解析器库

    我正在寻找一个语言解析器用 PHP 编写 目标是阅读自定义语言 不读PHP代码 基本上 我想指定一种语言语法 给出一个代码片段并返回一个表示它的结构 然后我可以遍历该结构来执行代码片段 我相信该结构将是AST 但我不知道这是否是唯一的选择
  • 如何从 NodeMCU 中的无限重启循环中恢复?

    我的 NodeMCU 程序已进入无限重启循环 我的代码功能正常 但我尝试执行的任何操作 例如file remove init lua 甚至只是 node heap 它会出现恐慌并重新启动 并显示 PANIC unprotected erro
  • Visual Studio 设置文件 - 它是如何工作的?

    我不明白以下事情 app config applicationname exe config 和设置文件有什么区别 我无法在特定帐户下的 Windows7 AppData 目录中找到 settings 文件 我听说它应该位于那里的某个地方
  • Bootstrap v4 导航栏错误?

    问题就在这里 我从引导端获取了默认导航栏示例 https v4 alpha getbootstrap com components navbar 它们在结果中显示全尺寸的导航栏 当屏幕变小时 导航栏可能会折叠 但是当我将代码插入到我的项目中
  • 如何在 Android 上用 Java 创建 Multimap

    我在哪里可以找到 Java 的 multimap 实现 它可以在 Android 上运行 而无需包含任何其他类等 我发现的实现都需要其他东西 而这些东西又需要其他东西 而且很快就会变得混乱 我正在从 C 移植一个项目 并且是 java 的新
  • 在jquery中选择根元素

    我需要能够从 a 中选择根元素fragment不知道节点类型 类 id 或层次结构 div div div div div div div div div div 我希望能够执行类似 root 的操作 并在上面的示例中选择 0 更好的是我更
  • 为什么“True == not False”是语法错误?

    比较布尔值与 在 Python 中工作 但是当我应用布尔值时not运算符 结果是语法错误 Python 2 7 r27 82500 Sep 16 2010 18 02 00 GCC 4 5 1 20100907 Red Hat 4 5 1
  • MailKit:如何从 MimeMessage 本地下载所有附件

    我在网上查看了其他示例 但我无法弄清楚如何从 MimeMessage 对象下载和存储所有附件 我确实研究过 WriteTo 但无法让它工作 还想知道附件是否会按照原始文件名保存 并在电子邮件内键入 这是我到目前为止所拥有的 using va