PowerShell Outlook发送电子邮件

时间:2008-12-04 23:35:33

标签: .net powershell interop outlook

我正在开发一个脚本,涉及创建电子邮件联系人并将邮件转发给该联系人。该脚本的最后一部分是自动向该地址发送测试电子邮件,以确保转发有效。

所以我使用以下代码:

[void] [Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Core")
[void] [Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Interop.Outlook")

$olApp = New-Object Microsoft.Office.Interop.Outlook.ApplicationClass
$msg = $olApp.CreateItem(0)
$msg.Recipients.Add("me@example.com")  
$msg.Subject = "test"  
$msg.Body = "test"  
$msg.Send()

我在第6行收到错误:"You cannot call a method on a null-valued expression."

我在家里运行代码,它运行得很好。区别:在工作中的域,在工作中使用Exchange Server,在工作中使用域帐户。

我在两台机器上使用相同版本的Powershell和Outlook。最好使用Outlook发送邮件,因为我已经打开了Outlook,这样邮件就会显示在我的已发送邮件文件夹中。

2 个答案:

答案 0 :(得分:1)

我遇到类似的问题,其中一些COM对象似乎没有完全填充(似乎与公司的Outlook设置有关 - 也许是防病毒措施?)。但是,如果您注释掉$msg.Recipients.Add("me@example.com")行并添加了$msg.Display(),则可以添加收件人并从中发送。不是一个很好的解决方案。

对于我的问题,我被指向Exchange Web服务(EWS),因此我下载了EWS API 2.2并使用了以下内容:

Add-Type -LiteralPath "C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll"
$service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService -ArgumentList Exchange2010_SP1
$service.AutodiscoverUrl(‘me@mydomain.com’, {$true})

$msg = New-Object Microsoft.Exchange.WebServices.Data.EmailMessage($service)
$msg.Subject = "Sent from Powershell EWS"
$msg.Body = "<html><body><h1>TESTING</h1><p>This is a test message sent from Powershell!</p></body></html>"
$msg.ToRecipients.Add("me@mydomain.com")
$msg.SendAndSaveCopy()

这似乎工作得很好,并将消息保存到我发送的文件夹中。

如果您不需要将项目保存在sent-items文件夹中(例如将自己添加为收件人),则使用&#34; NT AUTHORITY \ ANONYMOUS LOGON&#34可能更容易使用Send-MailMessage ;:

$emptySecStr = New-Object System.Security.SecureString
$creds = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "NT AUTHORITY\ANONYMOUS LOGON", $emptySecStr
Send-MailMessage -SmtpServer $smtpServerName -Credential $creds -From $sendingAddr -to $sendToArray -Cc $sendCCArray -BodyAsHtml -body $htmlBody -Subject $subject

我从一次精彩的讨论中得到了这种技巧here

答案 1 :(得分:0)

如果您改变主意使用Outlook,请查看CodePlex上的PowerShell社区扩展(免费)。它们提供了一个cmdlet来发送SMTP电子邮件,这足以测试新创建的地址。不确定在您的已发送邮件中进行测试是否有价值?特别是如果你批量使用它们 - 直接使用SMTP比使用Outlook要快得多。