PowerShell Outlook отправлять электронную почту - PullRequest
0 голосов
/ 05 декабря 2008

Я разрабатываю сценарий, который включает создание контакта электронной почты и пересылку почты этому контакту. Последняя часть сценария - автоматическая отправка тестового электронного письма на адрес, чтобы убедиться, что переадресация работает.

Поэтому я использую следующий код:

[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 ]

1 голос
/ 23 июля 2016

У меня были похожие проблемы, когда некоторые из COM-объектов, кажется, не заполняются полностью (похоже, что-то связано с настройкой корпоративного Outlook - возможно, антивирусные меры?). Однако, если вы закомментируете строку $msg.Recipients.Add("me@example.com") и добавите $msg.Display(), вы можете добавить получателей и отправить их оттуда. Не очень хорошее решение.

На мой вопрос меня направили в сторону веб-службы Exchange (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()

Похоже, это работало довольно хорошо и сохранило сообщение в моей отправленной папке.

Если вам не нужно сохранять элемент в папке отправляемых элементов (например, добавляя себя в качестве получателя), вероятно, проще использовать Send-MailMessage с помощью «NT AUTHORITY \ ANONYMOUS LOGON»:

$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

Я получил эту технику из большого обсуждения здесь .

0 голосов
/ 05 декабря 2008

Если вы передумали по поводу использования Outlook, посмотрите на Расширения сообщества PowerShell (бесплатно) в CodePlex. Они предлагают командлет для отправки электронной почты SMTP, который будет достаточен для проверки вновь созданного адреса. Не уверены, имеет ли смысл иметь тест в отправленных элементах? Особенно, если вы делаете это навалом - гораздо быстрее использовать SMTP напрямую, чем использовать Outlook.

...