2017-01-20 7 views
0

У меня есть сценарий PowerShell, который генерирует сообщения электронной почты из списка контактов, импортируемых из CSV файла:Send-MailMessage возвращает 4.4.1 тайм-аут подключения через каждые 10 минут

# Get Credential 
$Credential = & "C:\Powershell Scripts\Windows\Get-CredentialFromWindowsCredentialManager.ps1" ms.outlook.15:[email protected] 

# Get Contacts 
$contacts = Import-Csv -Path "C:\Powershell Scripts\Email\Contacts.csv" 

# Compose Email for each contact 
foreach($contact in $contacts) 
{ 
    Write-Output "Creating email for: $($contact.FirstName) $($contact.LastName)" 
    $To = "$($contact.FirstName) $($contact.LastName) <$($contact.Email)>" 
    $From = "My Email <[email protected]>" 
    $Subject = "$($contact.FirstName), I have a suggestion for you!" 
    $Body = "<html></html>" 
    $SMTPServer = "smtp.office365.com" 
    $Port = 587 
    Send-MailMessage -To $To -From $From -Subject $Subject -SmtpServer $SMTPServer -Credential $Credential -UseSsl -Body $Body -BodyAsHtml -Port $Port 

    # Due to the Message Send rate limit (30 per minute) I added this to slow the rate down 
    Start-Sleep -Seconds 10 
} 

Каждые 10 минут я получаю SMTP Исключение:

Send-MailMessage : Service not available, closing transmission channel. The 
server response was: 4.4.1 Connection timed out. Total session duration: 
00:10:08.3716645 
At C:\Powershell Scripts\Email\SendEmail.ps1:17 char:2 
+  Send-MailMessage -To $To -From $From -Subject $Subject -SmtpServer $SMTPServer ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (System.Net.Mail.SmtpClient:SmtpClient) [Send-MailMessage], SmtpException 
    + FullyQualifiedErrorId : SmtpException,Microsoft.PowerShell.Commands.SendMailMessage

Есть ли какие-либо настройки, которые я могу изменить или изменить в коде, что предотвратит это?

+0

Что вы [Исследования] (https://social.technet.microsoft.com/Forums/exchange/EN-US/46095334-d788-4b4e-b790-4336a4174c9c/PowerShell-sendmailmessage-тайм-аут-441-ошибка? форум = Exchange2010)? –

+0

Я только отправляю около 100-200 писем (хорошо под лимитом для плана Office 365 E1, описанного в следующей статье). https://technet.microsoft.com/en-us/library/exchange-online-limits.aspx – EdC

ответ

1

Не принимайте это лично, это всего лишь обычная написание, но у вас есть сценарий, который выполняет действие против ресурса, который вышел из-под контроля. Таким образом, вы не можете просто ожидать, что SMTP-соединение будет успешным, и задаться вопросом, что вы должны сделать, чтобы предотвратить его отказ. Глубокий вдох. Ответ заключается в рассмотрении крайних случаев и фактическом обслуживании их в вашем коде. Конечно, вы спали там до , попробуйте, чтобы не упасть с ограничения скорости, но это не надежное решение. В этом случае достаточно простого обработчика исключений для вызова Send-MailMessage. Вы можете включить несколько попыток и небольшие задержки сна.

А «максимальное количество допустимых отказов» порог может быть использовано, чтобы вырваться из цикла повторных попыток и вызвать какое-то внутреннее оповещение и т.д.

Короче говоря, не просто бросить спагетти на стене с закрытыми глазами.

</декламация >

пример, но не обязательно tidiest решение:

[Int32] $maxAttempts  = 5; 
[Int32] $failureDelay  = 2; 
[Int32] $interMessageDelay = 10; 
[Int32] $numAttempts  = 0; 
[Boolean] $messageSent  = $false; 

:CONTACT foreach ($contact in $contacts) { 
    $numAttempts = 1; 
    $messageSent = $false; 
    while (($numAttempts -le $maxAttempts) -and (! $messageSent)) { 
     try { 
      Write-Host -Object ('Sending message, attempt #{0} of #{1}...' -f $numAttempts, $maxAttempts); 
      Send-MailMessage <blah>; 
      Write-Host -Object "Ok.`n"; 
      $messageSent = $true; 
      } #try 
     catch [System.Exception] { 
      # ^^^^^ This exception type needs changing, but I don't know the full 
      # type of your failure. 
      Write-Host -Object 'Failed.'; 
      if ($numAttempts -ge $maxAttempts) { 
       Write-Host -Object "ERROR : Maximum attempts reached - aborting.`n"; 
       continue CONTACT; 
      } else { 
       Write-Host -Object ('Sleeping for {0} second(s)...' -f $failureDelay); 
       Start-Sleep -Seconds $failureDelay; 
       $numAttempts++; 
      } #else-if 
      } #catch 
     } #while 
    Write-Host -Object ('Sleeping for {0} second(s)...' -f $interMessageDelay); 
    Start-Sleep -Seconds $interMessageDelay; 
    } #foreach