Linux: Mutt и Neomutt — консольный почтовый клиент

Автор: | 02/08/2021
 

Mutt, и его «наследник» Neomutt — консольный почтовый клиент, MUA — Mail User Agent.

Поддерживает чтение и получение почты по IMAP/POP3, отправку по SMTP.

Ниже рассмотрим настройку IMAP и SMTP для обычного почтового сервера (не Gmail, хотя принципиальной разницы нет) на примере Freehost.com.ua, плюс примеры настроек для отображения списка каталогов в ящике и цветовой схемы.

Установка, навигация

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

sudo pacman -S mutt

Или сразу Neomutt:

sudo pacman -S neomutt

Дальнейшие примеры будут с использованием Neomutt.

Подсказка по клавишам управления есть вверху:

И во время просмотра письма:

В целом управление стандартное/

Главное меню:

  • q: выход из просмотра ил  программы
  • d: отметить на удаление (будет удалено при выходе)
  • m: создать новое письмо
  • r: ответить на текущее

При просмотре письма:

  • i: вернуться к списку писем в ящике
  • пробел: следующая страница текста
  • -: предыдщая страница письма
  • r: ответить
  • d: удалить
  • стрелки вверх/вниз/влево/вправо: следующее/предыдущее псьмо

Настройка IMAP

Файл настроек по умолчанию — ~/.muttrcили ~/.neomuttrc, документация тут>>> или man 5 muttrc.

Для чтения почты по IMAP — добавляем:

set imap_user="user@example.com"
set imap_pass="MyP@ssw0rd"
set folder=imap://freemail.freehost.com.ua:143
set spoolfile=+INBOX

Это минимальные настройки для подключения.

В folder указываем IMAP-сервер почты, а в spoolfile — каталог с почтой на этом сервере. При этом «+» в имени перед именем ящика будет заменено на значение параметра folder.

Запускаем:

Далее, с помощью `mailboxes` можно настроить какие именно каталоги проверять регулярно на предмет появления новых писем, например:

mailboxes +INBOX +Github

Либо наоборот — можно указать список каталогов, которые проверять не надо, но проверять все остальные — unmailboxes.

Что бы периодически проверять все каталоги — указываем:

set imap_check_subscribed

Для кеширования данных локальных, что бы не тянуть данные каждый раз с сервера добавляем:

set header_cache = ~/.cache/mutt
set message_cachedir = ~/.cache/mutt

Настройка SMTP

Для отправки почты из mutt/neomutt указываем:

############
### SMTP ###
############
set smtp_pass = "Ant0shka91"
set smtp_url=smtp://1th@setevoy.kiev.ua@freemail.freehost.com.ua:25

set realname = "Arseny'"
set from = "1th@setevoy.kiev.ua"
set use_from = yes

При этом, если логин и/или пароль такие же, ка кдля IMAP — можно использовать их переменные, т.е.:

set smtp_pass = $imap_pass
set smtp_url=smtp://$imap_user@freemail.freehost.com.ua:250

Поддержка SSL

Для SSL в IMAP — указываем протокол imaps, и порт:

set folder = imaps://freemail.freehost.com.ua:993

Для использования SSL при отправке — меняем протокол с smtp на smtps, указываем порт и добавляем ssl_force_tls:

set smtp_pass = $imap_pass
set smtp_url=smtps://$imap_user@freemail.freehost.com.ua:465
set ssl_force_tls = yes

Сортировка писем

Для сортировки используются параметры sort.

Используем:

  • sort = threads: сортировать по тредам (ответы на письма)
  • sort_aux = reverse-last-date-received: в обратном порядке (последние вверху)

В результате вместо дефолтной сортировки:

Получаем сортировку по дате получения включая ответы:

Sidebar — список каталогов

Для Mutt нужен плагин, в Neomutt есть по умолчанию.

См. опции в документации и в примере тут>>>.

Добавляем опции:

