С помощью стандартной утилиты telnet вы можете подключится к удаленному SMTP серверу и отправить тестовое письмо. Как правило, это самый простой и быстрый способ проверки удаленного SMTP сервера, не требующий установки полноценного SMTP клиента. Но в большинстве случаев SMTP сервера требуют аутентификации пользователя, а отправка без аутентификации возможно только на анонимных SMTP серверах (SMTP relay).
В этом примере мы покажем, как выполнить аутентификацию на SMTP сервере и отправить письмо из командной строки telnet. Рассмотрим вариант с обычным SMTP сервером, так и с SMTP сервером, который принимает подключения только по защищенному SST/TLS подключению.
Аутентификация на SMTP сервере из командной строки telnet
Для аутентификации на SMTP сервере через telnet в его настройках должна быть разрешена Basic Authentication. Basic Authentication обычно включена по-умолчанию на серверах Exchange в корпоративной сети. Такой тип аутентификации предполагает отправку имени и пароля пользователя по сети в закодированном виде по алгоритму base64.
В Exchange Server вы можете включить/отключить базовую аутентификацию в настройках принимающего коннектора.
Можно включить базовую аутентификацию из консоли PowerShell (нужно установить EMS на компьютер или подключиться к Exchange Server удаленно):
Get-ReceiveConnector "ConnectorName" | Set-ReceiveConnector -AuthMechanism Tls, Integrated, BasicAuth, ExchangeServer
Если вы не контролируете каналы связи до Exchange, желательно разрешать BasicAuth только после установки, защищенной TLS сессии. Включите опцию Offer basic authentication only after starting TLS в свойствах коннектора в EMC, или воспользуйтесь PowerShell:
Get-ReceiveConnector "ConnectorName" | Set-ReceiveConnector -AuthMechanism 'Tls, BasicAuth, BasicAuthRequireTLS'
Особенности отправки SMTP письма через TLS/SSL описаны в последнем разделе статьи.
Для аутентификации на SMTP сервере через AUTH LOGIN, нужно преобразовать в формат Base64 имя и пароль пользователя, из-под которого будет отправляться письмо. Для преобразования данных в Base64 можно воспользоваться функцией PowerShell:
[System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("[email protected]"))
Или модулем MIME::Base64 в Perl:
perl -MMIME::Base64 -e 'print encode_base64("username");'
Либо воспользуйтесь любым онлайн сервисом, например, https://www.base64encode.org.
Имя пользователя: testuser@contoso.com, в кодировке Base64 получилось: dGVzdHVzZXJAY29udG9zby5jb20=
Пароль: $up3RsTr)ng — в Base64 JHVwM1JzVHIpbmc=
Откройте командную строку и с помощью Telnet подключитесь на 25 (SMTP) порт почтового сервера (вводимые команды я буду выделять синим цветом):
telnet mail.contoso.com 25
Если это хост с Exchange Server, он вернет что-то вроде;
220 mail.contoso.com Microsoft ESMTP MAIL Service ready at Thu, 10 Aug 2015 14:25:30 +0300
Сначала нужно представиться серверу:
ehlo sender.contoso.com
Сервер вернет список поддерживаемых типов аутентификаций и возможностей. Как вы видите базовая аутентификации (AUTH LOGIN) в списке присутствует.
250-mail.contoso.com Hello [192.168.100.15] 250-SIZE 36700160 250-PIPELINING 250-DSN 250-ENHANCEDSTATUSCODES 250-STARTTLS 250-AUTH LOGIN 250-8BITMIME 250-BINARYMIME 250 CHUNKING
Например, такой ответ SMTP сервера говорит о том, что поддерживаются 3 протокола аутентификации.
250 AUTH GSSAPI DIGEST-MD5 PLAIN
PLAIN и LOGIN используют кодировку имени и пароля с помощью BASE64. Отличие между ними в том, что для метода PLAIN логин и пароль передаются одной строкой, а при использовании LOGIN сначала отправляется логин, потом пароль.
Если ваш сервер SMTP поддерживает PLAIN метод аутентификации, можно закодировать имя и пароля с помощью perl функции или PowerShell:
perl -MMIME::Base64 -e 'print encode_base64("\[email protected]\000$up3RsTr)ng")'
[System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("\0username\0password"))
Сообщите SMTP серверу, что вы хотите аутентифицироваться с помощью метода LOGIN:
AUTH LOGIN
Сервер должен ответить строкой Username в форматер base64:
334 VXNlcm5hbWU6
AUTH PLAIN XDAwMHRlc3R1c2VyQGNvbnRvc28uY29tXDAwMCR1cDNSc1RyKW5n
Теперь вставьте в консоль закодированное имя пользователя в формате Base64, которое вы получили ранее:
dGVzdHVzZXJAY29udG9zby5jb20=
Сервер должен ответить кодом 334 и строкой Password в base64:
334 UGFzc3dvcmQ6.
Теперь можно вставить пароль в формате Base64:
JHVwM1JzVHIpbmc=
Если имя и пароль пользователя верны, сервер ответит.
235 2.7.0 Authentication successful
Если нет:
535 5.7.8 Error: authentication failed: UGFzc3dvcmQ6
Теперь можно заполнить стандартные поля письма:
mail from: [email protected]
250 2.1.0 Sender OK
rcpt to: [email protected]
250 2.1.5 Recipient OK
data
354 Start mail input; end with .
from: TestUserovich <[email protected]>
to: TheAdmin < [email protected] >
Subject: Test BASE SMTP Authenticated via Telnet
This is test
.
250 2.6.0 <[email protected]> [InternalId=6384384] Queued mail for delivery
Письмо было поставлено в исходящую очередь на отправку.
QUIT
221 2.0.0 Closing connection.
Connection closed by foreign host.
Через некоторое время проверьте, доставлено ли это письмо в ящик получателя.
Выполняем SMTP аутентификацию через TLS/SSL
Большинство SMTP провайдеров не разрешают подключение к серверу в открытом виде. Разрешаются только SMTP подключения, зашифрованные с помощью TLS. Только после этого можно выполнить аутентификацию с помощью методов LOGIN и PLAIN. Telnet не поддерживает SSL или TLS, поэтому для подключению к SMTP серверу по TLS нужно использовать утилиту OpenSSL.
Рассмотрим, как подключиться к SMTP серверу через TLS и выполнить аутентификацию с помощью OpenSSL.
Скачайте и установите OpenSSL в вашей ОС:
- В Windows можно использовать http://slproweb.com/products/Win32OpenSSL.html
- В Linux OpenSSL устанавливается из стандартных репозиториев:
sudo apt-get install openssl – в Ubuntu/Debian
sudo yum install openssl – в CentOS/RedHat
Чтобы подключится к SMTP серверу из командной строки с предварительной инициализацией шифрования через SSL/TLS, используйте такую команду:
openssl.exe s_client -starttls smtp -connect smtp.winitpro.ru:25
После установки защищенного SSL соединения с SMTP сервером выполните команду
EHLO
.
SMTP сервер вернет:
EHLO there 250- smtp.winitpro.ru 250-PIPELINING 250-SIZE 52428800 250-ETRN 250-AUTH PLAIN LOGIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN
Теперь вы можете выполнить аутентификацию AUTH LOGIN / AUTH PLAIN и отправку письма как описано выше.
Тестирование отправки писем через SMTP в Office 365
В конце октября 2020 Microsoft запретила использовать basic authentication для подключения к почтовым ящикам. SMTP Auth к серверам в Office 365 (Microsoft 365/ Exchange Online) все еще поддерживается, но считается небезопасной. Microsoft отключила SMTP AUTH для новых тенантов. Это означает, что вы не сможете подключиться к SMTP хостам в Office 365 из командной строки telnet или openssl.
Для отправки письма через SMTP сервера в Office 365 нужно использовать PowerShell командлет Send-MailMessage.
$MailMessage = @{
To = $emailto
From = $emailfrom
Subject = "Test email O365"
Body = "Some text"
Smtpserver = $smtpserver
#ErrorAction = "SilentlyContinue"
Port="587"
}
Send-MailMessage @MailMessage -UseSsl -Credential $cred