Powershell отправка почты с авторизацией через SMTP сервер Яндекса

Powershell отправка почты с авторизацией через SMTP сервер Яндекса

Powershell отправка почты с авторизацией через SMTP сервер Яндекса

Доброго времени суток друзья. Хочу поделиться с Вами не большим скриптом на powershell отправки сообщения на внешнюю почту с авторизацией на примере smtp.yandex.ru

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

Класс System.Net.Mail.MailMessage

Конструкторы
  Имя Описание
method MailMessage() Инициализирует пустой экземпляр класса MailMessage.
method MailMessage(MailAddress, MailAddress) Инициализирует новый экземпляр класса MailMessage, используя указанные объекты класса MailAddress.
method MailMessage(String, String) Инициализирует новый экземпляр класса MailMessage, используя указанные объекты класса String.
method MailMessage(String, String, String, String) Инициализирует новый экземпляр класса MailMessage
Свойства
  Имя Описание
method AlternateViews Возвращает коллекцию вложений, используемую для хранения альтернативных форм тела сообщения.
method Attachments Возвращает коллекцию вложений, используемую для хранения данных, вложенных в это сообщение электронной почты.
method Bcc Возвращает коллекцию адресов, содержащую получателей скрытой копии (BCC) данного сообщения электронной почты.
method Body Получает или задает основную часть сообщения.
method BodyEncoding Получает или задает кодировку, используемую для кодирования тела сообщения.
method BodyTransferEncoding Получает или задает кодирование передачи, используемое для кодирования тела сообщения.
method CC Возвращает коллекцию адресов, содержащую получателей копии (CC) данного сообщения электронной почты.
method DeliveryNotificationOptions Получает или задает уведомления о доставке данного сообщения электронной почты.
method From Получает или задает адрес отправителя данного сообщения электронной почты.
method Headers Возвращает заголовки электронной почты, передаваемые с данным сообщением.
method HeadersEncoding Получает или задает кодировку, используемую для пользовательских заголовков данного сообщения электронной почты.
method IsBodyHtml Получает или задает значение, показывающее, имеет ли основная часть почтового сообщения формат HTML.
method Priority Получает или задает приоритет данного сообщения электронной почты.
method ReplyTo Устаревшее. Получает или задает адрес ReplyTo для данного почтового сообщения.
method ReplyToList Получает или задает список адресов для ответа для данного сообщения электронной почты.
method Sender Получает или задает адрес отправителя данного сообщения электронной почты.
method Subject Получает или задает строку темы для данного сообщения электронной почты.
method SubjectEncoding Получает или задает кодировку, используемую для темы данного сообщения электронной почты.
method To Возвращает коллекцию адресов, содержащую получателей данного сообщения электронной почты.
Методы
  Имя Описание
method Dispose() Освобождает все ресурсы, используемые объектом MailMessage.
method Dispose(Boolean) Освобождает неуправляемые ресурсы, используемые объектом MailMessage, а при необходимости освобождает также управляемые ресурсы.
method Equals(Object) Определяет, равен ли заданный объект текущему объекту. (Унаследовано от Object.)Finalize
method Finalize Позволяет объекту попытаться освободить ресурсы и выполнить другие операции по очистке перед тем, как объект будет утилизирован сборщиком мусора. (Унаследовано от Object.)
method GetHashCode Играет роль хэш-функции для определённого типа. (Унаследовано от Object.)
method GetType Возвращает объект класса Type для текущего экземпляра. (Унаследовано от Object.)
method MemberwiseClone Создает "поверхностную" копию текущего объекта. (Унаследовано от Object.)
method ToString Возвращает строковое представление текущего объекта. (Унаследовано от Object.)

Класс Net.Mail.SmtpClient

Конструкторы
  Имя Описание
method SmtpClient() Инициализирует новый экземпляр класса SmtpClient, используя параметры файла конфигурации.
method SmtpClient(String) Инициализирует новый экземпляр класса SmtpClient, который отправляет электронную почту с помощью указанного сервера SMTP.
method SmtpClient(String, Int32) Инициализирует новый экземпляр класса SmtpClient, который отправляет электронную почту с помощью указанного сервера SMTP и порта.
Свойства
  Имя Описание
method AlternateViews Возвращает коллекцию вложений, используемую для хранения альтернативных форм тела сообщения.
method ClientCertificates Указывает, какие сертификаты следует использовать для установки SSL-подключения.
method Credentials Возвращает или задает учетные данные, используемые для проверки подлинности отправителя.
method DeliveryFormat Получает или задает формат доставки, используемый SmtpClient для отправки электронной почты.
method DeliveryMethod Указывает, как будут обрабатываться исходящие сообщения электронной почты.
method EnableSsl Указывает, использует ли SmtpClient протокол SSL для шифрования подключения.
method Host Возвращает или задает имя или IP-адрес хоста, используемого для SMTP-транзакций.
method PickupDirectoryLocation Возвращает или задает папку, в которой приложения сохраняют почтовые сообщения для обработки локальным SMTP-сервером.
method Port Возвращает или задает порт, используемый для SMTP-транзакций.
method ServicePoint Возвращает сетевое подключение, используемое для передачи сообщения электронной почты.
method TargetName Получает или задает имя поставщика услуг (SPN) для проверки подлинности при использовании расширенной защиты.
method Timeout Возвращает или задает значение, указывающее промежуток времени, после которого для синхронного вызова Send истечет время тайм-аута.
method UseDefaultCredentials Возвращает или задает значение Boolean, которое управляет отправкой учетных данных DefaultCredentials вместе с запросами.
Методы
  Имя Описание