set sidebar_visible = yes
set sidebar_width = 35
set sidebar_sort_method = unsorted
# remove INBOX.Foldername - leave just Foldername
set sidebar_short_path  
# for the sidebar_format
set mail_check_stats
set sidebar_format = "%B%?F? [%F]?%* %?N?%N/?%S"
# build a tree
set sidebar_folder_indent
# tree with spaces
set sidebar_indent_string="  "

Получаем следующий результат:

Sidebar — навигация

Добавим несколько комбинаций для навигации по списку каталогов:

# navigation
bind index,pager \Cp sidebar-prev # Ctrl-p - Previous Mailbox
bind index,pager \Cn sidebar-next # Ctrl-n - Next Mailbox
bind index,pager \Co sidebar-open # Ctrl-o - Open Highlighted Mailbox
bind index,pager \Cb sidebar-toggle-visible # Ctrl+b - Display/Hide Sidebar

Теперь по Ctrl+p переходим по списку каталогв вверх, Ctrl+n — вниз, Ctrl+o — открыть папку.

Ctrl+b — показать или скрыть сайдбар.

Sidebar — цвета

Сейчас цветовая схема выглядит достаточно скучно:

Добавляем:

# currently opened folder
color sidebar_indicator cyan default
# cursor on a folder
color sidebar_highlight white default
# folder with new messages
color sidebar_new green default
# folder with no new/flagged mails, etc.
color sidebar_ordinary blue default
# dividing line between the Sidebar and the Index/Pager panels
color sidebar_divider brightblack black

Тут первым цветом указывается FOREGROUND, т.е. цвет самого текста, вторым — BACKGROUND.

Результат:

Плюс можно добавить цвета для списка писем и отображения писем.

Взято из Email in the Terminal: Configuring Neomutt, там же есть и описание:

# header
color header blue default ".*"
color header brightmagenta default "^(From)"
color header brightcyan default "^(Subject)"
color header brightwhite default "^(CC|BCC)"

# Default index colors:
color index yellow default '.*'
color index_author red default '.*'
color index_number blue default
color index_subject cyan default '.*'

# For new mail:
color index brightyellow black "~N"
color index_author brightred black "~N"
color index_subject brightcyan black "~N"

color progress black cyan

# Body colors
color body brightred default "[\-\.+_a-zA-Z0-9]+@[\-\.a-zA-Z0-9]+" # Email addresses
color body brightblue default "(https?|ftp)://[\-\.,/%~_:?&=\#a-zA-Z0-9]+" # URL
color body green default "\`[^\`]*\`" # Green text between ` and `
color body brightblue default "^# \.*" # Headings as bold blue
color body brightcyan default "^## \.*" # Subheadings as bold cyan
color body brightgreen default "^### \.*" # Subsubheadings as bold green
color body yellow default "^(\t| )*(-|\\*) \.*" # List items as yellow
color body brightcyan default "[;:][-o][)/(|]" # emoticons
color body brightcyan default "[;:][)(|]" # emoticons
color body brightcyan default "[ ][*][^*]*[*][ ]?" # more emoticon?
color body brightcyan default "[ ]?[*][^*]*[*][ ]" # more emoticon?
color body red default "([a-z][a-z0-9+-]*://(((([a-z0-9_.!~*'();:&=+$,-]|%[0-9a-f][0-9a-f])*@)?((([a-z0-9]([a-z0-9-]*[a-z0-9])?)\\.)*([a-z]([a-z0-9-]*[a-z0-9])?)\\.?|[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+)(:[0-9]+)?)|([a-z0-9_.!~*'()$,;:@&=+-]|%[0-9a-f][0-9a-f])+)(/([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*(;([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*)*(/([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*(;([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*)*)*)?(\\?([a-z0-9_.!~*'();/?:@&=+$,-]|%[0-9a-f][0-9a-f])*)?(#([a-z0-9_.!~*'();/?:@&=+$,-]|%[0-9a-f][0-9a-f])*)?|(www|ftp)\\.(([a-z0-9]([a-z0-9-]*[a-z0-9])?)\\.)*([a-z]([a-z0-9-]*[a-z0-9])?)\\.?(:[0-9]+)?(/([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*(;([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*)*(/([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*(;([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*)*)*)?(\\?([-a-z0-9_.!~*'();/?:@&=+$,]|%[0-9a-f][0-9a-f])*)?(#([-a-z0-9_.!~*'();/?:@&=+$,]|%[0-9a-f][0-9a-f])*)?)[^].,:;!)? \t\r\n<>\"]"

