2013-07-11 7 views
1

Когда я пишу следующий сценарий в командной строке powershell один за другим, он успешно отправляет электронное письмо, но при запуске скрипта он возвращает кучу ошибок. Я предполагаю, что что-то синтаксически нужно изменить, чтобы запустить его как скрипт? Есть идеи?Отправлять электронную почту Outlook из сценария powershell

Start-Process Outlook 

$o = New-Object -com Outlook.Application 


$mail = $o.CreateItem(0) 

#2 = high importance email header 
$mail.importance = 2 

$mail.subject = “Auto Build Test“ 

$mail.body = “This is a test“ 

#for multiple email, use semi-colon ; to separate 
$mail.To = “[email protected]" 
$mail.Send() 

# $o.Quit() 

ответ

0

Синтаксис не изменяется между командной строкой и файлом сценария. Какие изменения происходят, как быстро выполняются команды. Если вы их вводите, между каждой командой будет много задержки. Но если они запускаются из сценария, они быстрее представлены в Outlook.

Простой способ исправить это - добавить Sleep 1 (или аналогичный) перед командой, которая терпит неудачу. Не видя вывода ошибки, я бы предположил, что вы хотите спать после CreateItem и, возможно, перед отправкой. Но если вы внимательно посмотрите на сообщения об ошибках, вы увидите, что они идентифицируют, какая строка сценария не удалась. Положите Sleep перед первой неудачной строкой. Повторите сценарий. Если новая строка терпит неудачу, поставьте перед ней задержку. Если первая строка все еще не работает, вы можете попробовать Sleep 2. Вы также можете сделать Сон короче. В течение 1/2 секунды: Sleep -milliseconds 500.

IF add Sleeps устраняет проблемы - другими словами, проблема связана с синхронизацией, может быть что-то в объектной модели Outlook, которую вы могли бы использовать, это не было бы так же хаки, как использование Sleeps.


Я не смог воспроизвести это при установке Outlook 2010. Однако я просмотрел альтернативный метод отправки электронной почты с PS (ниже). Возможно, этот метод будет работать.

$i=$o.Session.folders.item(2).folders.item("Outbox").items.add(0) 
$i.to="[email protected]" 
$i.Subject="a wittle testy" 
$i.Body="some body" 
$i.send() 
+0

Хорошее предложение, но я не добавите Sleep 10 под каждую команду в конце концов, и до сих пор не повезло. Любые другие идеи? – user2554585

+1

Пожалуйста, разместите сообщения об ошибках, которые вы получаете, особенно первые несколько, но все будет лучше. –

0
Param(
[parameter(Mandatory=$true)] 
[alias("e")] 
[string]$RecipientEmailAddress 
) 

if($RecipientEmailAddress -notmatch "\b[A-Za-z0-9._%+-][email protected]") 
{ 
    Write-Output "the email address for the receipient of log reports is not a valid  email address, hence will not send the report via email. They can still be accessed at " |Out-String ; 
}else 
{ 
    $returnVal= New-Object PSObject ; 
    $returnVal |Add-Member -Name is_Success -MemberType NoteProperty -Value $null; 
    $returnVal |Add-Member -Name Explanation -MemberType NoteProperty -Value $null; 
    try{ 
      $Attachments =Get-ChildItem -Path "C:\FOLDERWHEREYOURAATACHMENTS ARESTORED"; 
      if($Attachments.count -eq 0) 
      { 
       $returnVal.Explanation="Error sending log report email to the user: $RecipientEmailAddress. Please check if the C:\FOLDERWHEREYOURAATACHMENTS is accessible and there are indeed log files present"; 
      #Write-Output "Error sending log report email to the user: $RecipientEmailAddress" |Out-String ; 
      #Write-Output "Please check if the C:\FOLDERWHEREYOURAATACHMENTS is accessible and there are indeed log files present "|Out-String; 
      $returnVal.is_Success= $false; 
      return $returnVal; 
     } 
     $TestedAttachmentsList = new-Object System.Collections.ArrayList; 
     for($i=0;$i -lt $Attachments.count;$i++) 
     { 
      $TestedAttachmentsList.add($Attachments[$i].FullName); 
     } 
     Send-MailMessage -From "<[email protected]>" -To "<$RecipientEmailAddress>" -SmtpServer "mail.BLAHH.com" -Attachments $TestedAttachmentsList -Subject "BLAHH SUBJECT" -Body "BLAHH BLAHH"; 
     $returnVal.is_Success=$true; 
     $returnVal.Explanation="An email has been sent to the $RecipientEmailAddress containing the log of the setup and configuration." 
     return $returnVal ; 
}Catch [System.Exception] 
    { 
     #Write-Output "Error sending log report email to the user: $RecipientEmailAddress" |Out-String ; 
     #Write-Output "Please check communication between your host machine and mail.BLAHH.com on port 25 is possible"|Out-String; 
     $returnVal.is_Success= $false; 
     $returnVal.Explanation="Error sending log report email to the user: $RecipientEmailAddress Please check communication between your host machine and mail.BLAHH.com on port 25 is possible"; 
     return $returnVal ; 
} 
} 
+0

Я написал этот скрипт slapdash ... для отправки писем с помощью powershell ... редактируйте, как вы хотите. Надеюсь, это поможет! –

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