Запросы по протоколу imap из командной строки

Запросы по протоколу imap из командной строки.

Содержание

1 Выполнение запросов imap с использованием curl

  • Работа с ящиками imap с помощью curl.

1.1 Необходимая информация

  • Необходимая информация:
    • адрес почтового сервера;
    • почтовый логин;
    • почтовый пароль.
  • В примерах будем подключаться к серверу IMAP imap.example.com.
  • URL подключения:
    • подключение без шифрования: imap://mail.example.com/;
    • подключение по SSL: imaps://mail.example.com/;
  • Будем использовать следующие учётные данные:
    • логин: user;
    • пароль: password.
  • Пароли лучше хранить в базе данных паролей или менеджере паролей:

1.2 Список папок

  • Выполним запрос к серверу IMAP:
    1curl --url "imap://mail.example.com/" --user "user:password"
    
  • При запросе через SSL можно дополнительно указать опцию insecure:
    1curl --insecure --url "imaps://mail.example.com/" --user "user:password"
    
  • Если не указать пароль в аргументе --user, curl запросит пароль перед выполнением запроса.
  • Получим список почтовых ящиков:
    1​* LIST (\HasNoChildren \Unmarked) "|" Archive
    2​* LIST (\HasNoChildren \Unmarked \Drafts) "|" Drafts
    3​* LIST (\HasNoChildren \Unmarked \NoInferiors) "|" INBOX
    4​* LIST (\HasNoChildren \Unmarked \Sent) "|" Sent
    5​* LIST (\HasNoChildren \Unmarked \Junk) "|" Spam
    6​* LIST (\HasNoChildren \Unmarked \Trash) "|" Trash
    
  • Если название папки нечитабельно, его можно расшифровать (см. Почта. Кодировка папок IMAP).

1.3 Количество сообщений

  • Чтобы получить сообщение, нам нужен идентификатор сообщения.
  • Выясним, сколько сообщений в почтовом ящике, поскольку идентификаторы сообщений являются последовательными номерами.
  • Посмотрим, сколько сообщений существует в папке Archive:
1curl --insecure --url "imaps://mail.example.com/" --request "EXAMINE Archive" --user "user:password"
  • Строчка ответа с ключевым словом EXISTS укажет количество сообщений в папке.
  • Предположительно, номера сообщений идут от 1 до количества сообщений (не обязательно).

1.4 Получение сообщения

  • Получим сообщение, задав его идентификатор (например, 5):
    1curl --insecure --url "imaps://mail.example.com/Archive;UID=5" --user "user:password"
    
  • Получение сообщения включает в себя как заголовки, так и тело.
  • Если необходимо получить только заголовки или их подмножество, необходимо закодировать это в запросе.
  • Получим заголовки Кому (To), От (From), Дата (Date), Тема (Subject):
    1curl --insecure --url "imaps://mail.example.com/Archive;UID=5;SECTION=HEADER.FIELDS%20(DATE%20FROM%20TO%20SUBJECT)" --user "user:password"
    
  • Можно отправить запрос отдельно (например, запросив Subject):
    1curl --insecure --verbose --url "imaps://mail.example.com/Archive" --request "fetch 5 BODY.PEEK[HEADER.FIELDS (Subject)]" --user "user:password"
    
  • Однако при программном использовании API-интерфейса curl ответы не декодируются. Поэтому, без флага --verbose мы бы получили нулевой вывод.

1.5 Простые скрипты

  • Получить темы первых десяти сообщений в указанном почтовом ящике:
     1#!/bin/bash
     2# Dump the subject of the first ten messages in the folder
     3
     4for id in $(seq 1 10)
     5do
     6    echo "Message ${id}"
     7    curl --insecure \
     8         --url "imaps://mail.example.com/Archive;UID=${id};SECTION=HEADER.FIELDS%20(SUBJECT)" \
     9         --user "user:password"
    10done
    
  • Получить темы всех сообщений в указанном почтовом ящике:
     1#!/bin/bash
     2# Dump the subject of all messages in the folder
     3
     4while true
     5do
     6    echo "Message ${id}"
     7    curl --insecure \
     8         --url "imaps://mail.example.com/Archive;UID=${id};SECTION=HEADER.FIELDS%20(SUBJECT)" \
     9         --user "user:password" || exit
    10    id=$(expr $id + 1)
    11done
    

Дмитрий Сергеевич Кулябов
Дмитрий Сергеевич Кулябов
Профессор кафедры теории вероятностей и кибербезопасности

Мои научные интересы включают физику, администрирование Unix и сетей.

Похожие