color normal brightyellow default
color error red default
color tilde black default
color message cyan default
color markers red white
color attachment white default
color search brightmagenta default
color status brightyellow black
color hdrdefault brightgreen default
color quoted green default
color quoted1 blue default
color quoted2 cyan default
color quoted3 yellow default
color quoted4 red default
color quoted5 brightred default
color signature brightgreen default
color bold black default
color underline black default
color normal default default

Результат:

Пароли и безопасность

И последним — про хранение паролей.

Указывать в виде текста в файле настроек не хочется, поэтмоу есть решение — использовать какой-то внешний менеджер паролей.

Например, что бы получить пароль из KeePassXC (см. KeePass: настройка MFA, хранение паролей браузера, паролей SSH ключей и интеграция Secret Service) — вместо пароля указываем:

set imap_pass = `keepassxc-cli show Dropbox/KeePassDB/Main.kdbx 1th_pass -s -a Password`

При запуске Mutt запросит пароль от базы, получит значение поля Password для записи 1th_pass, и сохранит пароль в переменной imap_pass.

Аналогично для pass (см. Linux: GPG-ключи, менеджер паролей pass и импорт из KeePass) строка для получения пароля из записи 1th_freehost_password выглядела бы как:

set imap_pass = `/usr/bin/pass 1th_freehost_password`

Полный конфиг

Всё содержимое получившего конфига:

############
### IMAP ###
############
set imap_user = `/usr/bin/pass 1th_freehost_mailbox`
set imap_pass = `/usr/bin/pass 1th_freehost_password`
set imap_check_subscribed
# not open new IMAP connections to check for new mail. Mutt will only check for new mail over existing IMAP connections
unset imap_passive
# the maximum amount of time in seconds that mutt will wait before polling open IMAP connections, to prevent the server from closing
set imap_keepalive = 300
# how often to check for new mail (time in seconds).
set mail_check = 60

set folder = imaps://freemail.freehost.com.ua:993
# defaul inbox
mailboxes = +INBOX
set spoolfile = +INBOX
# save drafts to Dratfs
set postponed = +Drafts
# save sent to Sent
set record = +Sent

# cache locally
set header_cache = ~/.cache/mutt
set message_cachedir = ~/.cache/mutt

############
### SMTP ###
############
set smtp_pass = $imap_pass
set smtp_url=smtps://$imap_user@freemail.freehost.com.ua:465
set ssl_force_tls = yes

set realname = "Arseny'"
set from = $imap_user
set use_from = yes
# skip to compose when replying
set fast_reply
# include message in replies
set include
# include message in forwards
set forward_quote

# sorting
set sort = threads
set sort_aux = reverse-last-date-received
# leave read messages in inbox
set move = no

###############
### Sidebar ###
###############
set sidebar_visible = yes
set sidebar_width = 35
set sidebar_sort_method = path
# remove INBOX.Foldername - leave just Foldername
set sidebar_short_path
# for the sidebar_format
set mail_check_stats
set sidebar_format = "%B%?F? [%F]?%* %?N?%N/?%S"
# build a tree
set sidebar_folder_indent
# tree with spaces
set sidebar_indent_string="  "

# navigation
bind index,pager \Cp sidebar-prev # Ctrl-p - Previous Mailbox
bind index,pager \Cn sidebar-next # Ctrl-n - Next Mailbox
bind index,pager \Co sidebar-open # Ctrl-o - Open Highlighted Mailbox
bind index,pager \Cb sidebar-toggle-visible # Ctrl+b - Display/Hide Sidebr

##############
### Colors ###
##############
# currently opened folder
color sidebar_indicator cyan default
# cursor on a folder
color sidebar_highlight white default
# folder with new messages
color sidebar_new green default
# folder with no new/flagged mails, etc.
color sidebar_ordinary blue default
# dividing line between the Sidebar and the Index/Pager panels
color sidebar_divider brightblack black

# header
color header blue default ".*"
color header brightmagenta default "^(From)"
color header brightcyan default "^(Subject)"
color header brightwhite default "^(CC|BCC)"

# Default index colors:
color index yellow default '.*'
color index_author red default '.*'
color index_number blue default
color index_subject cyan default '.*'

# For new mail:
color index brightyellow black "~N"
color index_author brightred black "~N"
color index_subject brightcyan black "~N"

color progress black cyan

# Body colors
color body brightred default "[\-\.+_a-zA-Z0-9]+@[\-\.a-zA-Z0-9]+" # Email addresses
color body brightblue default "(https?|ftp)://[\-\.,/%~_:?&=\#a-zA-Z0-9]+" # URL
color body green default "\`[^\`]*\`" # Green text between ` and `
color body brightblue default "^# \.*" # Headings as bold blue
color body brightcyan default "^## \.*" # Subheadings as bold cyan
color body brightgreen default "^### \.*" # Subsubheadings as bold green
color body yellow default "^(\t| )*(-|\\*) \.*" # List items as yellow
color body brightcyan default "[;:][-o][)/(|]" # emoticons
color body brightcyan default "[;:][)(|]" # emoticons
color body brightcyan default "[ ][*][^*]*[*][ ]?" # more emoticon?
color body brightcyan default "[ ]?[*][^*]*[*][ ]" # more emoticon?
color body red default "([a-z][a-z0-9+-]*://(((([a-z0-9_.!~*'();:&=+$,-]|%[0-9a-f][0-9a-f])*@)?((([a-z0-9]([a-z0-9-]*[a-z0-9])?)\\.)*([a-z]([a-z0-9-]*[a-z0-9])?)\\.?|[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+)(:[0-9]+)?)|([a-z0-9_.!~*'()$,;:@&=+-]|%[0-9a-f][0-9a-f])+)(/([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*(;([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*)*(/([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*(;([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*)*)*)?(\\?([a-z0-9_.!~*'();/?:@&=+$,-]|%[0-9a-f][0-9a-f])*)?(#([a-z0-9_.!~*'();/?:@&=+$,-]|%[0-9a-f][0-9a-f])*)?|(www|ftp)\\.(([a-z0-9]([a-z0-9-]*[a-z0-9])?)\\.)*([a-z]([a-z0-9-]*[a-z0-9])?)\\.?(:[0-9]+)?(/([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*(;([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*)*(/([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*(;([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*)*)*)?(\\?([-a-z0-9_.!~*'();/?:@&=+$,]|%[0-9a-f][0-9a-f])*)?(#([-a-z0-9_.!~*'();/?:@&=+$,]|%[0-9a-f][0-9a-f])*)?)[^].,:;!)? \t\r\n<>\"]"
color normal brightyellow default
color error red default
color tilde black default
color message cyan default
color markers red white
color attachment white default
color search brightmagenta default
color status brightyellow black
color hdrdefault brightgreen default
color quoted green default
color quoted1 blue default
color quoted2 cyan default
color quoted3 yellow default
color quoted4 red default
color quoted5 brightred default
color signature brightgreen default
color bold black default
color underline black default
color normal default default

Вроде всё.

Ссылки  по теме