Приятно ли вам работать в консоли? Этот вопрос вполне способен разделить пользователей на два лагеря. Одни будут утверждать, что именно консоль — тру, а всё остальное для лентяев, неспособных вдумчиво заглянуть в man. Другим же «мышиная возня» с кнопками, переключателями и прочими подсказками гораздо милее, чем необходимость ввода длиннющих команд.

Приверженцы первого лагеря стараются максимальное количество действий выполнять с помощью нативных консольных приложений или хотя бы приложений с TUI-интерфейсом. И если заглянуть в эту «кроличью нору», многое встаёт на свои места. Такой подход прекрасно работает, например, если надо проверить электронную почту. В этой статье мы сделаем это, не отрывая глаз от SSH-сессии с Raspberry Pi. Но вначале небольшой экскурс в историю.

Немного истории

1986 год. На смену чисто консольным /bin/mail, Berkeley Mail, uumail и NMail приходит приложение ELM (Easy Little Mailer), которое одним из первых стало использовать текстовый интерфейс пользователя. Но не стоило ждать чудес, ведь выглядело это так:

Внешний вид ELM
Внешний вид ELM

Так продолжалось до 1995 года, когда ELM стал сдавать позиции, уступив первенство двум другим почтовикам — Mutt и Pine. Первый почтовик выполнял вначале лишь роль Mail User Agent и не мог самостоятельно отправлять почту. Для этого ему требовалось постоянное соединение с почтовым сервером или сторонним SMTP-клиентом. Потом, конечно, SMTP-клиент был вшит в программу, и вопрос был закрыт.

Внешний вид Mutt (источник изображения)
Внешний вид Mutt (источник изображения)

Второй почтовик разрабатывался в стенах Вашингтонского университета и имел ограниченную популярность в странах с кириллическими алфавитами. Если письмо перекодировалось несколько раз или же в заголовке по ошибке указывалась неправильная кодировка, то и в Pine отображались лишь кракозябры. Уже потом его переписали, и с новым названием Alpine почтовик стал адекватно работать с UTF8. С помощью него можно было не только читать почту, но также и новости, распространяемые по протоколу NNTP.

Внешний вид Pine (источник изображения)
Внешний вид Pine (источник изображения)

Для оригинального Mutt было разработано множество патчей, добавляющих разнообразные новые функции. Проблема в том, что большую их часть забросили, даже несмотря на то, что они были полезны. Это послужило толчком к созданию проекта NeoMutt, который стал своего рода «параллельной вселенной». В ней собралось около двух десятков разработчиков и энтузиастов, которые собрали воедино код заброшенных патчей и после значительной переработки добавили в форк Mutt.

Была проделана огромная работа: код «причесали» и разработали для него документацию. Забавно, но часть наработок (например, Sidebar) потом была принята в код оригинального Mutt. Ну а сам NeoMutt давно доступен практически для всех операционных систем, включая Windows через Cygwin.

Установка

Чтобы попробовать NeoMutt в деле, мы взяли обычный одноплатник Raspberry Pi 3 B+ c актуальной Raspberry Pi OS на борту. Обновляем кэш и пакеты до последних версий:

$ sudo apt update && sudo apt -y upgrade

Устанавливаем NeoMutt:

$ sudo apt install neomutt

И вот здесь начинается самое интересное. Если просто запустить почтовик командой neomutt, то ничего хорошего не будет. Он везде поищет конфиг, поймёт, что необходимых данных нет, а каталог для почты не задан и не создан. Перед тем как пытаться хотя бы что-то сделать, нужно написать конфиг. Но как только перед нами открылся пример с комментариями почти на 1 000 строк, стало ясно, что нужно создать собственный минимальный пример.

Пишем конфиг

Перед тем как что-либо начинать делать, нам потребуются данные для настройки почтового клиента. Современные почтовые сервисы по умолчанию отключают возможность распоряжаться почтой при помощи отдельных приложений под предлогом обеспечения безопасности пользователей. Реальная же причина в том, что каждая загрузка веб-страницы на почтовом сервисе приносит им прибыль с рекламы. Если вы будете забирать почту отдельным почтовым клиентом, то и дохода с вас фактически не будет. А уж если консольным почтовым клиентом, который не отображает графику, так и вовсе ужас ;)

Заходим в настройки почтового ящика на веб-странице сервиса и включаем возможность работать с почтой при помощи сторонних почтовых клиентов. На странице документации получаем необходимые адреса и порты почтовых серверов.

Дисклеймер: нет, автор этой статьи ни в коем случае не пытается рекламировать какой-то конкретный почтовый сервис. Рамблер был взят просто интереса ради. Вы же можете использовать любой почтовый сервис, который поддерживает IMAP/POP3/SMTP.

