Powershell send-mailmessage для чтения 17k писем из csv и отправки 100 пользователям в каждом письме - PullRequest
0 голосов
/ 28 сентября 2019

Я создаю сценарий PS для автоматизации рассылки почты 17k пользователям.Наш базовый уровень безопасности обмена настроен на прием только 60 запросов в минуту.Поскольку я перебираю список рассылки (CSV) построчно (сон 1 сек), мой сценарий занял несколько часов.То, чего я сейчас пытаюсь добиться, - это отправить электронное письмо 100 пользователям за запрос.Я выясняю, как хранить электронные письма в массиве из 100 и отправлять почту, прежде чем перейти к следующим 100. Любое предложение?

$recipients = Get-Content "mailinglist.csv"

foreach($rcpt in $recipients)
{
    Write-Host "Attempt sending email to $rcpt ..."  
    Send-MailMessage -ErrorAction SilentlyContinue -ErrorVariable SendError -From $From -to $rcpt -Subject $Subject -SmtpServer $SMTPServer -port $SMTPPort -UseSsl -Credential $Cred -BodyAsHtml ($Body -f $Subject, $Date, $Venue, $Description, $Image)
    $ErrorMessage = $SendError.exception.message
                If($ErrorMessage)
            {
                Write-Host "Failure - $ErrorMessage" -ForegroundColor Red
                Start-Sleep -Seconds 60
                Send-MailMessage -ErrorAction SilentlyContinue -ErrorVariable SendError -From $From -to $rcpt -Subject $Subject -SmtpServer $SMTPServer -port $SMTPPort -UseSsl -Credential $Cred -BodyAsHtml ($Body -f $Subject, $Date, $Venue, $Description, $Image)
                }
                ElseIf($SendError.exception.message -eq $null)
                {
                    Write-Host "Email has been sent to $rcpt" -ForegroundColor Green
                    Start-Sleep -Seconds 1
                    $n++
                }

}

Write-Host "Total sent = $n"

1 Ответ

1 голос
/ 28 сентября 2019

Вы можете использовать традиционный цикл for и получить доступ к элементам массива по индексу.

$recipients = Get-Content "mailinglist.csv"
$To = <SomeValidEmailAddress>
$LastIndex = $recipients.GetUpperBound(0)
for ($i = 0; $i -le $LastIndex; $i+=100) {
    $upperRange = [Math]::Min(($i+99),$LastIndex)
    $Params = @{
       ErrorAction = 'SilentlyContinue'
       ErrorVariable = 'SendError'
       Bcc = $recipients[$i..$upperRange]
       To = $To
       From = $From
       Subject = $Subject
       SmtpServer = $SMTPServer
       Port  = $SMTPPort
       Credential $Cred
       Body = $Body -f $Subject, $Date, $Venue, $Description, $Image
       BodyAsHTML = $true
       UseSsl = $true
   }
    "Attempt sending email to $($recipients[$i..$upperRange]) ..."  # You may want to alter this to be more readable
    Send-MailMessage @Params
    # Other code
}

Объяснение:

Я решил использовать Splatting здесь для удобочитаемости и управляемости с хэш-таблицей $Params.Это совершенно необязательно.

Параметр -bcc для Send-MailMessage поддерживает строковый массив (string[]).Использование этого параметра -To сохранит конфиденциальность получателей.После этого вы можете легко отправить электронное письмо нескольким получателям, если передадите ему массив. Однако для работы Send-Mailmessage требуется -To .Рекомендуется, чтобы адрес электронной почты передавался в -To что-то, что может быть рассмотрено спамом или способам обработки этих типов электронных писем.Я установил переменную $To, чтобы вы указали этот адрес электронной почты.Если конфиденциальность не имеет значения, -Bcc можно просто заменить на -To.

Поскольку $recipients является массивом, вы можете обращаться к его элементам по индексу, который поддерживает оператор диапазона ..,$recipients[0..99] будет первыми 100 элементами в списке.

$LastIndex хранит последний индекс списка, который является значением, возвращаемым методом Array.GetUpperBound (Int32) с размером 0.Поскольку массив одномерный, 0 является единственным измерением.

$upperRange является начальным индексом ($i) плюс 99. Если $upperRange когда-либо будет больше $LastIndex, онбудет установлен на $LastIndex.В зависимости от версии PowerShell, сравнение $i+99 и $LastIndex может быть необязательным.Доступ к верхнему диапазону за пределами размера массива просто вернет все оставшиеся элементы массива без выдачи ошибки.Это скорее всего для полноты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...