Отправка письма из Telnet с аутентификацией через обычный SMTP и защищенный SMTP TLS

С помощью стандартной утилиты 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 вы можете включить/отключить базовую аутентификацию в настройках принимающего коннектора.

Exchange Server - включена Basic-Authentication

Можно включить базовую аутентификацию из консоли PowerShell (нужно установить EMS на компьютер или подключиться к Exchange Server удаленно ):

Get-ReceiveConnector "ConnectorName" | Set-ReceiveConnector -AuthMechanism Tls, Integrated, BasicAuth, ExchangeServer

Примечание . Обращаем ваше внимание, что злоумышленник при доступе к каналу связи может легко перехватить и расшифровать учетные данные пользователя закодированные с помощью Base64. Поэтому этот способ аутентификации рекомендуется использовать исключительно в частных корпоративных сетях.

Если вы не контролируете каналы связи до 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] "))

powershell конвертировать текст в Base64

Или модулем MIME::Base64 в Perl:

perl -MMIME::Base64 -e 'print encode_base64("username");'
Либо воспользуйтесь любым онлайн сервисом, например, https://www.base64encode.org .

Имя пользователя: testuser@ contoso. com , в кодировке Base64 получилось: dGVzdHVzZXJAY29udG9zby5jb20=

Пароль: $ up3 RsTr) ng — в Base64 JHVwM1 JzVHIpbmc=

конвертация имени и пароля в формат base64 Откройте командную строку и с помощью 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]_x000D_250-SIZE 36700160_x000D_250-PIPELINING_x000D_250-DSN_x000D_250-ENHANCEDSTATUSCODES_x000D_250-STARTTLS_x000D_ 250-AUTH LOGIN_x000D_250-8BITMIME_x000D_250-BINARYMIME_x000D_250 CHUNKING
Также на SMTP серверах могут использоваться следующие протоколы аутентификации: PLAIN, GSSAPI, DIGEST-MD5, MD5, CRAM-MD5, OAUTH10A, OAUTHBEARER.

Например, такой ответ 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] 00$up3RsTr)ng")'

[System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("usernamepassword"))

Сообщите SMTP серверу, что вы хотите аутентифицироваться с помощью метода LOGIN:

AUTH LOGIN

Сервер должен ответить строкой Username в форматер base64:
334 VXNlcm5hbWU6

При аутентификации через метод PLAIN можно сразу отправлять креды пользователя:

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

отправка письма из telnet с smtp аутентификацией - 235 2.7.0 Authentication successful Теперь можно заполнить стандартные поля письма:

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

Письмо было поставлено в исходящую очередь на отправку.
отправка письма из командной строки с выполнением ауторизации на сервере smtp QUIT

221 2.0.0 Closing connection.
Connection closed by foreign host.

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

Для отслеживания логов отправки/доставки в Exchange можно использовать командлет PowerShell Get-MessageTrackingLog .

Выполняем SMTP аутентификацию через TLS/SSL

Большинство SMTP провайдеров не разрешают подключение к серверу в открытом виде. Разрешаются только SMTP подключения, зашифрованные с помощью TLS. Только после этого можно выполнить аутентификацию с помощью методов LOGIN и PLAIN. Telnet не поддерживает SSL или TLS, поэтому для подключению к SMTP серверу по TLS нужно использовать утилиту OpenSSL .

Рассмотрим, как подключиться к SMTP серверу через TLS и выполнить аутентификацию с помощью OpenSSL.

Скачайте и установите 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.remontka.com:25

После установки защищенного SSL соединения с SMTP сервером выполните команду EHLO .

SMTP сервер вернет:

EHLO there_x000D_250- smtp.remontka.com_x000D_250-PIPELINING_x000D_250-SIZE 52428800_x000D_250-ETRN_x000D_250-AUTH PLAIN LOGIN_x000D_250-ENHANCEDSTATUSCODES_x000D_250-8BITMIME_x000D_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

EnglishRussianUkrainian