使用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.
相关产品推荐
相关产品推荐

