2008-12-04 171 views
0

我正在开发一个涉及创建电子邮件联系人并将邮件转发给该联系人的脚本。脚本的最后部分是自动发送测试邮件到地址以确保转发工作。PowerShell 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("[email protected]") 
$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,这样邮件就会显示在“已发送邮件”文件夹中。

回答

0

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

+0

我写的东西被隐式授权在网络上。其他人写的东西需要经过一个大的批准过程。这不是为了整体的需要,而是把过去5分钟的工作变成30秒的任务。另外,我不知道SMTP服务器。 – Orihara 2008-12-05 01:01:13

1

我有类似的问题,一些COM对象似乎并没有完全填充(似乎与公司的Outlook设置有关 - 也许是反病毒措施?)。但是,如果您注释掉$msg.Recipients.Add("[email protected]")行并添加了$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(‘[email protected]’, {$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("[email protected]") 
$msg.SendAndSaveCopy() 

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

如果你不需要的项目进行(例如添加自己作为收件人)它可能是更容易,只需使用发送-MAILMESSAGE使用“NT AUTHORITY \匿名登录”保存已发送项文件夹:

$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得到了这个技巧。