首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GetMessage id超出搜索范围

GetMessage id超出搜索范围
EN

Stack Overflow用户
提问于 2018-02-21 00:29:54
回答 3查看 504关注 0票数 0

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

代码语言:javascript
复制
'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

并得到错误:

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-02-21 15:07:02

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

代码语言:javascript
复制
ImapFolder.GetMessage (int index)
ImapFolder.GetMessage (UniqueId uid)

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

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

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2018-02-22 11:37:09

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

代码语言:javascript
复制
$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)
票数 0
EN

Stack Overflow用户

发布于 2018-09-27 19:49:02

这将使用您的Uint值创建一个UID:

代码语言:javascript
复制
$UID = New-Object Mailkit.UniqueId(Msg.Id)

然后使用inbox.getMessage而不是msg.id调用您的msg.id

代码语言:javascript
复制
try {
  $inbox.GetMessage($UID)
} catch { 
  $_ 
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48896416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档