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