Отправка и получение почты через telnet
Недавно на работе мне задали неплохую задачу, мне пришлось хорошенечко подумать и погуглить чтобы решить ее.
ЗАДАЧА.
Теперь подключитесь к серверу с Telnet с помощью следующей команды:
# telnet your_domain_or_IP 25
Введите EHLO your_domain_or_IP. Некоторые серверы также принимаем HELO вместо EHLO.
# ehlo your_domain_or_IP
Введите от кого будет посылаться письмо (например user_name@your_domain_or_IP):
# mail from: user_name@your_domain_or_IP
Введите адресата(ов):
# rcpt to: solo.metal@bigmir.net, your_imail@gmail.com
Напишите сообщение — тип DATA, а затем вашу тему (SUBJECT) и ваще сообщения. Для завершения сообщение необходимо поставить точку на отдельной строке и нажмите клавишу ВВОД (enter):
DATA Subject: My subject Hi here, This's my email .
Чтобы выйти из telnet, выполните quit в вашем терминале:
quit
Используем IMAP
Что вам нужно?
- Имя хоста сервера IMAP (для использования в команде Telnet).
- Имя пользователя IMAP (для использования в команде ВХОД (LOGIN)).
- Пароль пользователя IMAP (для использования в команде ВХОД (LOGIN)).
Для дополнительной безопасности, можно зашифровать соединение по протоколу IMAP. Необходимо чтобы ваш сервер поддерживает SSL или TLS, и что у вас есть доступ к клиентской программы SSL/ TLS, например, OpenSSL, чтобы использовать вместо Telnet.
Обычно, номер порта — 993, для примера в OpenSSL должан выглядеть следующим образом:
# openssl s_client -connect imap.server:993 -quiet
Ответ получим:
depth=3 /C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root verify error:num=19:self signed certificate in certificate chain verify return:0 * OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE NAMESPACE AUTH=PLAIN AUTH=LOGIN] Dovecot ready.
Если вы хотели бы видеть открытый ключ сервера, а также некоторую другую информацию шифрования, то запускаем telnet следующим образом:
$ telnet imap.server imap
Рассмотрим конкретный пример:
# telnet dbmarble.com imap Trying 199.116.250.223... Connected to dbmarble.com. Escape character is '^]'. * OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE NAMESPACE STARTTLS AUTH=PLAIN AUTH=LOGIN] Dovecot ready. a1 LOGIN USER_NAME User_NAME_Password a1 OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS SPECIAL-USE BINARY MOVE NAMESPACE QUOTA] Logged in a2 LIST "" "*" * LIST (\HasChildren) "." INBOX * LIST (\HasNoChildren) "." INBOX.Trash * LIST (\HasNoChildren) "." INBOX.Drafts * LIST (\HasNoChildren) "." INBOX.Sent * LIST (\HasNoChildren) "." INBOX.Junk a2 OK List completed. a3 EXAMINE INBOX * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) * OK [PERMANENTFLAGS ()] Read-only mailbox. * 20 EXISTS * 0 RECENT * OK [UIDVALIDITY 1429548711] UIDs valid * OK [UIDNEXT 21] Predicted next UID * OK [HIGHESTMODSEQ 33] Highest a3 OK [READ-ONLY] Examine completed (0.000 secs). a4 FETCH 1 BODY[] * 1 FETCH (BODY[] {764} Return-path: <info@dbmarble.com> Envelope-to: info@dbmarble.com Delivery-date: Mon, 20 Apr 2015 11:51:17 -0500 Received: from [49.148.171.57] (port=50311 helo=migtibenlenovo) by gvo250223.gvodatacenter.com with esmtpsa (TLSv1:AES256-SHA:256) (Exim 4.82) (envelope-from <info@dbmarble.com>) id 1YkEuj-001GY1-3F for info@dbmarble.com; Mon, 20 Apr 2015 11:51:17 -0500 From: Microsoft Outlook <info@dbmarble.com> To: =?utf-8?B?aW5mb0BkYm1hcmJsZS5jb20=?= <info@dbmarble.com> Subject: =?utf-8?B?TWljcm9zb2Z0IE91dGxvb2sgVGVzdCBNZXNzYWdl?= MIME-Version: 1.0 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: 8bit This is an e-mail message sent automatically by Microsoft Outlook while testing the settings for your account. ) a4 OK Fetch completed. a5 LOGOUT * BYE Logging outa 5 OK Logout completed. Connection closed by foreign host.
telnet dbmarble.com imap — подключение к серверу dbmarble.com через telnet используя imap.
a1 LOGIN USER_NAME User_NAME_Password — выполняем конмаду LOGIN с именем пользователя и с паролем.
a2 LIST «» «*» — Смотрим какие папки имеются.
a3 EXAMINE INBOX — Смотрим папку INBOX.
a4 FETCH 1 BODY[] — выполняем команду чтобы посмотреть тело емейла.
a5 LOGOUT — вводим команду для выхода.
Некоторые полезные команды:
LOGIN [username] [password]
LIST [flags] [folder separator] [search term]
STATUS [mailbox] [flags]
SELECT [mailbox]
FETCH [first]:[last] flags
FETCH [mail number] body[header]
FETCH [mail number] body[text]
LOGOUT
Используя SMTP
Telnet — Команды SMTP (отправка почты с помощью программы Telnet).
Подключаемся с Telnet на почтовый сервер:
$ telnet mail_host smtp
Вы должны получить ответ вроде моего:
Trying 12.18.67.37... Connected to mail_host Escape character is '^]'.
Если последняя строка состоит из большого количества звезд с 2 или 0, то вы, вероятно, будет использовать Cisco PIX, и ни один из расширенных команд не будет работать.
Затем вам нужно будет объявить, где вы отправляете письмо от. Вы можете использовать стандартный или расширенный SMTP команды, чтобы сделать это. Расширенные команды позволяют вам увидеть, что поддерживается на сервере и разрешить себе авторизацию:
HELO local_domain_name
Это должно дать Вам вывод подобно моему:
250-way.my_domain Hello mail_host [12.18.67.37], pleased to meet you
Расширенный SMTP, используем:
EHLO local_domain_name
Это должно дать Вам что-то типа этого:
250-way.my_domain Hello mail_host [12.18.67.37], pleased to meet you 250-ENHANCEDSTATUSCODES 250-PIPELINING 250-8BITMIME 250-SIZE 250-DSN 250-ETRN 250-AUTH LOGIN PLAIN 250-STARTTLS 250-DELIVERBY 250 HELP
Если «AUTH» авторизация есть в списке вы можете войти на сервер. Это, как правило, позволяют некоторые вещи, которые обычно ограничены для ретрансляции пример. Вам нужно будет использовать ваше имя пользователя и пароль в Base64.
AUTH LOGIN 334 VXNlcm5hbWU6 bmFtZQ== 334 UGFzc3dvcmQ6 U2VjcmV0 235 2.0.0 OK Authenticated
Вы действительно должны использовать ваше полное доменное имя.
Теперь дайте укажем свой адрес электронной почты:
MAIL FROM: <my_mail@domain_or_IP>
Угловые скобки вокруг имени важны; некоторые серверы не будут принимать имя, если они не существуют.
Вывод должен быть подобный этому:
250 2.1.0 my_mail@domain_or_IP... Sender ok
Теперь указываем адрес получателя:
RCPT TO: <my_mail@other_domain_or_IP>
Опять же, необходимо использовать угловые скобки.
Выход:
250 2.1.0 my_mail@other_domain_or_IP... Recipient ok
Чтобы начать писать сообщение, нужно ввести следующую команду:
DATA Subject:-type subject here-
затем дважды нажмите клавишу ВВОД (они необходимы, чтобы соответствовать RFC 882)
Теперь Вы можете продолжить набирать тело письма, для завершения сообщения используйте сингл «.» на отдельной строке.
Почтовый сервер должен ответить:
250 2.0.0 ???????? Message accepted for delivery
Для закрытия подключения, используйте:
QUIT
Почтовый сервер должен ответить что-то вроде:
221 2.0.0 mail_host_or_domain closing connection Connection closed by foreign host.
Получение или чтение почты с сервера.
Используем POP3
# telnet my_domain 110
Пользователь и адрес электронной почты (например user_name@my_domain), для которого вы хотите просмотреть электронную почту:
> user user_name@my_domain
Затем введите пароль пользователя:
> pass your_password_goes_here
Введите список ваших писем:
> list
Вы увидите список пунктов с таких лейблах, как «1 897» и «2 5136.» Вот пример:
list +OK POP3 clients that break here, they violate STD53. 1 897 2 5136 3 1884 4 2973 .
Если вы хотите прочитать сообщение электронной почты, такие как 2 5136, вы можете ввести следующее:
retr 2
Если вы хотите удалить сообщение, такое как 1 897, то используйте тип DELE 1:
dele 1
Когда вы закончите проверять свою электронную почту, введите quit.
Теперь возвращаемся к моим баранам, расскажу как я выполнил это все задание. И так….
Решение задачи
Так как у меня на сервере использовалось шифрование, то для подключения нужно использовать следующую команду:
openssl s_client -connect my_mail.domain:995
Вы должны получить ответ вроде:
+OK POP3 localhost.localdomain v2000.70rh server ready
Для первоначального подключения и каждой команды, которые вы вводите, почтовый сервер будет отвечать:
-ERR <ERROR_TEXT> +OK <MESSAGE_TEXT>
Команды, которые вы можете использовать, являются (введите пользователя):
USER captain
This must be the first command after the connect. Supply your e-mail userid (not the full e-mail address).
PASS captain_password
Это должно быть следующей команды после USER. Укажите Ваш адрес электронной почты и пароль.Пароль может быть чувствительны к регистру.
STAT
Получите что-то типа:
+OK #msgs #bytes
Где #msgs является количество сообщений в почтовом ящике и #bytes является общий размер используемых всех сообщений. Теперь выведем все сообщения которые имеются.
LIST
Ответом на это, Вы получите строки для каждого сообщения с его количеством и размером в байтах.
Пример ответа:
+OK 3 messages 1 1205 2 305 3 344400 .
RETR msg#
Это извлекает указанное сообщение «MSG #» (и отображает его на экране Telnet). Вы можете просматривать сообщения по количеству строк:
TOP msg# #lines
Это необязательная команда POP3. Не все POP3-серверы поддерживают его. В нем перечислены заголовок для «MSG #» и первые «Строки,» текста в сообщении.
Например, TOP 1 0 — это выведет только заголовки для сообщения 1, в то время как TOP 1 5 — выведет заголовок и первые 5 строк текста сообщения.
DELE msg#
Это номер сообщения «MSG #» для удаления с сервера. Это способ, чтобы избавиться от сообщения. Это на самом деле не удаляется, пока QUIT команда не будет введена. Если вы потеряете соединение с почтовым сервером перед выдачей QUIT команду, сервер не должен удалять сообщения.
RSET
Это приведет к сбросу (Снимает) любые сообщения ранее помеченные для удаления в этой сессии, так что команда QUIT не будет удалять их.
QUIT
Вот таким образом, я решил данную задачу, и привел ее в своей статье «Отправка и получение почты через telnet».