method Dispose() Отправляет сообщение QUIT на SMTP-сервер, правильно завершает TCP-подключение и освобождает все ресурсы, используемые текущим экземпляром класса SmtpClient.
method Dispose(Boolean) Отправляет сообщение QUIT на SMTP-сервер, правильно завершает TCP-подключение и освобождает все ресурсы, используемые текущим экземпляром класса SmtpClient, и при необходимости освобождает управляемые ресурсы.
method Equals(Object) Определяет, равен ли заданный объект текущему объекту. (Унаследовано от Object.)
method Finalize Позволяет объекту попытаться освободить ресурсы и выполнить другие операции по очистке перед тем, как объект будет утилизирован сборщиком мусора. (Унаследовано от Object.)
method GetHashCode Играет роль хэш-функции для определённого типа. (Унаследовано от Object.)
method GetType Возвращает объект класса Type для текущего экземпляра. (Унаследовано от Object.)
method MemberwiseClone Создает "поверхностную" копию текущего объекта. (Унаследовано от Object.)
method OnSendCompleted Создает событие SendCompleted.
method Send(MailMessage) Отправляет указанное сообщение на сервер SMTP для доставки.
method Send(String, String, String, String) Отправляет указанное сообщение электронной почты на сервер SMTP для доставки. Отправитель, получатели, тема и основная часть сообщения указываются с помощью объектов String.
method SendAsync(MailMessage, Object) Отправляет указанное сообщение электронной почты на сервер SMTP для доставки. Этот метод не блокирует вызывающий поток и позволяет вызывающей стороне передать объект в метод, вызванный после завершения операции.
method SendAsync(String, String, String, String, Object) Отправляет сообщение электронной почты на сервер SMTP для доставки. Отправитель, получатели, тема и основная часть сообщения указываются с помощью объектов String. Этот метод не блокирует вызывающий поток и позволяет вызывающей стороне передать объект в метод, вызванный после завершения операции.
method SendAsyncCancel Отменяет асинхронную операцию отправки сообщения электронной почты.
method SendMailAsync(MailMessage) Отправляет указанное сообщение SMTP-серверу для доставки в качестве асинхронной операции.
method SendMailAsync(String, String, String, String) Отправляет указанное сообщение SMTP-серверу для доставки в качестве асинхронной операции. . Отправитель, получатели, тема и основная часть сообщения указываются с помощью объектов String.
method ToString Возвращает строковое представление текущего объекта. (Унаследовано от Object.)
События
  Имя Описание
method SendCompleted Происходит после завершения асинхронной операции по отправке электронной почты.

Листинг скрипта отправики письма


#Адрес сервера SMTP для отправки
$serverSmtp = "smtp.yandex.ru" 

#Порт сервера
$port = 587

#От кого
$From = "login@yandex.ru" 

#Кому
$To = "myMail@mail.ru" 

#Тема письма
$subject = "Письмо с вложением"

#Логин и пароль от ящики с которого отправляете login@yandex.ru
$user = "login"
$pass = "12345678"

#Путь до файла 
$file = "C:\arhive.zip"

#Создаем два экземпляра класса
$att = New-object Net.Mail.Attachment($file)
$mes = New-Object System.Net.Mail.MailMessage

#Формируем данные для отправки
$mes.From = $from
$mes.To.Add($to) 
$mes.Subject = $subject 
$mes.IsBodyHTML = $true 
$mes.Body = "<h1>Тестовое письмо</h1>"

#Добавляем файл
$mes.Attachments.Add($att) 

#Создаем экземпляр класса подключения к SMTP серверу 
$smtp = New-Object Net.Mail.SmtpClient($serverSmtp, $port)

#Сервер использует SSL 
$smtp.EnableSSL = $true 

#Создаем экземпляр класса для авторизации на сервере яндекса
$smtp.Credentials = New-Object System.Net.NetworkCredential($user, $pass);

#Отправляем письмо, освобождаем память
$smtp.Send($mes) 
$att.Dispose()

Поддержи проект:

No-name
MAXX
Спустя год использования перестал работать дааный скрипт. Ошибка: Исключение при вызове "Send" с "1" аргументами: "Неправильная последовательност ь команд. Отклик сервера: 5.5.4 Error: send AUTH command first. работало с переменной $user = "login" вариант  $user = "login@domain.ru" так же пробовал

21/01/2024 13:13:53

Админ
Админ

