Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell GetMessage id超出搜索范围的范围_Powershell_Mailkit - Fatal编程技术网

Powershell GetMessage id超出搜索范围的范围

Powershell GetMessage id超出搜索范围的范围,powershell,mailkit,Powershell,Mailkit,我正在尝试使用powershell中的MailKit连接到IMAP服务器。 连接到服务器,打开收件箱,搜索子文件夹,选择并打开子文件夹,查询所有邮件(SeqrchQuery),然后尝试获取最后一封邮件。 示例代码: 'BouncyCastle.Crypto', 'mimekit', 'mailkit', 'Microsoft.Extensions.Options', 'cloudscribe.Messaging.Email' | %{Add-Type -Path "$(Join-Path 'D:

我正在尝试使用powershell中的MailKit连接到IMAP服务器。 连接到服务器,打开收件箱,搜索子文件夹,选择并打开子文件夹,查询所有邮件(SeqrchQuery),然后尝试获取最后一封邮件。 示例代码:

'BouncyCastle.Crypto', 'mimekit', 'mailkit', 'Microsoft.Extensions.Options', 'cloudscribe.Messaging.Email' | %{Add-Type -Path "$(Join-Path 'D:\Mailkit' ($_ + '.dll'))"}
$mll = New-Object MailKit.Net.Imap.ImapClient
$ctoken = New-Object System.Threading.CancellationToken ($false)
$ssl = [MailKit.Security.SecureSocketOptions]::Auto
$mll.Connect('server.name', 993, $ssl, $ctoken)
$mll.Authenticate(([System.Text.Encoding]::UTF8) , "user@server.name", "pass" , $ctoken)
$inbox = $mll.Inbox
$inbox.Open([MailKit.FolderAccess]::ReadOnly) | Out-Null
$inbox = $inbox.GetSubfolders($false) | ?{$_.Name -eq 'SUBFOLDER'}
$inbox.Open([MailKit.FolderAccess]::ReadOnly) | Out-Null
$src = $inbox.Search([MailKit.Search.SearchQuery]::All) 
$msg = $src | select -Last 1
try {$inbox.GetMessage($msg.Id)}
catch {
$_
}
$inbox.Close()
$mll.Disconnect($true , $ctoken)
Remove-Variable mll,inbox,msg,src,ctoken,ssl
和获取错误:

Exception calling "GetMessage" with "1" argument(s): "Argument value out of range.
Parameter name: index"
At line:23 char:1
+ $inbox.GetMessage($msg.Id)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentOutOfRangeException

您遇到的问题是MailKit有两个版本的
ImapFolder.GetMessage()

Search()
方法返回
UniqueId
值的列表。
UniqueId
结构有一个名为
Id
的成员,它是一个
uint

当您将
$msg.Id
传递给
GetMessage()
时,它将调用API的
int
版本,而不是
UniqueId
版本

对于IMAP,有两种访问消息的方法。您可以通过它们的索引访问它们,也可以通过它们的唯一标识符访问它们

它们看起来都像整数,但不能互换


您需要使用
$inbox.GetMessage($msg)

感谢@jstedfast的解释。 为了正确工作,我必须在方法调用中定义变量的类型。 正确代码:

$mll = New-Object MailKit.Net.Imap.ImapClient
$ctoken = New-Object System.Threading.CancellationToken ($false)
$ssl = [MailKit.Security.SecureSocketOptions]::Auto
$mll.Connect('server.name', 993, $ssl, $ctoken)
$mll.Authenticate(([System.Text.Encoding]::UTF8) , "user@server.name", "pass" , $ctoken)
$inbox = $mll.Inbox
$inbox.Open([MailKit.FolderAccess]::ReadOnly) | Out-Null
$inbox = $inbox.GetSubfolders($false) | ?{$_.Name -eq 'SUBFOLDER'}
$inbox.Open([MailKit.FolderAccess]::ReadOnly) | Out-Null
$src = $inbox.Search([MailKit.Search.SearchQuery]::All) 
$msg = $src | select -Last 1
try { $id = [MailKit.UniqueId]($msg.Id) ; $inbox.GetMessage($id) }
catch { $_ }
$inbox.Close()
$mll.Disconnect($true , $ctoken)

这将使用Uint值创建UID:

$UID = New-Object Mailkit.UniqueId(Msg.Id)
然后使用$UID而不是msg.id调用inbox.getMessage

try {
  $inbox.GetMessage($UID)
} catch { 
  $_ 
}

我尝试将\Seen标志设置为上次收到的邮件,将搜索查询更改为
$inbox.search([MailKit.search.SearchQuery]::NotSeen)|%{$inbox.GetMessage($.id)}
,并打开内置的MailKit日志记录。并收到相同的错误<代码>S:*476存在S:*0最近的S:*确定[未查看的476]第一次未查看。S:*正常[UID有效性1415271545]UID有效S:*正常[UIDNEXT 477]预测下一个UID S:*正常[HIGHESTMODSEQ 4]最高S:L00000006正常[只读]检查完成(0.001秒)。C:L00000007 UID搜索返回()未查看S:*ESEARCH(标记“L00000007”)UID ALL 476请不要将您的答案添加到问题中,将其作为答案发布,并将其标记为已接受。您不能仅减去1即可使其生效。你在这里真走运。请参阅我的答案以获得正确答案。谢谢您的回答!但是可能会在uidid之间转换?我必须定义id的类型,比如
%{$id=[MailKit.UniqueId]($\ukid.id);$msg=$inbox.GetMessage($id)
不,无法在2之间正确转换
try {
  $inbox.GetMessage($UID)
} catch { 
  $_ 
}