我正在尝试在 PS 中编写一个脚本来通过 imap 获取所有未见过/未读的消息并将它们导入到 SQL-DB 中。导入后,我想将消息设置为所见并将其移动到子文件夹中。一切正常,除了我不知道如何将消息设置为已读。
我尝试过
$Inbox_Folder.AddFlags($UID,([MailKit.MessageFlags]::Seen))
但我收到错误:[MimeKit.MimeMessage] 不包含名为“AddFlags”的方法。
经过一番搜索,我发现 Add/Remove/SetFlags 被 Store 取代了。所以我做了一个
$Inbox_Folder.Store($UID,[MailKit.MessageFlags]::Seen)
这给我带来了这个错误:“Store”和参数计数发现多个不明确的重载:“2”。
经过更多挖掘后,我意识到我需要一个 IStoreFlagsRequest。但我根本不知道如何在 PS 中写出这一行。任何帮助将不胜感激。
下面是我的脚本
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)
正如您所说,MailKit 最近发生了变化,您会发现的大多数示例都引用旧的(现已删除)
.addflags
方法。
您对 store 是正确的接口的看法是正确的,但您仍然尝试像旧方法一样使用它,而它需要
StoreFlagRequest
传递 StoreAction
和 MessageFlag
:
$Inbox_Folder.Store($UID, [MailKit.StoreFlagsRequest]::new([MailKit.StoreAction]::Add,[MailKit.MessageFlags]::Seen))
或者,(因为 Powershell 无论如何都会尝试将字符串转换为正确的类型),以更简单的方式:
$Inbox_Folder.Store($UID, [MailKit.StoreFlagsRequest]::new("Add","Seen"))