Добрый день!

Проблема кроется в безопасности почты если вы используете пупличные сервисы (yandex, mail и т.д.). Вам нужно разрешить доступ внешним программам, а также создать пароль для приложения. https://yandex.ru/support/mail/mail-clients/others.html

07/02/2024 12:08:21

No-name
Jimmik
Как включить кодировку? пробую вот так [ps]$mes.BodyEncoding = [System.Text.Encoding]::UTF8[/ps] но это не работает

15/04/2022 13:06:21

Админ
Админ

Доброго времени суток.

BodyEncoding - Получает или задает кодировку, используемую для кодирования тела сообщения.
BodyTransferEncoding - Получает или задает кодирование передачи, используемое для кодирования тела сообщения.
HeadersEncoding - Получает или задает кодировку, используемую для пользовательских заголовков данного сообщения электронной почты.
SubjectEncoding - Получает или задает кодировку, используемую для темы данного сообщения электронной почты.

Попробуйте использовать данные свойства. Проверьте заголвки которые приходят вам в письме.

15/04/2022 14:23:55

No-name
Dmitry
PS C:\Windows\system32> $From = "username@yandex.ru" PS C:\Windows\system32> $To = "username@yandex.ru" PS C:\Windows\system32> $SMTPServer = "smtp.yandex.ru" PS C:\Windows\system32> $SMTPPort = "587" PS C:\Windows\system32> $Username = "username@yandex.ru" PS C:\Windows\system32> $Password = "sadfsafdasfd" PS C:\Windows\system32> $subject = "hello" PS C:\Windows\system32> $body = "bodytext" PS C:\Windows\system32> PS C:\Windows\system32> #формируем сообщение в формате html: PS C:\Windows\system32> $message = New-Object System.Net.Mail.MailMessage $From, $To PS C:\Windows\system32> $message.Subject = $subject PS C:\Windows\system32> $message.IsBodyHTML = $true PS C:\Windows\system32> $message.Body = $body PS C:\Windows\system32> PS C:\Windows\system32> #Отправляем: PS C:\Windows\system32> $smtp = New-Object System.Net.Mail.SmtpClient($SMTPServer, $SMTPPort) PS C:\Windows\system32> $smtp.EnableSSL = $true PS C:\Windows\system32> $smtp.Credentials = New-Object System.Net.NetworkCredential($Username, $Password) PS C:\Windows\system32> $smtp.Send($message) Исключение при вызове "Send" с "1" аргументами: "Неправильная последовательность команд. Отклик сервера: 5.5.4 Error: s end AUTH command first." строка:1 знак:1 + $smtp.Send($message) + ~~~~~~~~~~~~~~~~~~~~     + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException     + FullyQualifiedErrorId : SmtpException

20/11/2021 20:50:14

Админ
Админ

Доброго времени суток!

Скопируйте код из статьи в редактор PowerShell ISE и уже из него пробуйде отправлять письмо, а не из консоли. 

Или сохраните скрипт в файл и тогда вызывайте через консоль.

20/11/2021 20:59:15

No-name
dmPAMI
Огромное Спасибо! 

16/04/2019 10:37:44

Администратор
Администратор

Не за что )

16/04/2019 10:47:27

No-name
imapsenr
Если вы делаете рассылку на несколько почтовых адресов, то не советую использовать данный метод.


#Входящие данные сообщения:$From = "elimsmail@gmail.com"
$To = "test@gmail.com"
$SMTPServer = "smtp.gmail.com"
$SMTPPort = "587"
$Username = "elimsmail"
$Password = "yourpassword"
$subject = "hello"
$body = "bodytext"

#формируем сообщение в формате html:
$message = New-Object System.Net.Mail.MailMessage $From, $To
$message.Subject = $subject
$message.IsBodyHTML = $true
$message.Body = $body

#Отправляем:
$smtp = New-Object System.Net.Mail.SmtpClient($SMTPServer, $SMTPPort)
$smtp.EnableSSL = $true
$smtp.Credentials = New-Object System.Net.NetworkCredential($Username, $Password)
$smtp.Send($message)

Данный скрипт, не добавляет 1000 адресов в рассылку, а отправляет каждому сове сообщение.

08/10/2018 16:30:25

Администрация
Администрация

Добрый день.

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

Учтите тот момент, что письма уходят через SMTP стороннего сервера, в моем примере Yandex.ru так вот, если вы попытаетесь сразу отправить 1000 писем, то вас забанят!

17/11/2018 12:40:48

No-name
smtpsenr
Исключение при вызове "Send" с "1" аргументами: "Неправильная последовательность команд. Отклик сервера: 5.5.4 Error: send AUTH command first."

15/03/2016 14:49:28

Администрация
Администрация

Столкнулся с такой проблемой, дело в том, что в переменной $user = "login" нужно указывать явный домен почты, если вы используете бизнес почту от яндекса. $user = "login@domain.ru"

02/08/2016 15:31:17


Copyright © 2014 - 2024 All rights reserved.