2008-12-04 4 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, посмотрите на расширения сообщества PowerShell (бесплатно) на CodePlex. Они предлагают командлет для отправки электронной почты 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, (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() 

Это работало очень хорошо и сохранили сообщение в мой послал папку.

Если вам не нужен элемент, который будет сохранен в папке посланные-пунктов (например, добавление себя в качестве получателя) это, вероятно, проще всего использовать 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 

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

Смежные вопросы