Отправка письма из 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("testuser@contoso.com"))

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

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

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

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

Пароль: $up3RsTr)ng — в Base64 JHVwM1JzVHIpbmc=

конвертация имени и пароля в формат 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]
250-SIZE 36700160
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-STARTTLS
250-AUTH LOGIN
250-8BITMIME%MINIFYHTML8ce3209ad9b0ef574c130635d0cc5c4d7%
%MINIFYHTML8ce3209ad9b0ef574c130635d0cc5c4d8%250-BINARYMIME
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("\000testuser@contoso.com\000$up3RsTr)ng")'

[System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("\0username\0password"))

Сообщите 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: testuser@contoso.com
250 2.1.0 Sender OK
rcpt to: admin@contoso.com
250 2.1.5 Recipient OK
data
354 Start mail input; end with .
from: TestUserovich <testuser@contoso.com>
to: TheAdmin < admin@contoso.com >
Subject: Test BASE SMTP Authenticated via Telnet
This is test
.
250 2.6.0 <ae80548d-cb8a-4c79-ad80-55b1190df753@mail.contoso.com> [InternalId=6384384] Queued mail for delivery

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

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.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


Предыдущая статья Следующая статья


Комментариев: 5 Оставить комментарий

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не робот( Обязательно отметьте)