Почта. Синхронизация. mbsync
Настройка синхронизации IMAP с помощью mbsync.
Содержание
1 Описание
isync
/mbsync
— программа для синхронизации IMAP и локальных почтовых файлов.isync
— старое название (для совместимости).
Домашняя страница: https://isync.sourceforge.io/.
2 Установка
- Gentoo
emerge isync
3 Настройка
3.1 Общие положения
- Все учётные записи приводятся к единой структуре.
- Папки IMAP унифицируются следующим образом: Inbox, Archive, Sent, Trash, Drafts, Spam.
- В принципе, никто не мешает использовать названия папок самого IMAP-сервера.
3.2 Конфигурация учётных записей
Учётные записи делаем по полному наименованию почты. Я это делаю потому, что у меня есть почтовые ящики с одинаковыми именами в разных почтовых доменах.
Создать необходимые каталоги:
mkdir -p ~/Maildir/account@domain
Можно создать каталоги все скопом из конфигурационного файла
~/.mbsyncrc
:#!/bin/sh MAILDIR=~/Maildir # make mailbox directories grep -e "^IMAPAccount" ~/.mbsyncrc | cut -d" " -f2 | xargs -I {} -n 1 mkdir -p "${MAILDIR}/{}"
Делаем конфигурационный файл для mbsync. Файл называется
~/.mbsyncrc
.Чтобы не хранить пароли в конфигурационном файле (оператор
Pass
) будем использовать хранение пароля, совместимое с emacs (с использованием оператораPassCmd
):в файле
~/.authinfo.gpg
(см. Emacs. Почта. Парольная аутентификация):- структура команды:
PassCmd "gpg -q --for-your-eyes-only --no-tty -d ~/.authinfo.gpg | awk '/machine account@example.com/ {print $6}'"
- структура команды:
в менеджере паролей pass (см. Менеджер паролей pass):
- структура команды:
PassCmd "pass email/example.com/account@example.com"
Начиная с версии mbsync-1.4.1 операторы
Master
иSlave
заменены наFar
иNear
.
3.3 Общие параметры
- Установка параметра
CopyArrivalDate
:# By default (CopyArrivalDate no), if you copy an old email from inbox to # Archive (e.g.) it will get the date of the copy assigned, instead of just # keeping its original date of arrival! Also see: # https://rakhim.org/fastmail-setup-with-emacs-mu4e-and-mbsync-on-macos/ # https://wiki.archlinux.org/index.php/Isync#Emails_on_remote_server_have_the_wrong_date CopyArrivalDate yes
3.4 Примеры конфигурации для разных провайдеров
- Может потребоваться для разных провайдеров увеличить тайм-аут соединения (по умолчанию равно
20
):# Increase timeout Timeout 120
- Вместо
pass
можно использоватьgopass
. При последовательном запуске несколькихpass
утилита может не находить ключ pgp. - Папки IMAP можно получить либо через web-интерфейс, либо в командной строке (см. Запросы по протоколу imap из командной строки)
3.4.1 Gmail
- https://www.google.com/intl/ru/gmail/about/
- Почта. Google. Настройка почтового клиента
- Из-за структуры тегов Gmail необходимо явно задавать названия почтовых ящиков в директивах
Far
иNear
. - Синхронизацию папки
Отправленные
можно отключить. Google сохраняет всю электронную почту в папкеВсе сообщения
. В результате можно получить локальные дубликаты. - Рекомендуется на сайте Gmail настроить в пункте
Настройки > Пересылка и POP/IMAP > Доступ по протоколу IMAP
(Settings
>Forwarding and POP/IMAP
>IMAP Access
):- отметить
Автоматическое стирание выключено (ожидать, пока клиент не обновит данные на сервере) (==Turn Auto Expunge Off
); - отметить
Архивировать сообщение (по умолчанию)
(Archive message (default)
). отметить.Отправить письмо в корзину
(Send email to trash
)
- отметить
- При использовании двуфакторной аутентификации (2FA) необходимо использовать пароль приложения (см. Почта. Подключение к Google).
# IMAPAccount (gmail) IMAPAccount account@gmail.com Host imap.gmail.com User account@gmail.com # Pass *************** ## To store the password in an encrypted file use PassCmd instead of Pass # PassCmd "gpg -q --for-your-eyes-only --no-tty -d ~/.authinfo.gpg | awk '/machine account@gmail.com/ {print $6}'" # PassCmd "pass email/google.com/account@gmail.com@apppassword" PassCmd "pass email/google.com/account@gmail.com" Port 993 SSLType IMAPS AuthMechs LOGIN SSLVersions TLSv1.2 # Increase timeout Timeout 120 IMAPStore account@gmail.com-remote Account account@gmail.com MaildirStore account@gmail.com-local Path ~/Maildir/account@gmail.com/ Inbox ~/Maildir/account@gmail.com/Inbox SubFolders Verbatim IMAPStore account@gmail.com-remote Account account@gmail.com Channel account@gmail.com-inbox Far :account@gmail.com-remote:"INBOX" Near :account@gmail.com-local:"INBOX" CopyArrivalDate yes Create Both Expunge Both SyncState * Channel account@gmail.com-trash # Far :account@gmail.com-remote:"[Gmail]/Trash" Far :account@gmail.com-remote:"[Gmail]/&BBoEPgRABDcEOAQ9BDA-" Near :account@gmail.com-local:"Trash" CopyArrivalDate yes Create Both Expunge Both SyncState * Channel account@gmail.com-spam # Far :account@gmail.com-remote:"[Gmail]/Spam" Far :account@gmail.com-remote:"[Gmail]/&BCEEPwQwBDw-" Near :account@gmail.com-local:"Spam" CopyArrivalDate yes Create Both Expunge Both SyncState * Channel account@gmail.com-all # Far :account@gmail.com-remote:"[Gmail]/All Mail" Far :account@gmail.com-remote:"[Gmail]/&BBIEQQRP- &BD8EPgRHBEIEMA-" Near :account@gmail.com-local:"Archive" CopyArrivalDate yes Create Both Expunge Both SyncState * Channel account@gmail.com-drafts # Far :account@gmail.com-remote:"[Gmail]/Drafts" Far :account@gmail.com-remote:"[Gmail]/&BCcENQRABD0EPgQyBDgEOgQ4-" Near :account@gmail.com-local:"Drafts" CopyArrivalDate yes Create Both Expunge Both SyncState * Channel account@gmail.com-sent # Far :account@gmail.com-remote:"[Gmail]/Sent Mail" Far :account@gmail.com-remote:"[Gmail]/&BB4EQgQ,BEAEMAQyBDsENQQ9BD0ESwQ1-" Near :account@gmail.com-local:"Sent" CopyArrivalDate yes Create Both Expunge Both SyncState * Group account@gmail.com Channel account@gmail.com-inbox Channel account@gmail.com-trash Channel account@gmail.com-all Channel account@gmail.com-spam Channel account@gmail.com-drafts Channel account@gmail.com-sent
3.4.2 Apple
- https://www.icloud.com/mail
# IMAPAccount (Apple) IMAPAccount account@icloud.com Host imap.mail.me.com PORT 993 User account@icloud.com PassCmd "gpg -q --for-your-eyes-only --no-tty -d ~/.authinfo.gpg | awk '/machine account@icloud.com/ {print $6}'" AuthMechs LOGIN SSLType IMAPS SSLVersion TLSv1.2 # Increase timeout Timeout 120 MaildirStore account@icloud.com-local Path ~/Maildir/account@icloud.com/ Inbox ~/Maildir/account@icloud.com/Inbox SubFolders Verbatim IMAPStore account@icloud.com-remote Account account@icloud.com Channel account@icloud.com-all Far :account@icloud.com-remote: Near :account@icloud.com-local: # Included mailboxes Patterns "INBOX" "Archive" "Trash" "Spam" "Drafts" CopyArrivalDate yes Create Both Expunge Both SyncState * Channel account@icloud.com-sent Far :account@icloud.com-remote:"Sent Messages" Near :account@icloud.com-local:"Sent" CopyArrivalDate yes Create Both Expunge Both SyncState * Group account@icloud.com Channel account@icloud.com-sent Channel account@icloud.com-all
3.4.3 GMX
- https://www.gmx.com/
- https://www.gmx.net/
# IMAPAccount (GMX) IMAPAccount account@gmx.com Host imap.gmx.com User account@gmx.com PassCmd "gpg -q --for-your-eyes-only --no-tty -d ~/.authinfo.gpg | awk '/machine account@gmx.com/ {print $6}'" AuthMechs LOGIN SSLType IMAPS SSLVersion TLSv1.2 # Increase timeout Timeout 120 MaildirStore account@gmx.com-local Path ~/Maildir/account@gmx.com/ Inbox ~/Maildir/account@gmx.com/Inbox SubFolders Verbatim IMAPStore account@gmx.com-remote Account account@gmx.com Channel account@gmx.com Far :account@gmx.com-remote: Near :account@gmx.com-local: Patterns "INBOX" "Archive" "Trash" "Spam" "Drafts" "Sent" CopyArrivalDate yes Create Both Expunge Both SyncState *
3.4.4 Proton
- https://protonmail.com/
- Заблокирован в России.
- Для работы необходимо установить локальное приложение https://protonmail.com/bridge/.
# IMAPAccount (Proton) IMAPAccount account@protonmail.com Host 127.0.0.1 PORT 1111 User account@protonmail.com PassCmd "gpg -q --for-your-eyes-only --no-tty -d ~/.authinfo.gpg | awk '/machine account@protonmail.com/ {print $6}'" AuthMechs LOGIN SSLType STARTTLS SSLVersion TLSv1.2 # Increase timeout Timeout 120 MaildirStore account@protonmail.com-local Path ~/Maildir/account@protonmail.com/ Inbox ~/Maildir/account@protonmail.com/Inbox SubFolders Verbatim IMAPStore account@protonmail.com-remote Account account@protonmail.com Channel account@protonmail.com Far :account@protonmail.com-remote: Near :account@protonmail.com-local: Patterns "INBOX" "Archive" "Trash" "Spam" "Drafts" "Sent" CopyArrivalDate yes Create Both Expunge Both SyncState *
3.4.5 Yandex
- https://yandex.ru/
- Почта. Yandex. Настройка почтового клиента
- Пароли приложений
- При подключении паролей приложений обычные пароли использовать не получится. Придётся сгенерить пароль приложения (см. Почта. Yandex. Пароли приложений).
- Для паролей
pass
:- Пароль для приложения почты можно назвать
account@yandex.ru@apppassword@mail
. - Пароль для smtp следует именовать как
account@yandex.ru@smtp.yandex.ru
(это тот же пароль для почтового приложения).
- Пароль для приложения почты можно назвать
- Конфигурация:
## IMAPAccount (Yandex) IMAPAccount account@yandex.ru Host imap.yandex.ru User account@yandex.ru # Pass *************** ## To store the password in an encrypted file use PassCmd instead of Pass # PassCmd "gpg -q --for-your-eyes-only --no-tty -d ~/.authinfo.gpg | awk '/machine account@yandex.ru/ {print $6}'" # PassCmd "pass email/yandex.ru/account@yandex.ru@apppassword@mail" PassCmd "pass email/yandex.ru/account@yandex.ru" AuthMechs LOGIN SSLType IMAPS SSLVersion TLSv1.2 # Increase timeout Timeout 120 MaildirStore account@yandex.ru-local Path ~/Maildir/account@yandex.ru/ Inbox ~/Maildir/account@yandex.ru/Inbox SubFolders Verbatim IMAPStore account@yandex.ru-remote Account account@yandex.ru Channel account@yandex.ru Far :account@yandex.ru-remote: Near :account@yandex.ru-local: Patterns "INBOX" "Archive" "Trash" "Spam" "Drafts" "Sent" CopyArrivalDate yes Create Both Expunge Both SyncState *
3.4.6 Mail.ru
- Почта. Mail.ru. Настройка почтового клиента
- Пароли приложений
- При подключении паролей приложений обычные пароли использовать не получится. Придётся сгенерить пароль приложения (см. Пароли mail.ru).
- Для паролей
pass
:- Пароль для приложения почты можно назвать
account@mail.ru@apppassword@mail
. - Пароль для smtp следует именовать как
account@mail.ru@smtp.mail.ru
(это тот же пароль для почтового приложения).
- Пароль для приложения почты можно назвать
- Конфигурация:
## IMAPAccount (Mail.ru) IMAPAccount account@mail.ru Host imap.mail.ru User account@mail.ru # Pass *************** ## To store the password in an encrypted file use PassCmd instead of Pass # PassCmd "gpg -q --for-your-eyes-only --no-tty -d ~/.authinfo.gpg | awk '/machine account@mail.ru@apppassword@mail/ {print $6}'" PassCmd "pass email/mail.ru/account@mail.ru@apppassword@mail" AuthMechs LOGIN SSLType IMAPS SSLVersion TLSv1.2 # Increase timeout Timeout 120 MaildirStore account@mail.ru-local Path ~/Maildir/account@mail.ru/ Inbox ~/Maildir/account@mail.ru/Inbox SubFolders Verbatim IMAPStore account@mail.ru-remote Account account@mail.ru Channel account@mail.ru-inbox Far :account@mail.ru-remote:"INBOX" Near :account@mail.ru-local:"INBOX" CopyArrivalDate yes Create Both Expunge Both SyncState * Channel account@mail.ru-trash Far :account@mail.ru-remote:"Корзина" Near :account@mail.ru-local:"Trash" CopyArrivalDate yes Create Both Expunge Both SyncState * Channel account@mail.ru-spam Far :account@mail.ru-remote:"Спам" Near :account@mail.ru-local:"Spam" CopyArrivalDate yes Create Both Expunge Both SyncState * Channel account@mail.ru-drafts Far :account@mail.ru-remote:"Черновики" Near :account@mail.ru-local:"Drafts" CopyArrivalDate yes Create Both Expunge Both SyncState * Channel account@mail.ru-archive Far :account@mail.ru-remote:"Архив" Near :account@mail.ru-local:"Archive" CopyArrivalDate yes Create Both Expunge Both SyncState * Channel account@mail.ru-sent Far :account@mail.ru-remote:"Отправленные" Near :account@mail.ru-local:"Sent" CopyArrivalDate yes Create Both Expunge Both SyncState * Group account@mail.ru Channel account@mail.ru-inbox Channel account@mail.ru-trash Channel account@mail.ru-spam Channel account@mail.ru-drafts Channel account@mail.ru-archive Channel account@mail.ru-sent
3.4.7 Office365
- Почта. Office365. Настройка почтового клиента
- Названия IMAP-ящиков даётся в модифицированной кодировке UTF-7 (см. Почта. Кодировка папок IMAP).
Аутентификация LOGIN
Конфигурация mbsync:
## IMAPAccount (outlook.office365.com) IMAPAccount account@example.com Host smtp.office365.com User account@example.com # Pass *************** ## To store the password in an encrypted file use PassCmd instead of Pass # PassCmd "gpg -q --for-your-eyes-only --no-tty -d ~/.authinfo.gpg | awk '/machine account@example.com/ {print $6}'" PassCmd "pass email/example.com/account@example.com" AuthMechs LOGIN SSLType IMAPS SSLVersion TLSv1.2 # Increase timeout Timeout 120 PipelineDepth 50 MaildirStore account@example.com-local Path ~/Maildir/account@example.com/ Inbox ~/Maildir/account@example.com/Inbox SubFolders Verbatim IMAPStore account@example.com-remote Account account@example.com Channel account@example.com-inbox Far :account@example.com-remote:"INBOX" Near :account@example.com-local:"INBOX" CopyArrivalDate yes Create Both Expunge Both SyncState * Channel account@example.com-trash Far :account@example.com-remote:"&BCMENAQwBDsENQQ9BD0ESwQ1-" Near :account@example.com-local:"Trash" CopyArrivalDate yes Create Both Expunge Both SyncState * Channel account@example.com-spam Far :account@example.com-remote:"&BB0ENQQ2BDUEOwQwBEIENQQ7BEwEPQQwBE8- &BD8EPgRHBEIEMA-" Near :account@example.com-local:"Spam" CopyArrivalDate yes Create Both Expunge Both SyncState * Channel account@example.com-drafts Far :account@example.com-remote:"&BCcENQRABD0EPgQyBDgEOgQ4-" Near :account@example.com-local:"Drafts" CopyArrivalDate yes Create Both Expunge Both SyncState * Channel account@example.com-archive Far :account@example.com-remote:"Archive1" Near :account@example.com-local:"Archive" CopyArrivalDate yes Create Both Expunge Both SyncState * Channel account@example.com-sent Far :account@example.com-remote:"&BB4EQgQ,BEAEMAQyBDsENQQ9BD0ESwQ1-" Near :account@example.com-local:"Sent" CopyArrivalDate yes Create Both Expunge Both SyncState * Group account@example.com Channel account@example.com-inbox Channel account@example.com-trash Channel account@example.com-spam Channel account@example.com-drafts Channel account@example.com-archive Channel account@example.com-sent
Конфигурация SMTP для Emacs:
(setq send-mail-function 'smtpmail-send-it smtpmail-smtp-server "example.com" smtpmail-stream-type 'starttls smtpmail-smtp-service 587)
- Для smtp следует именовать пароль pass как
account@example.com@smtp.office365.com
(см. Менеджер паролей pass).
- Для smtp следует именовать пароль pass как
Аутентификация Oauth2 с DavMail
Аутентификацию oauth2 можно настроить с помощью DavMail (см. DavMail).
Сначала настройте DavMail аутентификацией
O365Interactive
илиO365Manual
, а потом переключите в режимO365Modern
.В конфигурации меняется блок аутентификации:
IMAPAccount account@example.com Host 127.0.0.1 Port 1143 User account@example.com # Pass *************** ## To store the password in an encrypted file use PassCmd instead of Pass # PassCmd "gpg -q --for-your-eyes-only --no-tty -d ~/.authinfo.gpg | awk '/machine account@example.com/ {print $6}'" PassCmd "pass email/example.com/account@example.com" AuthMechs LOGIN SSLType None ## Increase timeout Timeout 120 PipelineDepth 50
Конфигурация SMTP для Emacs:
(setq send-mail-function 'smtpmail-send-it smtpmail-smtp-server "localhost" smtpmail-stream-type 'plain smtpmail-smtp-service 1025)
- Для smtp следует именовать пароль pass как
account@example.com@localhost
(см. Менеджер паролей pass).
- Для smtp следует именовать пароль pass как
3.4.8 Yahoo.com
- Почта. Yahoo.com. Настройка почтового клиента
- Конфигурация:
## IMAPAccount (Yahoo.com) IMAPAccount account@yahoo.com Host imap.mail.yahoo.com User account@yahoo.com # PassCmd "gpg -q --for-your-eyes-only --no-tty -d ~/.authinfo.gpg | awk '/machine account@yahoo.com/ {print $6}'" PassCmd "gopass email/yahoo.com/account@yahoo.com@apppassword" AuthMechs LOGIN SSLType IMAPS SSLVersion TLSv1.2 # Increase timeout Timeout 120 PipelineDepth 50 MaildirStore account@yahoo.com-local Path ~/Maildir/account@yahoo.com/ Inbox ~/Maildir/account@yahoo.com/Inbox SubFolders Verbatim IMAPStore account@yahoo.com-remote Account account@yahoo.com Channel account@yahoo.com-inbox Far :account@yahoo.com-remote:"INBOX" Near :account@yahoo.com-local:"INBOX" CopyArrivalDate yes Create Both Expunge Both SyncState * Channel account@yahoo.com-trash Far :account@yahoo.com-remote:"Trash" Near :account@yahoo.com-local:"Trash" CopyArrivalDate yes Create Both Expunge Both SyncState * Channel account@yahoo.com-spam Far :account@yahoo.com-remote:"Bulk" Near :account@yahoo.com-local:"Spam" CopyArrivalDate yes Create Both Expunge Both SyncState * Channel account@yahoo.com-drafts Far :account@yahoo.com-remote:"Draft" Near :account@yahoo.com-local:"Drafts" CopyArrivalDate yes Create Both Expunge Both SyncState * Channel account@yahoo.com-archive Far :account@yahoo.com-remote:"Archive" Near :account@yahoo.com-local:"Archive" CopyArrivalDate yes Create Both Expunge Both SyncState * Channel account@yahoo.com-sent Far :account@yahoo.com-remote:"Sent" Near :account@yahoo.com-local:"Sent" CopyArrivalDate yes Create Both Expunge Both SyncState * Group account@yahoo.com Channel account@yahoo.com-inbox Channel account@yahoo.com-trash Channel account@yahoo.com-spam Channel account@yahoo.com-drafts Channel account@yahoo.com-archive Channel account@yahoo.com-sent
4 Синхронизация
4.1 Настройка синхронизации
- Будем настраивать синхронизацию нескольких учётных записей.
- Для хранения паролей будем использовать аутентификацию, совместимую с emacs (например, файл формата
.authinfo
) (см. Emacs. Почта. Парольная аутентификация).
4.2 Запуск из командной строки
Синхронизация конкретной учётной записи:
mbsync <chanel>
Синхронизация всех учётных записей:
mbsync --all
4.3 Запуск по таймеру
Для синхронизации с помощью
systemd
надо добавить сервис и таймер.После создания этих файлов добавьте
mbsync.timer
вsystemctl
:systemctl --user --now enable mbsync.timer
~/.config/systemd/user/mbsync.service
.# ~/.config/systemd/user/mbsync.service [Unit] Description=Mailbox synchronization service [Service] Type=oneshot ExecStart=/usr/bin/mbsync -a
~/.config/systemd/user/mbsync.service
. Здесь мы после синхронизации запускаем индексирование дляmu
.# ~/.config/systemd/user/mbsync.service [Unit] Description=Mailbox synchronization service [Service] Type=oneshot ExecStart=-/usr/bin/mbsync -a ExecStartPost=-/usr/bin/mu index
- Знак
-
перед командой позволяет игнорировать код возврата.
- Знак
~/.config/systemd/user/mbsync.timer
. Настраиваем запускmbsync
через 2 минуты после загрузки, а затем запускаем каждые 5 минут.# ~/.config/systemd/user/mbsync.timer [Unit] Description=Mailbox synchronization timer [Timer] OnBootSec=2m OnUnitActiveSec=5m Unit=mbsync.service [Install] WantedBy=timers.target
5 Поддержка почтовых файлов
5.1 Удаление дубликатов
- При копировании могут возникать дубликаты сообщений.
- Их можно удалить (см. Почта. Удаление дубликатов сообщений из локальных почтовых ящиков).
6 Перенос почтовых файлов на другую машину
- Имя почтового файла содержит имя хоста. Поэтому просто так синхронизировать почтовую базу между хостами не получится.
- Синхронизация может понадобиться для случая, когда у Вас большие почтовые ящики, а сервер квотирует почтовый трафик.
- Предлагается скопировать текущую базу на другой хост (в качестве первоначальной постовой базы), а потом переименовать файлы почты.
- Необходимо скопировать данные с
host1
наhost2
. - Проведём проверку переименования:
cd ~/Maildir/ find . -iname "*host1*" | sed 'p;s:host1:host2:' | xargs -n2 -p mv
- Проведём переименование, убрав ключ
p
уxargs
:cd ~/Maildir/ find . -iname "*host1*" | sed 'p;s:host1:host2:' | xargs -n2 mv
- Необходимо скопировать данные с
7 Технические моменты
7.1 Имена почтовых файлов
- Информация по почтовым файлам хранится либо в каталоге
~/.mbsync
в файлах вида:<remote account>:<remote!folder>:<local account>:<local!folder>
- Либо информация хранится в почтовых папках в файлах
.mbsyncstate
(параметрSyncState *
). - В файле
.uidvalidity
хранится последняя отметка времени и идентификатор. - Файлы сообщений именуются по шаблону:
<timestamp>.<PID>_<counter>.<hostname>,U=<increment>:2,<flags>