Interactive authentication on the SMTP server
In the above example, the cmdlet would try to authenticate on the SMTP server with the credentials of the logged-in user. If this isn’t possible, you have to pass the PSCredential object to authenticate at the server (only if the server requires authentication).
The easiest way is to pass the username with the parameter -Credential. PowerShell will then open a dialog window where you can enter your credentials.
Send-MailMessage -to "recipient@contoso.com" -from "PowerShell <sender@contoso.com >" -Subject "Test" -body "Test for Send-MailMessage" -Credential "MailUser"
Interactive authentication at the SMTP server
After a successful authentication, the message will be sent.
Gmail, Hotmail, Outlook.COM, Office365 and Yahoo SMTP Server Settings¶
Gmail SMTP Server
Server | Port | SSL/TLS |
smtp.gmail.com | 25, 587 | TLS |
smtp.gmail.com | 465 | SSL |
Important
If you got authentication error, you need to enable Allowing less secure apps
or Sign in using App Passwords.
The Gmail IMAP and SMTP servers have been extended to support authorization via
the industry-standard OAuth 2.0 protocol. Using OAUTH protocol, user can do authentication
by Gmail Web OAuth instead of inputting user and password directly in application.
This way is more secure, but a little bit complex.
Hotmail/Outlook SMTP Server
If your account enabled two-factor authentication, you cannot login your account by normal user authentication, you should
use SMTP OAUTH or App Password.
You can generate App Passwords and use this app password instead of your user password.
Server | Port | SSL/TLS |
smtp.office365.com | 25, 587 | TLS |
Office365 SMTP Server
By default, Office 365 SMTP server uses 587 port and explicit SSL (TLS) connection.
If your account enabled two-factor authentication, you cannot login your account by normal user authentication, you should
use SMTP OAUTH or App Password.
You can and use this app password instead of your user password.
Server | Port | SSL/TLS |
smtp.office365.com | 25, 587 (recommended) | TLS |
Examples
Example 1: Send an email from one person to another person
The cmdlet uses the From parameter to specify the message’s sender. The
To parameter specifies the message’s recipient. The Subject parameter uses the text string
Test mail as the message because the optional Body parameter is not included.
Example 2: Send an attachment
The cmdlet uses the From parameter to specify the message’s sender. The
To parameter specifies the message’s recipients. The Subject parameter describes the content
of the message. The Body parameter is the content of the message.
Example 3: Send email to a mailing list
The Credential parameter specifies a domain administrator’s credentials are used to send the
message. The UseSsl parameter specifies that Secure Socket Layer (SSL) creates a secure
connection.
Send Email Using PowerShell – Easy Example
IMPORTANT: The values for all the parameters except Port should be replaced with actual values applicable for your case in order for this line of code to work.
- -To parameter value is the email address of the recipient
- -From parameter value is the email address of the sender
- -Subject parameter value is the email’s subject text
- -Body parameter value is the email’s content. This is simple text content and later we will see how we can send HTML content in email’s body text.
- -Credential parameter is the SMTP server user name and password credentials. Please look at the following subtopics in this article where I have explained the ways to pass the credentials. It is very important so pay attention to that.
- -SmtpServer parameter value is SMTP’s server address.
- -Port parameter value is the port number that SMTP listens for the email messages.
There are many more parameters of Send-MailMessage CmdLet that we will see in the following examples a little bit further down in this article.
Send Email from PowerShell using SMTP protocol¶
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
The Set-ExecutionPolicy cmdlet changes the user preference for the Windows PowerShell execution policy.
The execution policy is part of the security strategy of Windows PowerShell. It determines whether you can load configuration
files (including your Windows PowerShell profile) and run scripts. Because we need to run script locally, so we changed the policy to
RemoteSigned for current user.
- Restricted — No scripts can be run. Windows PowerShell can be used only in interactive mode.
- AllSigned — Only scripts signed by a trusted publisher can be run.
- RemoteSigned — Downloaded scripts must be signed by a trusted publisher before they can be run.
- Unrestricted — No restrictions; all Windows PowerShell scripts can be run.
Installation
EASendMail is a SMTP component which supports all operations of SMTP/ESMTP protocols
(RFC 821, RFC 822, RFC 2554). It also supports Exchange Web Service (EWS) and WebDAV
protocols. Before you can use the following example codes, you should download the
EASendMail Installer and install it
on your machine at first.
# please change the path to EASendMail Installation Path. ::LoadFile("C:\Program Files (x86)\EASendMail\Lib\net20\EASendMail.dll")
.NET Assembly
Because EASendMail has separate builds for .Net Framework, please refer to the following
table and choose the correct dll.
Separate builds of run-time assembly for .NET Framework 1.1, 2.0, 3.5, 4.0, 4.5, 4.6.1, .NET Core 2.1 and
.NET Compact Framework 2.0, 3.5.
File | .NET Framework Version |
Lib\net11\EASendMail.dll |
Built with .NET Framework 1.1
It requires .NET Framework 1.1, 2.0, 3.5 or later version. |
Lib\net20\EASendMail.dll |
Built with .NET Framework 2.0
It requires .NET Framework 2.0, 3.5 or later version. |
Lib\net35\EASendMail.dll |
Built with .NET Framework 3.5
It requires .NET Framework 3.5 or later version. |
Lib\net40\EASendMail.dll |
Built with .NET Framework 4.0
It requires .NET Framework 4.0 or later version. |
Lib\net45\EASendMail.dll |
Built with .NET Framework 4.5
It requires .NET Framework 4.5 or later version. |
Lib\net461\EASendMail.dll |
Built with .NET Framework 4.6.1
It requires .NET Framework 4.6.1 or later version. |
Lib\netcoreapp2.1\EASendMail.dll |
Built with .NET Core 2.1
It requires .NET Core 2.1 or later version. |
Lib\net20-cf\EASendMail.dll |
Built with .NET Compact Framework 2.0
It requires .NET Compact Framework 2.0, 3.5 or later version. |
Lib\net35-cf\EASendMail.dll |
Built with .NET Compact Framework 3.5
It requires .NET Compact Framework 3.5 or later version. |
How To Send SMTP email with authentication using PowerShell
The first is simpler but less secure since the SMTP server password is visible to the others who have access to the source code.
The second one has one additional step but it is more secure since allows us to keep the password secured and encrypted in an external file that we can use when providing SMTP credentials.
Sending SMTP credentials with a visible password in source code (less secure)
In this example, we provide several parameters to Send-MailMessage CmdLet but the most important parameters for explaining this example are:
- SmtpServer
- Credential
SmtpServer parameter value has an address of the SMTP Server, for example, MailJet SMTP Server is “in-v3.mailjet.com”.
The Credential parameter wraps user and password SMTP Server credentials and needs to be passed as a PSCredential object. We need to pay special attention when passing a password to the creation of a PSCredential object since a password cannot be plain text but SecureString data type. So we need to convert our plain password into SecureString data type using ConvertTo-SecureString CmdLet.
As already mentioned this method is not too complicated but has security issue since we keep our SMTP Server password as plain text in our source code which is not the best practice.
Sending SMTP credentials with a hidden password in source code (more secure)
In this example, we will provide SMTP credentials while calling Send-MailMessage CmdLet but this time password will not be visible. However, this method requires an additional step from our side in order to work.
First we will encrypt our password in external txt file just once and use that file to decrypt and read our password whenever we need in our source code.
When we run this code we will be prompted to provide SMTP Server password credential. Clicking on the OK button (as you can see on the screenshot) encrypted password will be saved in an external file (In this example that is MailJet.txt file).
Save encrypted password in external file.
Now our password is encrypted and saved in an external file so we can use it when calling Send-MailMessage CmdLet.
Here is an example that show us how to use encrypted password in external txt file.
Now when we have cleared away the ways to pass SMTP credentials to the Send-MailMessage CmdLet we can focus on different examples.
Parameters
-Attachments
Type: | String |
Aliases: | PsPath |
Position: | Named |
Default value: | None |
Accept pipeline input: | True |
Accept wildcard characters: | False |
-Bcc
Type: | String |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Body
Type: | String |
Position: | 2 |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-BodyAsHtml
Specifies that the value of the Body parameter contains HTML.
Type: | SwitchParameter |
Aliases: | BAH |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Cc
Type: | String |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Credential
Specifies a user account that has permission to perform this action. The default is the current
user.
Type a user name, such as User01 or Domain01\User01. Or, enter a PSCredential object,
such as one from the cmdlet.
Credentials are stored in a PSCredential
object and the password is stored as a SecureString.
Note
For more information about SecureString data protection, see
.
Type: | PSCredential |
Position: | Named |
Default value: | Current user |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-DeliveryNotificationOption
The delivery notifications are sent to the address in the From parameter.
The acceptable values for this parameter are as follows:
- : No notification.
- : Notify if the delivery is successful.
- : Notify if the delivery is unsuccessful.
- : Notify if the delivery is delayed.
- : Never notify.
These values are defined as a flag-based enumeration. You can combine multiple values together to
set multiple flags using this parameter. The values can be passed to the DeliveryNotification
parameter as an array of values or as a comma-separated string of those values. The cmdlet will
combine the values using a binary-OR operation. Passing values as an array is the simplest option
and also allows you to use tab-completion on the values.
Type: | DeliveryNotificationOptions |
Aliases: | DNO |
Accepted values: | None, OnSuccess, OnFailure, Delay, Never |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Encoding
Specifies the type of encoding for the target file. The default value is .
The acceptable values for this parameter are as follows:
- Uses ASCII (7-bit) character set.
- Uses UTF-16 with the big-endian byte order.
- Uses the encoding that corresponds to the system’s active code page (usually ANSI).
- Uses the encoding that corresponds to the system’s current OEM code page.
- Uses UTF-16 with the little-endian byte order.
- Uses UTF-7.
- Uses UTF-8.
- Uses UTF-32 with the little-endian byte order.
Type: | Encoding |
Aliases: | BE |
Accepted values: | ASCII, BigEndianUnicode, Default, OEM, Unicode, UTF7, UTF8, UTF32 |
Position: | Named |
Default value: | Default |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-From
Type: | String |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Port
Specifies an alternate port on the SMTP server. The default value is 25, which is the default SMTP
port.
Type: | Int32 |
Position: | Named |
Default value: | 25 |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Priority
Type: | MailPriority |
Accepted values: | Normal, High, Low |
Position: | Named |
Default value: | Normal |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-SmtpServer
Type: | String |
Aliases: | ComputerName |
Position: | 3 |
Default value: | $PSEmailServer |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Subject
Type: | String |
Aliases: | sub |
Position: | 1 |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-To
Type: | String |
Position: | |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-UseSsl
The Secure Sockets Layer (SSL) protocol is used to establish a secure connection to the remote
computer to send mail. By default, SSL is not used.
Type: | SwitchParameter |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Сетевые параметры соединителей отправки
Для каждого соединителя отправки необходимо выбрать один из этих параметров:
-
Использовать DNS для маршрутизации почты.
-
Использовать один или несколько промежуточных узлов для маршрутизации почты.
Использование DNS для маршрутизации почты.
Если для доставки почты выбрано сопоставление DNS, исходный сервер Exchange соединителя отправки должен сопоставлять записи МХ для адресных пространств, настроенных в соединителе. В зависимости от характера соединителя и количества сетевых адаптеров на сервере, соединителю отправки может требоваться доступ к внутреннему или внешнему (общедоступному) DNS-серверу. Вы можете настроить сервер для использования отдельных DNS-серверов для внутренних и внешних DNS-запросов.
-
В EAC на сервере > Серверы выберите > сервер и нажмите кнопку Изменить значок >Вкладка DNS-просмотров.
-
В Exchange в команды Set-TransportService используются параметры ExternalDNS * и InternalDNS. *
Если вы уже настроили отдельные DNS-серверы для внутренних и внешних DNS-запросов, а соединитель отправки направляет почту во внешнее адресное пространство, вам нужно настроить соединитель отправки для использования внешнего DNS-сервера:
-
В Центре администрирования Exchange выберите Использовать параметры внешних DNS-запросов на серверах с ролью транспорта (в мастере создания соединителя отправки или на вкладке Доставка в свойствах существующих соединителей).
-
В Exchange для команды New-SendConnector и Set-SendConnector используйте параметр UseExternalDNSServersEnabled.
Использование промежуточных узлов для маршрутизации почты
При маршрутизации почты через промежуточный узел соединитель отправки пересылает почту на промежуточный узел, который в свою очередь направляет ее на следующий транзитный участок. Маршрутизация через промежуточный узел позволяет отправлять исходящую почту через службу или устройство защиты от спама.
Чтобы добавить один или несколько промежуточных узлов, нужно указать IP-адрес (например, 10.1.1.1), полное доменное имя (FQDN) (например, spamservice.contoso.com) или оба типа значений. Если вы укажете FQDN, исходный сервер Exchange соединителя отправки должен сопоставлять полные доменные имена (записи МХ или записи А), используя DNS.
Важной составляющей маршрутизации через промежуточные узлы является используемый ими механизм проверки подлинности. Доступные механизмы проверки подлинности описаны в таблице ниже
Механизм проверки подлинности | Описание |
---|---|
Нет ( ) | Проверка подлинности не выполняется. Например, доступ к промежуточному узлу ограничен исходным IP-адресом. |
Базовая проверка подлинности ( ) | Обычная проверка подлинности. Требуется имя пользователя и пароль. Имя пользователя и пароль отправляются четким текстом. |
Предлагаем базовую проверку подлинности только после запуска TLS ( ) | Обычная проверка подлинности с шифрованием TLS. Сертификат сервера на промежуточном узле должен содержать полное доменное имя промежуточного узла, указанное в соединителе отправки. Соединитель отправки устанавливает сеанс TLS, отправляя команду STARTTLS на промежуточный узел, и только после этого выполняет обычную проверку подлинности. Для взаимной проверки подлинности TLS также необходим сертификат клиента. |
Exchange Server проверки подлинности ( ) | Программный интерфейс универсальных служб защиты (GSSAPI) и взаимная проверка подлинности GSSAPI. |
Внешняя безопасность ( ) | Предполагается, что используется внешний механизм защиты соединения, не входящий в состав Exchange. Подключение может быть связью IPsec или виртуальной частной сетью. Кроме того, серверы могут находиться в доверенной, физически контролируемой сети. |
Отправка писем
Разобравшись с предыдущими параметрами мы можем отправить письмо. Дополнительно мы должны указать следующие параметры:
- UseSsl — так как наше подключение шифруется;
- From — ящик, с которого отправляется письмо;
- To — кому отправляем;
- Subject — тема письма;
- Body — содержание письма.
В моем случае команда будет выглядеть так:
Данная команда, в случая yandex и многих других, публичных, провайдеров вернет ошибку:
Send-MailMessage : Не удается прочитать данные из транспортного соединения: net_io_connectionclosed.
Эта проблема связана с тем, что библиотека .NET SmtpClient, которая работает с командой Send-MailMessage, может использовать шифрование SSL/TLS только с поддержкой STARTTLS. Стандарт STARTTLS расширял возможности шифрования и должен был стать массовым, но этого не случилось (и скорее всего не случится). Во время публикации стандарта STARTTLS был объявлен новый порт для SMTP — 587(msa), а порт 465 (smtps) объявили устаревшим. Так как новый стандарт так и не приобрел массовость провайдеры, чаще всего, пишут только про 465 порт, но и 587 так же у многих провайдеров работает.
Подводя коротко итог предыдущего абзаца, если провайдер пишет про 465 порт, а он не работает — попробуйте 587. В случае с яндексом это именно так.
Так же, если вам нужно что бы у получателя выводилось ваше имя/название компании, используйте следующий формат во From:
Несколько адресатов
Так же как и в случае обычного почтового клиента мы можем отправлять письма нескольким адресатам используя:
- To — обычный получатель;
- Cc — получатель копии;
- Bcc — получатель скрытой копии.
Если планируется использовать несколько почтовых ящиков, в одном параметре, разделяйте их запятыми:
Кодировка
Как вы знаете Windows пока не перевела работу ОС на UTF8 (используется ANSI и ASCII). В это же время UTF8 является стандартом для работы в интернете. По этой причине, если вы не укажете кодировку, то может получится следующая картина:
Отмечу, что это проблема возникнет в Powershell 5.1, которая установлена по умолчанию в Windows. В случае с Powershell 7.1, по умолчанию используется UTF8. Тем не менее вы можете установить свое значение:
- ASCII;
- BigEndianUnicode;
- Default;
- OEM;
- Unicode;
- UTF7;
- UTF8;
- UTF32.
Значения устанавливаются в параметре Encoding:
Отправка письма с разметкой HTML
Письма могут быть посланы как обычный текст или с HTML разметкой. Для разметки дополнительно к параметру Body нужно указать BodyAsHtml:
Вложения
Вложения можно перечислить используя параметр Attachments и пути до файлов:
Этот параметр так же принимает значения через конвейер т.е. мы можем получить все файлы в папке и отправить их:
Уведомления о доставке
Мы можем получить уведомления, если установим следующие параметры у -DeliveryNotificationsOptions:
- OnSuccess — при успешной доставке;
- OnFailure — если сообщение не доставлено;
- Delay — при задержке SMTP сервером.
Через запятую их можно установить несколько:
Уведомление будет доставлено на почтовый ящик.
Приоритет
Вы можете установить приоритет, который увидит получатель письма. Отмечу, что такой приоритет отображается не во всех клиентах. Приоритет определяется в параметре Priority со значениями:
- Normal (по умолчанию)
- High
- Low
…
Рекомендую
Which SMTP Server To Use And How To Get an SMTP Server
Well, do you remember the old days when we were sending messages in envelopes? Did you deliver your envelopes personally to the recipient? Of course not. There is a high probability, at least to say, that you have used some providers like Post Office to do this for you.
If you wonder which SMTP Server to use please do your research since there are many companies on the internet that provide such service and just to name a few: Gmail, Hotmail, Yahoo, etc.
For my examples and to test the code I have used MailJet just because it was easy to create an account and set up everything.
When I have created an account with MailJet it is possible to see the SMTP Settings:
- the SMTP Server address (“in-v3.mailjet.com”),
- a port that is used (587),
- user name, and
- password for SMTP credentials.
Troubleshooting¶
“No Such Host” Error
This error means DNS server cannot resolve SMTP server, you should check if you input correct server address. If your server address is correct, you should check if your DNS server setting is correct.
Common “Socket/Networking Connection” Error
This error means there is a problem with networking connection to SMTP server. You can use Windows built-in Telnet command to detect the networking connection.
Using Telnet to detect networking connection to SMTP server
Note
Notice: in Windows 2008/Windows 8 or later version, is not installed
by default, you should enable this command in -> -> -> have checked.
Under DOS command prompt, input “telnet ”:
telnet mail.emailarchitect.net 25 press enter.
If the networking connection to your SMTP server is good, it should return a message
like . If it returns , that means the
networking connection to SMTP server is bad, or outbound 25 port is blocked by anti-virus
software, firewall or ISP. Please have a look at the following screenshot:
“5xx user authenticaton” Error
TThis error means user authentication is failed, you should check whether you input correct user/password. Password is always case-sensitive.
“5xx Must issue a STARTTLS command first”
This error means SMTP server requires SSL/TLS connection. You should enable SSL/TLS connection like this:
# If your smtp server requires TLS connection, please add this line $server.ConnectType = ::ConnectSSLAuto;
“No supported authentication marshal found!”
This error means SMTP server doesn’t support user authentication or it requires user authentication over SSL/TLS connection. You can try to remove user/password in your codes and try it again.
Используемые фильтры
Чтобы сократить вывод и отсечь ненужную информацию, используем фильтры.
- Получатели — кому были адресованы сообщения. Вводится адрес электронной почты
- Отправитель — кто отправил электронное письмо. Email-адрес.
- Сервер — в инфраструктуре с несколькими Exchange серверами можно выбрать конкретный. Имя сервера.
-
Код события — ограничивает вывод для сообщений с определенным кодом ответа сервера. Варианты:
- RECEIVE — принятые сервером сообщения.
- SEND — отправленные сервером сообщения.
- FAIL — сообщения, при доставке которых возникла ошибка.
- DSN — сообщения-отчеты о недоставке.
- DELIVER — доставленные в локальный почтовый ящик.
- BADMAIL — сообщения, которые не могут быть ни доставлены, ни возвращены.
- RESOLVE — для получателя в Active Directory найден другой адрес.
- EXPAND — от разрешенных групп рассылки.
- REDIRECT — отправленные другим получателям.
- TRANSFER — перемещенные в сообщения с ветвлением.
- SUBMIT — успешная передача службе транспорта.
- POISONMESSAGE — с источником события — идентификатор о сбое.
- DEFER — с отложенной доставкой.
- ИД сообщения — если известен конкретный идентификатор письма.
- Тема.
- Ссылка — поиск сообщений по полю Reference. Чаще всего, оно пустое, но может содержаться информация, например, InternalMessageId.
- Начало — дата и время, от которого искать письма. Если не указано, поиск от самого первого, которое есть в журнале.
- Окончание — дата и время, до которого ищем письма. Если не указано, поиск до последнего, которое есть в журнале.
Что нужно знать перед началом работы
-
Предполагаемое время для завершения каждой процедуры: 2 минут.
-
Вам необходимо получить разрешения, прежде чем выполнять процедуры в этом разделе. Чтобы узнать, какие разрешения вам нужны, см. в разделе «Разрешения на предоставление получателей».
-
Сведения о том, как открыть командную консоль Exchange в локальной организации Exchange, см. в статье Open the Exchange Management Shell.
-
Для процедур в этом разделе требуются особые разрешения. См. информацию о разрешениях по каждой процедуре.
-
Сочетания клавиш для процедур, описанных в этой статье, приведены в статье Сочетания клавиш в Центре администрирования Exchange.
Совет
Возникли проблемы? Попросите помощи на форумах Exchange. Перейти на форумы можно по следующе ссылке: Exchange Server.
Mutt
При возникновении проблем, можно воспользоваться программой mutt. Сначала поставим ее.
а) если используем CentOS / Red Hat:
yum install mutt
б) если используем Ubuntu / Debian:
apt-get install mutt
Теперь можно пользоваться. Синтаксис:
echo «Текст сообщения» | mutt -s «Тема» — <кому отправить>
Примеры использования Mutt
1. Отправить вложение:
* где /var/log/maillog — файл, который будет прикреплен к письму.
2. Указать отправителя:
3. Отправка через другой сервер.
Для начала, открываем файл с конфигурацией Mutt:
vi ~/.muttrc
Добавим:
set smtp_url=»smtp://smtp.mail.ru:25″
* в данном примере мы отправим всю нашу почту через узел smtp.mail.ru, порт 25.
Также можно добавить при необходимости:
set smtp_user = user
set smtp_pass = password
set ssl_verify_host = no
set ssl_verify_dates = no
set ssl_starttls = no
set ssl_force_tls = no
* где:
- smtp_user — имя учетной записи, под которой нужно авторизоваться на SMTP.
- smtp_pass — пароль для аутентификации.
- ssl_verify_host — нужно ли проверять валидность сертификата.
- ssl_verify_dates — нужно ли проверять дату действия сертификата.
- ssl_starttls — нужно ли использовать STARTTLS.
- ssl_force_tls — нужно ли принудительное использование TLS.
Теперь можно отправлять письмо: