isync
isync 是一个用于同步邮箱的命令行应用程序;它支持 Maildir 和 IMAP4 邮箱。 新消息、消息删除和标记更改可以双向传播。
同步基于唯一消息标识符 (UID),因此不会发生识别冲突(与其他一些邮件同步器相反)。 同步状态保存在每个邮箱对的一个本地文本文件中;可以维护邮箱的多个副本。
安装
配置
- 默认情况下,Google 似乎阻止 isync 下载电子邮件。 如果您启用了两步验证,您需要设置应用密码并将其与 isync 一起使用,否则您需要转到 Google 的安全页面并将“允许安全性较低的应用”切换为“开启”。
- MaildirStore 中的 Subfolders 设置现在似乎是必需的: iSync Config SubFolders SubFolders Legacy 的工作方式与之前的未设置相同 - 2017 年 10 月
首先,需要在用户主目录根目录中创建一个主配置文件 .mbsyncrc
。 该软件包提供了一个示例 /usr/share/doc/isync/examples/mbsyncrc.sample
文件。 另一个 Google 邮件帐户的示例如下
~/.mbsyncrc
IMAPAccount gmail # Address to connect to Host imap.gmail.com User username@gmail.com Pass *************** # To store the password in an encrypted file use PassCmd instead of Pass # PassCmd "gpg2 -q --for-your-eyes-only --no-tty -d ~/.mailpass.gpg" # # Use TLS TLSType IMAPS # The following line should work. If you get certificate errors, uncomment the two following lines and read the "Troubleshooting" section. CertificateFile /etc/ssl/certs/ca-certificates.crt #CertificateFile ~/.cert/imap.gmail.com.pem #CertificateFile ~/.cert/Equifax_Secure_CA.pem IMAPStore gmail-remote Account gmail MaildirStore gmail-local SubFolders Verbatim # The trailing "/" is important Path ~/.mail/gmail/ Inbox ~/.mail/gmail/Inbox Channel gmail Far :gmail-remote: Near :gmail-local: # Exclude everything under the internal [Gmail] folder, except the interesting folders Patterns * ![Gmail]* "[Gmail]/Sent Mail" "[Gmail]/Starred" "[Gmail]/All Mail" # Or include everything #Patterns * # Automatically create missing mailboxes, both locally and on the server Create Both # Sync the movement of messages between folders and deletions, add after making sure the sync works Expunge Both # Save the synchronization state files in the relevant directory SyncState *
可以通过为每个目录使用单独的通道,然后将它们合并到一个组,来避免专有的 [Gmail]
(或 [Google Mail]
)文件夹分类
~/.mbsyncrc
Channel sync-googlemail-default Far :gmail-remote: Near :gmail-local: # Select some mailboxes to sync Patterns "INBOX" "arch" Create Both Channel sync-googlemail-sent Far :gmail-remote:"[Google Mail]/Gesendet" Near :gmail-local:sent Create Near Channel sync-googlemail-trash Far :gmail-remote:"[Google Mail]/Papierkorb" Near :gmail-local:trash Create Near # Get all the channels together into a group. Group googlemail Channel sync-googlemail-default Channel sync-googlemail-sent Channel sync-googlemail-trash
如您所见,名称转换也以这种方式成为可能。
用法
首先创建任何指定为 Maildir 的文件夹。
$ mkdir -p ~/.mail/gmail
然后要检索特定通道的邮件,请运行
$ mbsync gmail
或检索所有通道的邮件
$ mbsync -a
技巧与提示
在 NTFS 分区上使用 Path 和/或 Inbox
由于 NTFS 分区不接受文件名中的分号,因此您需要将 InfoDelimiter 和 FieldDelimiter 更改为其他内容,您可以通过全局(在任何存储或通道配置之外)更改后者来实现此目的,如下所示
~/.mbsyncrc
FieldDelimiter -
自动调用 mbsync
使用定时器
如果您想自动同步您的邮箱,可以使用 systemd/User 单元自动启动 isync。 以下服务文件可以启动 mbsync
命令
~/.config/systemd/user/mbsync.service
[Unit] Description=Mailbox synchronization service [Service] Type=oneshot ExecStart=/usr/bin/mbsync -Va [Install] WantedBy=default.target
以下定时器配置 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
创建这两个文件后,重新加载 systemd,然后 启用 并 启动 mbsync.timer
,并将 --user
标志添加到 systemctl
。
与 notmuch 或 mu4e 集成
如果您想在自动同步邮件后运行 notmuch 或 mu/mu4e,最好通过添加启动后钩子来修改上面的 mbsync.service
,如下所示
~/.config/systemd/user/mbsync.service
[Unit] Description=Mailbox synchronization service [Service] Type=oneshot ExecStart=/usr/bin/mbsync -Va ExecStartPost=/usr/bin/notmuch new
您还可以通过将 ExecStartPost
行更改为 ExecStartPost=/usr/bin/mu index
来索引 mu
,或者如果您正在运行 emacsclient 并希望索引 mu4e
,则更改为 ExecStartPost=/usr/bin/emacsclient -e '(mu4e-update-index)'
。
此修改假设您已为您的用户设置了 notmuch 或 mu/mu4e。 如果 ExecStart 命令未成功执行,则 ExecStartPost 命令将不会执行,请注意这一点!
通过监视 .notmuch
目录,在进行本地更改(例如将邮件标记为已读)时立即触发同步
~/.config/systemd/user/mbsync.path
[Path] PathChanged=%h/mail/.notmuch [Install] WantedBy=default.target
Systemd 默认设置确保服务不会冗余触发。
使用 imapnotify
IMAP IDLE 是一种获取 推送通知 以下载新电子邮件的方法,而不是间歇性轮询服务器。 这具有节省带宽并在邮件可用时立即传递邮件的优点。 Isync 没有原生 IDLE 支持,但我们可以使用像 imapnotify 这样的程序在您收到新电子邮件时调用 mbsync。 在本示例中,我们将使用据报告在频繁网络中断情况下效果更好的 goimapnotify 软件包。
安装 goimapnotify 并为您要轮询的每个邮件服务器创建一个配置文件。 请注意,如果您想使用提供的 systemd 服务,则文件名格式(包括 .conf)是必需的
~/.config/imapnotify/gmail.conf
{ "host": "imap.gmail.com", "port": 993, "tls": true, "tlsOptions": { "rejectUnauthorized": false }, "username": "username@gmail.com", "password": "", "passwordCmd": "pass gmail | head -n1", "onNewMail": "mbsync gmail", "onNewMailPost": "", "boxes": [ "INBOX" ] }
(您可以在项目的 README 中查看完整的配置选项。)
启动/启用 goimapnotify@gmail.service
用户单元。
请注意,IMAP IDLE 仅在新邮件到达时触发,而不是在服务器上有未下载的邮件时触发。 例如,如果您在电脑关机的情况下收到 100 封电子邮件,然后打开电脑,imapnotify 仍然不会下载新邮件,直到您收到另一封电子邮件。 因此,您可能希望在 登录时运行一次 mbsync。
使用 XOAUTH2
首先安装 XOAUTH2 SASL 插件,例如 cyrus-sasl-xoauth2-gitAUR。
对于下面列出的所有 OAuth2 助手,请在其中选择一个,您需要提供您自己的或合适的 FOSS 注册应用程序的 client_id
和可选的 client_secret
。
为了获得 client_id
和 client_secret
,您将需要向提供商注册应用程序。 如果可能,您应该创建自己的应用程序注册,否则,例如由于缺少权限,您可以使用现有的应用程序注册,例如 Thunderbird 的(在 kIssuers
下)或 Evolution 的,在支持动态客户端注册之前,这些都是公开可用的。
另一种选择是暂时使用隐身浏览器窗口创建一个免费的 outlook.com 帐户,并使用该帐户创建应用程序注册。
oama
oama 是一个实用程序,为 IMAP/SMTP 客户端提供 OAuth2 凭据的续订功能和授权。 安装 oama-binAUR 并根据其 README 进行配置。 您可以在 /usr/share/oama
中找到配置模板。
在您能够使用 oama 和您的凭据之前,您需要通过运行以下命令来授权 OAuth2 访问
$ oama authorize service email
其中 service 是您的电子邮件提供商(例如 google),email 是您的电子邮件地址。
授权完成后,将 AuthMechs XOAUTH2
和 PassCmd "oama access email"
添加到 .mbsyncrc
中的 IMAPAccount
部分。
oauth2token
安装 oauth2tokenAUR 并按照其 README 配置帐户。 每当 mbsync 需要身份验证时,它将负责使用帐户凭据获取当前的 XOAUTH2 令牌。
最后,将 AuthMechs XOAUTH2
和 PassCmd "oauth2get provider account"
添加到 .mbsyncrc
中的 IMAPAccount
部分,并将 provider
和 account
替换为您用于 oauth2create
的值。
mutt_oauth2.py
已知 mutt_oauth2.py
可与 Google 和 Microsoft 帐户一起使用。 下载 mutt_oauth2.py(如果需要,使其可执行并放在您的 PATH
中),并按照其 README 了解背景信息并配置帐户。
简而言之,您需要在脚本源代码中直接修改首选加密系统的 ENCRYPTION_PIPE
和 DECRYPTION_PIPE
,或者在每次后续续订调用时使用标志指定它们。 在授权期间,添加来自提供商的应用程序注册的 client_id
和 client_secret
(请参阅 #Using XOAUTH2)。 然后,要初始化您的令牌,您需要运行并回答以下问题
$ mutt_oauth2.py userid@myschool.edu.tokens --verbose --authorize
请注意,gmail 仅支持 localhostauthcode
身份验证流程,而 MS 仅支持 authcode
身份验证流程。
要随后接收您的访问令牌(该脚本会自动处理令牌续订),您可以运行
$ mutt_oauth2.py userid@myschool.edu.tokens
由于 ENCRYPTION_PIPE
和 DECRYPTION_PIPE
选项未存储在令牌文件中,如果您不想在脚本源代码中硬编码您的 gpg 密钥名称,则必须单独传递它们
$ mutt_oauth2.py userid@myschool.edu.tokens --encryption-pipe 'gpg --encrypt --recipient <gpg-key>'
最后,将 AuthMechs XOAUTH2
和 PassCmd "mutt_oauth2.py userid@myschool.edu.tokens"
(如果需要,使用正确的路径)添加到 .mbsyncrc
中的 IMAPAccount
部分。
oauth2ms
oauth2ms
可用于从 Microsoft 身份终结点获取 oauth2 令牌。 此外,它可以将令牌编码为 XOAUTH2 格式,以用作 IMAP 邮件服务器中的身份验证。
按照 指示 安装 oauth2ms
,并创建一个配置文件 $XDG_CONFIG_HOME/oauth2ms/config.json
包含 client_id
。
最后,将 AuthMechs XOAUTH2
和 PassCmd "oauth2ms"
(或 oauth2ms
的完整路径,如果需要)添加到 .mbsyncrc
中的 IMAPAccount
部分。
故障排除
SSL 错误
如果您收到以下错误
SSL error connecting imap.gmail.com (108.177.125.109:993): self signed certificate
由于 google 在您使用 TLS 1.3 时强制执行 SNI,请确保运行至少 isync v1.3.0。 有关更多详细信息,请参阅 https://sourceforge.net/p/isync/isync/merge-requests/2/
如果您收到与证书相关的错误,例如
SSL error connecting pop.mail.com (193.222.111.111:143): error:00000012:lib(0):func(0):reason(18)
您可能需要手动检索服务器的证书,以便 mbsync 正确验证它。
步骤 1:获取证书
$ mkdir ~/.cert $ openssl s_client -connect some.imap.server:port -showcerts 2>&1 < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | sed -ne '1,/-END CERTIFICATE-/p' > ~/.cert/some.imap.server.pem
这将创建一个名为 ~/.cert/some.imap.server.pem
(例如 ~/.cert/imap.gmail.com.pem
)的证书文件。 或者,可以下载 get_certs.sh 并运行它
$ mkdir ~/.cert $ wget https://gist.githubusercontent.com/petRUShka/af96ae25ce8280729b9ea049b929f31d/raw/a79471ce8aee3f6d04049039adf870a53a524f7f/get_certs.sh $ sh get_certs.sh some.imap.server port ~/.cert/
如果您希望手动执行此操作,您可以输入
$ openssl s_client -connect some.imap.server:port -showcerts
它将显示如下输出
CONNECTED(00000003) depth=1 C = US, O = Google Inc, CN = Google Internet Authority verify error:num=20:unable to get local issuer certificate verify return:0 --- Certificate chain 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=imap.gmail.com i:/C=US/O=Google Inc/CN=Google Internet Authority -----BEGIN CERTIFICATE----- MIIDgDCCAumgAwIBAgIKO3MmiwAAAABopTANBgkqhkiG9w0BAQUFADBGMQswCQYD VQQGEwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzEiMCAGA1UEAxMZR29vZ2xlIElu dGVybmV0IEF1dGhvcml0eTAeFw0xMjA5MTIxMTU1NDlaFw0xMzA2MDcxOTQzMjda MGgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1N b3VudGFpbiBWaWV3MRMwEQYDVQQKEwpHb29nbGUgSW5jMRcwFQYDVQQDEw5pbWFw LmdtYWlsLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA2OmU9DjI+DFQ ThqIN4vL6EqZbzH0ejLKcc+zhxsq9BU5hXohSJ1sS5FUU2vReDKk8fd+ZR3cWtpf CTYAUSvdnz1ZFjESSzyUBmGRqByhoc0yqdfb61NosA4CDaO+z7DtAgKyecqnAJad TPYYf9aLk/UgJuc6GseitjzFYonXi6ECAwEAAaOCAVEwggFNMB0GA1UdJQQWMBQG CCsGAQUFBwMBBggrBgEFBQcDAjAdBgNVHQ4EFgQUFuLyTg2NcsyaEESytZbLbQan YIowHwYDVR0jBBgwFoAUv8Aw6/VDET5nup6R+/xq2uNrEiQwWwYDVR0fBFQwUjBQ oE6gTIZKaHR0cDovL3d3dy5nc3RhdGljLmNvbS9Hb29nbGVJbnRlcm5ldEF1dGhv cml0eS9Hb29nbGVJbnRlcm5ldEF1dGhvcml0eS5jcmwwZgYIKwYBBQUHAQEEWjBY MFYGCCsGAQUFBzAChkpodHRwOi8vd3d3LmdzdGF0aWMuY29tL0dvb2dsZUludGVy bmV0QXV0aG9yaXR5L0dvb2dsZUludGVybmV0QXV0aG9yaXR5LmNydDAMBgNVHRMB Af8EAjAAMBkGA1UdEQQSMBCCDmltYXAuZ21haWwuY29tMA0GCSqGSIb3DQEBBQUA A4GBAC1LV7tM6pcyVJLcwdPml4DomtowsjTrqvy5ZFa3SMKANK0iZBgFu74O0THX 8SxP/vn4eAs0yRQxcT1ZuoishLGQl5NoimLaQ4BGQnzFQHDJendfaVKDl21GenJp is72sIrAeprsVU8PbNsllUamWsIjKr3DH5xQdH54hDtzQojY -----END CERTIFICATE----- 1 s:/C=US/O=Google Inc/CN=Google Internet Authority i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority -----BEGIN CERTIFICATE----- MIICsDCCAhmgAwIBAgIDC2dxMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0 aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDkwNjA4MjA0MzI3WhcNMTMwNjA3MTk0MzI3 WjBGMQswCQYDVQQGEwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzEiMCAGA1UEAxMZ R29vZ2xlIEludGVybmV0IEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw gYkCgYEAye23pIucV+eEPkB9hPSP0XFjU5nneXQUr0SZMyCSjXvlKAy6rWxJfoNf NFlOCnowzdDXxFdF7dWq1nMmzq0yE7jXDx07393cCDaob1FEm8rWIFJztyaHNWrb qeXUWaUr/GcZOfqTGBhs3t0lig4zFEfC7wFQeeT9adGnwKziV28CAwEAAaOBozCB oDAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFL/AMOv1QxE+Z7qekfv8atrjaxIk MB8GA1UdIwQYMBaAFEjmaPkr0rKV10fYIyAQTzOYkJ/UMBIGA1UdEwEB/wQIMAYB Af8CAQAwOgYDVR0fBDMwMTAvoC2gK4YpaHR0cDovL2NybC5nZW90cnVzdC5jb20v Y3Jscy9zZWN1cmVjYS5jcmwwDQYJKoZIhvcNAQEFBQADgYEAuIojxkiWsRF8YHde BZqrocb6ghwYB8TrgbCoZutJqOkM0ymt9e8kTP3kS8p/XmOrmSfLnzYhLLkQYGfN 0rTw8Ktx5YtaiScRhKqOv5nwnQkhClIZmloJ0pC3+gz4fniisIWvXEyZ2VxVKfml UUIuOss4jHg7y/j7lYe8vJD5UDI= -----END CERTIFICATE----- --- Server certificate subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=imap.gmail.com issuer=/C=US/O=Google Inc/CN=Google Internet Authority --- No client certificate CA names sent --- SSL handshake has read 2108 bytes and written 350 bytes --- New, TLSv1/SSLv3, Cipher is ECDHE-RSA-RC4-SHA Server public key is 1024 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE SSL-Session: Protocol : TLSv1.1 Cipher : ECDHE-RSA-RC4-SHA Session-ID: 77136647F42633D82DEDFBB9EB62AB516547A3697D83BD1884726034613C1C09 Session-ID-ctx: Master-Key: 635957FBA0762B10694560488905F73BDD2DB674C41970542ED079446F27234E2CA51CF26938B8CA56DF5BBC71E429A7 Key-Arg : None PSK identity: None PSK identity hint: None SRP username: None TLS session ticket lifetime hint: 100800 (seconds) TLS session ticket: 0000 - d6 5b a0 a7 10 0e 64 04-72 93 7c 9f 94 fa 07 57 .[....d.r.|....W 0010 - f1 8b 9d 24 8b 9d 1b f3-a8 b1 4d 2c a9 00 e1 82 ...$......M,.... 0020 - 00 83 1e 3f e5 f2 b2 2c-d2 a8 87 83 16 02 0d 1e ...?...,........ 0030 - bf b6 c1 d6 75 21 04 e6-63 6b ab 5b ed 94 7a 30 ....u!..ck.[..z0 0040 - 1a d0 aa 44 c2 04 9b 10-06 28 b5 7b a0 43 a6 0d ...D.....(.{.C.. 0050 - 3b 4a 85 1f 2e 07 0a e1-32 9b bd 5d 65 41 4c e2 ;J......2..]eAL. 0060 - 7c d7 43 ec c4 18 77 53-b5 d4 84 b4 c9 bd 51 d6 |.C...wS......Q. 0070 - 2d 4f 2e 10 a6 ed 38 c5-8e 9d f8 8b 8a 63 3f 7b -O....8......c?{ 0080 - ee e6 b8 bf 7a f8 b8 e8-47 92 84 f1 9b 0c 63 30 ....z...G.....c0 0090 - 76 d8 e1 44 v..D Start Time: 1352632558 Timeout : 300 (sec) Verify return code: 20 (unable to get local issuer certificate) --- * OK Gimap ready for requests from 108.78.162.240 o67if11168976yhc.67
只需复制以 -----BEGIN CERTIFICATE-----
开头并以 -----END CERTIFICATE-----
结尾的第一个块,粘贴到一个文件中,并以 .pem 扩展名保存(这对于下一步是必要的)。 较旧的说明指出,对于 Gmail,必须保存两个证书块,但在测试中发现这是不必要的。
现在,将根颁发者证书复制到您的本地证书文件夹。 在此示例(Gmail)中,根颁发者是 Equifax Secure Certificate Authority。 此证书包含在 ca-certificates 软件包中。
$ cp /usr/share/ca-certificates/mozilla/Equifax_Secure_CA.crt ~/.cert/Equifax_Secure_CA.pem
步骤 2:设置 mbsync
配置 mbsync 以使用该证书
~/.mbsyncrc
IMAPAccount gmail Host imap.gmail.com # ... CertificateFile ~/.cert/imap.gmail.com.pem
Exchange 2003 的 BAD 命令
连接到 MS Exchange 2003 服务器时,使用管道(即同时执行多个 imap 命令)可能会出现问题。 这样的问题可能如下所示
mbsync -V exchange
>>> 9 SELECT "arch"^M * 250 EXISTS * 0 RECENT * FLAGS (\Seen \Answered \Flagged \Deleted \Draft $MDNSent) * OK [PERMANENTFLAGS (\Seen \Answered \Flagged \Deleted \Draft $MDNSent)] Permanent flags * OK [UNSEEN 241] Is the first unseen message * OK [UIDVALIDITY 4352] UIDVALIDITY value 9 OK [READ-WRITE] SELECT completed. >>> 10 UID FETCH 1:1000000000 (UID FLAGS)^M * 1 FETCH (UID 1 FLAGS (\Seen \Answered)) * 2 FETCH (UID 2 FLAGS (\Seen \Answered)) ... * 249 FETCH (UID 696 FLAGS ()) * 250 FETCH (UID 697 FLAGS (\Seen)) 10 OK FETCH completed. >>> 11 APPEND "arch" (\Seen) {4878+}^M (1 in progress) >>> 12 UID FETCH 697 (BODY.PEEK[])^M (2 in progress) >>> 13 UID STORE 696 +FLAGS.SILENT (\Deleted)^M 12 BAD Command is not valid in this state.
因此,命令 9 是选择新文件夹,命令 10 检查邮件,命令 11、12 和 13 并行运行,写入/获取/标记邮件。 在这种情况下,Exchange 服务器将在 BAD 返回值后终止连接并继续到下一个通道。 (如果在此通道中一切顺利,mbsync 将返回 0。)设置后
PipelineDepth 1
在 Exchange 的 IMAPStore 配置部分中,此问题不再发生。
远程服务器上的邮件日期错误
此修复程序在与 fastmail 同步时有效,但它可能也适用于其他服务。
如果您使用电子邮件客户端将电子邮件移动到新文件夹,并且 mbsync 导致电子邮件在服务器上显示错误的日期,请将此添加到您的配置文件中
CopyArrivalDate yes
例如,如果没有此设置,使用 mu4e 将旧电子邮件从收件箱移动到存档,然后使用 mbsync 同步到 fastmail,将导致电子邮件出现在存档中,但日期是同步日期。
当从 maildir 上传到 imap 服务器时,mbsync 使用电子邮件消息的 mtime。 您可以使用 fix_maildir_mail_mtime.py 脚本从电子邮件标头设置 mtime。