Автоматизированная электронная почта Powershell

новичок на форуме, так что извиняюсь, если не по адресу.

Я хочу создать сценарий powershell, который отправляет по электронной почте файл списка (.txt), состоящий из 200 электронных писем, текстовый файл также будет обновлен новыми адресами электронной почты. Тело электронной почты, которое будет отправлено, является стандартным (общим) электронным письмом, ничего конкретного для каждого адреса электронной почты.

Это возможно?

Это сценарий, который у меня есть до сих пор, но он не отправляет электронное письмо.

$emails = @() 
      ForEach ($recipient in Get-Content "\\FILE Location")

      {
        $emails += "$recipient"
      }

$to = "TO EMAIL"
$smtp = "SMTP Server"
$from = "FROM EMAIL"
$subject = "Subject" 
$body = "EMAIL BODY"
send-MailMessage -SmtpServer $smtp -To $to -Bcc $emails -From $from -Subject $subject -Body $body -BodyAsHtml -Priority high

Заранее спасибо, Мэтт.


person MattG    schedule 03.09.2017    source источник
comment
Добро пожаловать в StackOverflow. Как правило, вы получите лучшую помощь, если у вас есть конкретная проблема с кодом, которую вам нужно решить, и у вас есть какой-то написанный вами код, который вы изо всех сил пытаетесь заставить работать. Взгляните на страницы справки/начала работы и руководство «Как задать хороший вопрос». Что касается вашего вопроса, вы хотите посмотреть на объединение Get-Content с Send-MailMessage.   -  person Mark Wragg    schedule 03.09.2017
comment
Возможный дубликат Powershell send-mailmessage — электронная почта нескольким получателям   -  person    schedule 03.09.2017
comment
Это то, что у меня есть до сих пор... ОТ ПОЧТЫ $subject = Тема $body = ТЕЛО ПОЧТЫ send-MailMessage -SmtpServer $smtp -To $to -Bcc $emails -From $from -Subject $subject -Body $body -BodyAsHtml -Высокий приоритет   -  person MattG    schedule 03.09.2017
comment
Вы должны отредактировать свой вопрос, чтобы включить это (вы должны увидеть ссылку для редактирования выше), а не помещать его в комментарий, где его трудно прочитать.   -  person Mark Wragg    schedule 03.09.2017
comment
Извиняюсь, я добавил это к исходному вопросу. Спасибо.   -  person MattG    schedule 03.09.2017
comment
@MattGeva вы получаете сообщение об ошибке при запуске команды или она просто не поступает в почтовые ящики?   -  person colsw    schedule 03.09.2017
comment
@ConnorLSW Никаких ошибок, просто не приходит в почтовые ящики.   -  person MattG    schedule 03.09.2017
comment
@MattGeva, вы видите это в своих журналах отслеживания Exchange? командлет обычно довольно хорошо выдает ошибки в вещах, которые он не может передать на SMTP-сервер.   -  person colsw    schedule 03.09.2017
comment
@ConnorLSW Ничего не отображается в журнале отслеживания обмена ... электронные письма с .txt нужно ли их вводить каким-то образом? (У меня каждое письмо на отдельной строке).   -  person MattG    schedule 03.09.2017
comment
Попробуйте это: send-MailMessage -SmtpServer $smtp -To $to -Bcc (Get-Content "\\FILE Location") -From $from -Subject $subject -Body $body -BodyAsHtml -Priority high. Мне просто интересно, вызывает ли проблема ForEach, а не то, что должно, но вы можете обойтись без него. Убедились ли вы, что можете отправить одно электронное письмо на свой адрес электронной почты с другими указанными вами настройками? Вы уверены, что там, где вы работаете, это может получить доступ к SMTP-серверу и разрешено ретранслировать через него с указанным адресом отправителя?   -  person Mark Wragg    schedule 03.09.2017
comment
@ConnorLSW У нас есть много других smtp-сообщений, которые отправляются, поэтому я не думаю, что проблема будет в SMTP-сервере. Зачем мне указывать -attachments? так как я не хочу ничего прикреплять к электронной почте, которая выходит.   -  person MattG    schedule 03.09.2017
comment
@MarkWragg Я могу отправить электронное письмо на внутренние и внешние адреса электронной почты с одинаковыми указанными настройками. Только когда я добавляю в раздел, который ищет текстовый файл, он не поступает в почтовый ящик.   -  person MattG    schedule 03.09.2017
comment
Вы пробовали это со встроенным get-content, как я показал?   -  person Mark Wragg    schedule 03.09.2017
comment
@MarkWragg при встроенной попытке я получаю следующую ошибку: send-mailmessage: невозможно прочитать данные из транспортного соединения   -  person MattG    schedule 03.09.2017
comment
@MarkWragg Я получаю указанную выше ошибку только при отправке в список из более чем 200 адресов электронной почты - я протестировал использование другого файла .txt с некоторыми тестовыми электронными письмами, и почта отправляется нормально.   -  person MattG    schedule 03.09.2017
comment
Тогда это твой ответ. Возможно, он открывает новый сокет для каждого получателя, и вы страдаете от нехватки портов. Вы можете написать сценарий, который читает ваш текстовый файл несколькими небольшими партиями.   -  person Mark Wragg    schedule 03.09.2017
comment
Спасибо @MarkWragg - есть ли какие-нибудь советы по скрипту для чтения текстового файла небольшими партиями?   -  person MattG    schedule 03.09.2017
comment
Откройте новый вопрос с этим в качестве темы, и я отправлю его как ответ (этот вопрос сейчас заблокирован, потому что он был отложен ранее, когда он был слишком широким).   -  person Mark Wragg    schedule 03.09.2017


Ответы (1)


В таких ситуациях может быть лучше создать объекты самостоятельно. Я бы настроил так:

$smtpServer = "SMTP Server"
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$smtpCredentialsUsername = "[email protected]"
$smtpCredentialsPassword = ConvertTo-SecureString -String $smtpPwd -AsPlainText -Force

$Credentials = New-Object –TypeName System.Management.Automation.PSCredential –ArgumentList 
$smtpCredentialsUsername, $smtpCredentialsPassword
$smtp.Credentials = $Credentials

$msg = new-object Net.Mail.MailMessage
$msg.Body = $body
$msg.Subject = $subject
$msg.From = $from
$msg.To.ADD($to)
$msg.IsBodyHtml = $true


ForEach ($recipient in Get-Content "\\FILE Location")
  {
    $msg.Bcc.ADD($recipient)
  }

$smtp.Send($msg)

$msg.Dispose();
person John Donnelly    schedule 04.09.2017