isync

来自 Arch 维基

isync 是一个用于同步邮箱的命令行应用程序;它支持 Maildir 和 IMAP4 邮箱。 新消息、消息删除和标记更改可以双向传播。

同步基于唯一消息标识符 (UID),因此不会发生识别冲突(与其他一些邮件同步器相反)。 同步状态保存在每个邮箱对的一个本地文本文件中;可以维护邮箱的多个副本。

注意: isync 是项目名称,mbsync 是可执行文件的名称

安装

安装 isync 软件包。

配置

本文或本章节已过时。

原因: 在没有双重身份验证的情况下,不再可能访问 lesssecureapps。(在 Talk:Isync 中讨论)
注意
  • 默认情况下,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

提示: mbsync 服务现在仅在登录后运行。 如果您配置了 Systemd/User#Automatic start-up of systemd user instances,也可以在启动后启动 systemd-user 实例。
与 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_idclient_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 XOAUTH2PassCmd "oama access email" 添加到 .mbsyncrc 中的 IMAPAccount 部分。

oauth2token

安装 oauth2tokenAUR 并按照其 README 配置帐户。 每当 mbsync 需要身份验证时,它将负责使用帐户凭据获取当前的 XOAUTH2 令牌。

最后,将 AuthMechs XOAUTH2PassCmd "oauth2get provider account" 添加到 .mbsyncrc 中的 IMAPAccount 部分,并将 provideraccount 替换为您用于 oauth2create 的值。

mutt_oauth2.py

已知 mutt_oauth2.py 可与 Google 和 Microsoft 帐户一起使用。 下载 mutt_oauth2.py(如果需要,使其可执行并放在您的 PATH 中),并按照其 README 了解背景信息并配置帐户。

简而言之,您需要在脚本源代码中直接修改首选加密系统的 ENCRYPTION_PIPEDECRYPTION_PIPE,或者在每次后续续订调用时使用标志指定它们。 在授权期间,添加来自提供商的应用程序注册的 client_idclient_secret(请参阅 #Using XOAUTH2)。 然后,要初始化您的令牌,您需要运行并回答以下问题

$ mutt_oauth2.py userid@myschool.edu.tokens --verbose --authorize

请注意,gmail 仅支持 localhostauthcode 身份验证流程,而 MS 仅支持 authcode 身份验证流程。

要随后接收您的访问令牌(该脚本会自动处理令牌续订),您可以运行

$ mutt_oauth2.py userid@myschool.edu.tokens

由于 ENCRYPTION_PIPEDECRYPTION_PIPE 选项未存储在令牌文件中,如果您不想在脚本源代码中硬编码您的 gpg 密钥名称,则必须单独传递它们

$ mutt_oauth2.py userid@myschool.edu.tokens --encryption-pipe 'gpg --encrypt --recipient <gpg-key>'

最后,将 AuthMechs XOAUTH2PassCmd "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 XOAUTH2PassCmd "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:获取证书

本文或本章节的事实准确性存在争议。

原因: 这可能并非总是必需的,例如,对于 gmail,配置文件中的 CertificateFile /etc/ssl/certs/ca-certificates.crt 可能就足够了(在 Talk:Isync#Step #1: Get the certificates 中讨论)
$ 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。

外部链接