Создаём отдельную директорию для конфига:

$ mkdir ~/.config/neomutt

И сам конфиг:

$ nano ~/.config/neomutt/neomuttrc

Заполняем:

# Указываем, что будет в поле “Имя отправителя”
set realname = "HELLO HABR"
Указываем, что указывать в качестве адреса отправителя
set from="hellohabr@rambler.ru"
Будем почтой распоряжаться только на сервере
set folder="imaps://imap.rambler.ru"
Указываем, как будем получать почту, в формате
imaps:// [имя_пользователя@домен] @ [IMAP-сервер:порт]
set spoolfile = "imaps://hellohabr@rambler.ru@imap.rambler.ru:993"
Тут, конечно, хранить пароль не стоит, чисто для демонстрации
set imap_pass = "your_password"
Тянем список почтовых ящиков с сервера
mailboxes $spoolfile
Указываем, как будем отправлять почту, в формате
smtp:// [имя_пользователя@домен] @ [SMTP-сервер:порт]
set smtp_url = "smtps://hellohabr@rambler.ru@smtp.rambler.ru:465"
Тут, конечно, хранить пароль не стоит, чисто для демонстрации
set smtp_pass = "your_password"

Самым неочевидным моментом здесь будет то, что IMAP и SMTP мы будем использовать безопасно, с использованием SSL. Именно поэтому в качестве начала URL для подключения у нас стоит imaps:// и smtps://. Ещё одним когнитивным диссонансом могут быть две «собачки». Официальная документация сервиса сообщает, что надо обязательно указывать домен в имени пользователя. Парсер NeoMutt это ничуть не смутит, и он корректно обработает такой URL. Сохраняем всё это добро и запускаем:

$ neomutt

При запуске почтовик найдёт наш конфигурационный файл, прочитает и автоматически выполнит подключение. Открываем единственное на данный момент загруженное письмо от почтового сервиса:

Оно работает. Но теперь пора озаботиться насущными вопросами. Например, тем, что хранить пароль в открытом виде не стоит и хотелось бы его как-то зашифровать. Возьмём для этого замечательный способ, разработанный для оригинального Mutt, и адаптируем к нашей конфигурации. Вначале генерируем ключ:

$ gpg --gen-key

Подтверждаем ввод данных и задаём дважды секретную парольную фразу. Медлить не стоит, иначе диалог ввода закроется по таймауту:

После успешной генерации мы получаем отчёт GnuPG о том, что база данных ключей создана и там есть наш ключик, которым можно шифровать любые чувствительные данные:

Создаём рядом с конфигом временный файлик password и переносим в него пароли из конфига neomuttrc: 

$ nano ~/.config/neomutt/password
set imap_pass = "your_password"
set smtp_pass = "your_password"

Шифруем файлик с помощью ранее созданного ключа:

$ gpg -r hellohabr@rambler.ru -e ~/.config/neomutt/password
gpg: checking the trustdb
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: next trustdb check due at 2025-12-25

Это создаст файл password.gpg, содержащий в себе зашифрованный пароль. Удаляем оригинальный файл password:

$ rm ~/.config/neomutt/password

Теперь у нас есть только зашифрованная версия паролей. Открываем ещё раз конфиг neomuttrc, удаляем оттуда строки:

set imap_pass = "your_password"
set smtp_pass = "your_password"

Добавляем следующее перед строкой set folder="imaps://imap.rambler.ru":

# Берём пароли из зашифрованного файла
source "gpg -d ~/.config/neomutt/password.gpg |"

Сохраняем конфиг и выходим. Запускаем neomutt:

$ neomutt

При этом система спросит вас ту самую парольную фразу, которую вы задавали при создании ключика:

Затем она сохранится на какое-то время в кэше и не будет запрашиваться при повторном запуске NeoMutt. Чтобы принудительно закешировать этот пароль, имеет смысл заморочиться и настроить gpg-agent. Но это уже совсем другая история.

Вместо заключения

Что дальше? А дальше начинается не менее увлекательная история с тюнингом NeoMutt под свой вкус. В сети есть множество крутых статей, которые рассказывают, как изменить внешний вид этого консольного почтовика. Вот, например, как его настроил Python-разработчик Gideon Wolfe:

Финальный конфиг NeoMutt может выглядеть весьма монструозно, но результат будет впечатляющим. Возможности для его тюнинга практически безграничны.

Ну и напоследок подкинем идею на обсуждение. Можно создать отдельный ящик под одноразовые коды (OTP/2FA) и настроить на него перенаправление с разных ящиков. Это позволит вам видеть их прямо в консоли при помощи NeoMutt.

Как вам такая мысль? Ждём вас в комментариях.

Комментарии (0)