Отправка и получение почты через telnet

Отправка и получение почты через telnet

Недавно на работе мне задали неплохую задачу, мне пришлось хорошенечко подумать и погуглить чтобы решить ее.

ЗАДАЧА.

Необходимо:
— просмотреть список сообщений в почтовом ящике challenge@nitrogear.local (пароль password-2015);
— прочитать последнее сообщение;
— удалить последнее сообщение.
При выполнении задания нельзя:
— подключаться на сервер по SSH;
— использовать WHM/cPanel;
— подключать почтовый клиент (консольный или графический).
И сейчас в своей статье «Отправка и получение почты через telnet» расскажу как я это выполнил, все покажу на наглядных примерах.
Сейчас немного расскажу о том как отправить и получить почту с другого сервера, а потом вернусь уже к моей задачи. И так начнем…
Отправка почты с сервера на другой сервер.
Используем POP3. 
Откройте командную строку.
Теперь подключитесь к серверу с 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».

 

Добавить комментарий

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.