You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PowerShell+MailKit设置IMAP邮件为已读的技术求助

解决PowerShell中MailKit标记邮件为已读的问题

问题背景

我要编写PowerShell脚本,通过IMAP获取所有未读邮件并导入SQL数据库,导入完成后将邮件标记为已读并移动到子文件夹。其余功能均正常,但无法实现标记邮件为已读的操作。

尝试过的方法及错误

  • 最初使用以下代码:

    $Inbox_Folder.AddFlags($UID,([MailKit.MessageFlags]::Seen))
    

    报错:[MimeKit.MimeMessage] 不包含名为'AddFlags'的方法

  • 查资料得知Add/Remove/SetFlags已被Store替代,改用:

    $Inbox_Folder.Store($UID,([MailKit.MessageFlags]::Seen))
    

    报错:找到多个与"Store"匹配的模糊重载,参数计数: "2"

了解到需要使用IStoreFlagsRequest,但不清楚如何在PowerShell中编写对应代码。

原脚本代码

Add-Type -Path "$PSScriptRoot\MailKit.dll"
Add-Type -Path "$PSScriptRoot\MimeKit.dll"
$Mail_Server = '***'
$Mail_Port = '***'
$Mail_Username = '***'
$Mail_Password = '***'
$Imap_Client = New-Object MailKit.Net.Imap.ImapClient
$Imap_Client.Connect($Mail_Server,$Mail_Port)
$Imap_Client.Authenticate($Mail_Username,$Mail_Password)
$Imap_Client.Inbox.Open([MailKit.FolderAccess]::ReadWrite) | Out-Null
$Root_Folder = $Imap_Client.GetFolder($Imap_Client.PersonalNamespaces[0])
$Inbox_Folder = $Root_Folder.GetSubfolder("INBOX")
$Archive_Folder = $Inbox_Folder.GetSubfolder("Archiv")
$Mail_UIDs = $Imap_Client.Inbox.Search([MailKit.Search.SearchQuery]::AND([MailKit.Search.SearchQuery]::NotSeen,[MailKit.Search.SearchQuery]::New))
if($Mail_UIDs.Count -gt 0)
 {
 ForEach($UID in $Mail_UIDs.GetEnumerator())
  {
  #do stuff
  $Inbox_Folder.AddFlags($UID,([MailKit.MessageFlags]::Seen)) #not working
  $Imap_Client.Inbox.MoveTo($UID,$Archive_Folder) | Out-Null #works
  }
 }
$Imap_Client.Disconnect($true)

解决方案

在PowerShell中调用Store方法时,需要明确指定操作类型(添加/移除/设置),匹配正确的方法重载。将标记已读的代码替换为:

$Inbox_Folder.Store($UID, [MailKit.StoreAction]::Add, [MailKit.MessageFlags]::Seen)

关键说明

  • [MailKit.StoreAction]::Add:指定执行添加标记的操作
  • 第三个参数传入要添加的标记[MailKit.MessageFlags]::Seen
  • 确保文件夹已以ReadWrite权限打开(脚本中已通过$Imap_Client.Inbox.Open([MailKit.FolderAccess]::ReadWrite)实现,这是修改邮件标记的必要前提)

修改后的循环部分代码:

ForEach($UID in $Mail_UIDs.GetEnumerator())
{
    #do stuff(导入SQL数据库的逻辑)
    $Inbox_Folder.Store($UID, [MailKit.StoreAction]::Add, [MailKit.MessageFlags]::Seen) #正常工作
    $Imap_Client.Inbox.MoveTo($UID,$Archive_Folder) | Out-Null #works
}

内容的提问来源于stack exchange,提问作者Jeremy C.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 19:25:56