【问题标题】:Outlook PowerShell script does not retrieve latest emailOutlook PowerShell 脚本不检索最新的电子邮件
【发布时间】:2014-04-29 00:43:04
【问题描述】:

我有一个脚本可以读取 Outlook 文件夹中的电子邮件,选择最近收到的电子邮件,并将其附件保存到目录中。

它无法正常工作 - 如果我在运行脚本之前第一次打开 Outlook,它似乎只知道要接收哪封电子邮件 - 否则,它认为最近收到的电子邮件是我上次收到的电子邮件上次打开 Outlook。

有没有办法在脚本提示扫描之前提示 Outlook 刷新?

我的代码如下:

$filepath = $args[0]
$account = $args[1]

<#
#file path
$filepath = "I:\folder"
$account = "account@host.com" 
#>

#set outlook to open
$o = New-Object -comobject outlook.application
$n = $o.GetNamespace(“MAPI”)

$Account = $n.Folders | ? { $_.Name -eq $account };
$Inbox = $Account.Folders | ? { $_.Name -match 'Inbox' };
$Data = $Inbox.Folders | ? { $_.Name -match 'Data' };
$f = $Data.Folders | ? { $_.Name -match 'MyTargetFolder' };

$email = $f.Items | Sort-Object ReceivedTime -Descending | Select-Object -First 1

# Log the email we are looking for, and mention attachments if they exist.
Write-Output "Last email received at $($email.receivedtime), attached file(s) are: (if any)"
$email.attachments | %{Write-Output $_.filename}

# If the email has at least one attachment, save them to the filepath.
if ($email.attachments.count -gt 0) {
    $email.attachments | %{$_.saveasfile((join-path $filepath $_.filename))} 
} else { 
    Write-Output "Latest email at $($email.receivedtime) has no attachments!"
}

【问题讨论】:

    标签: powershell outlook etl


    【解决方案1】:

    听起来你需要一个

    $a.Store | ?{$_.DisplayName -eq $account} | %{If($_.IsCachedExchange){Start-Job {$n.SendAndReceive($false)}|Wait-Job}}
    

    在那里确保如果它处于缓存模式,它将在检查电子邮件之前发送和接收。请参阅下面的编辑说明。

    您可能还想确保用户没有处于离线模式:

    If($n.offline){write-host "You must be online before performing this script" -fore red;start-sleep 5;break}
    

    这样,如果用户处于离线模式,它会显示红色文本,说明他们需要处于在线模式,等待 5 秒,然后退出脚本。

    编辑:感谢 Adi Inbar,它会等待 Outlook 完成其发送和接收过程,然后再继续,以确保您在继续之前缓存了最新的电子邮件。谢谢阿迪,我不知道那个命令,它很方便!

    【讨论】:

    • 它认为这是解决方案,并且在调用 SendAndReceive 之前让脚本检查该帐户是否已缓存非常好。不过,我建议不要给它任意 10 秒的时间来完成它,而是通过管道发送到 Wait-Job: [...] if ($_.IsCachedExchange) {$n.SendAndReceive($false) | Wait-Job}}
    • @AdiInbar 老实说,我以前从未见过Wait-Job。将命令通过管道传递给它,powershell 会等待该命令完成,然后再继续执行脚本,真的那么简单吗?在我看来,您必须以 PSJob 的形式启动它才能与 Wait-Job 一起使用
    • 其实,没那么简单……我在注释的格式上遇到了问题(它无法识别我的代码跨度),并且编辑了很多次,最后我把一个关键的部分删掉了。 Wait-Job 将作业对象作为参数,因此您需要将命令作为作业启动。应该是:[...] if ($_.IsCachedExchange) {Start-Job {$n.SendAndReceive($false)} | Wait-Job}}.
    • +1 表示贡献。 Dmitry 指出我的 Outlook 内容驻留在 Exchange 服务器上 - 它不能在缓存模式下工作。当调度程序启动此脚本时,我的计算机始终被锁定(但未注销)。通常,作业运行时 Outlook 尚未在我的计算机上打开。是否相当于处于离线模式?是它没有收到最近的电子邮件的原因吗?毕竟,Outlook 是由脚本打开的,所以我认为这应该无关紧要。我还在 Outlook 关闭的情况下测试了脚本,它似乎可以工作 - 只是在被调度程序启动时无法正常工作。
    【解决方案2】:

    这是一个缓存的(而不是在线的)Exchange 存储吗?尝试关闭缓存。

    【讨论】:

    • +1 表示贡献。不,它是在线的。但是,我进入 Outlook 选项并更改了发送/接收设置,以便在 Outlook 离线时每 15 分钟安排一次自动发送/接收。我不确定这是否会有所帮助。我仍然想找到一种以编程方式执行此操作的方法,因为我希望任何人都能够通过调度程序启动此 PoSh 脚本,而无需更改其 Outlook 设置。
    • 您可以使用 Namespace.SendAndReceive 或 Namespace.SyncObjects 集合来启动同步,但这将是异步的。那么它是什么样的消息存储呢?如果是 Exchange,为什么需要发送/接收设置?消息由服务器而不是本地存储接收。如果您使用在线模式,这甚至都不存在。
    • 我的 Outlook/Exchange 词汇/知识非常有限,请多多包涵。它是一个 Exchange 消息存储。您是对的 - 当我查看服务器设置时,甚至无法选择“使用缓存 Exchange 模式”。我不/仍然不确定我看到的 Outlook 内容是如何存储的 - 你是说它们都驻留在服务器上吗?还是复制到我的电脑上?我注意到单击“发送/接收”有时确实会将新项目推送到我的收件箱。
    • 您的意思是“使用缓存交换模式”复选框未选中并禁用?如果未选中,则所有消息都存储在服务器上。如果选中,则邮件仍在服务器上,但 Outlook 使用 Exchange 存储提供程序定期与服务器同步的本地存储 (OST)。您的个人资料中是否还有 POP3/SMTP 帐户?
    • 是的,它未被选中并被禁用。我的个人资料中没有 POP3/SMTP 帐户。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 2018-07-13
    • 2010-09-25
    • 1970-01-01
    相关资源
    最近更新 更多