如何将 Thunderbird 目录中的 mbox 邮件文件转换为 Maildir?

如何将 Thunderbird 目录中的 mbox 邮件文件转换为 Maildir?

互联网上可以找到关于这个话题的多种思考。但没有一个(很容易找到)能够回答这个问题,特别是对于那些不熟悉这两种格式的人来说。

Mozilla wiki 上的相关文章笔记在其第一段中:“Thunderbird 的 maildir 实现允许每个电子邮件 (EML) 具有一个唯一的文件名。但是,请注意,这不是大多数人(尤其是 Linux 用户或邮件管理员)所知道的完整 maildir。”因此,Thunderbird 的常用转换器可能没有提供正确的解决方案。

多夫科特建议 dsync但它可能是专门为 dovecot 开发的。我想停止使用 Thunderbird,但我现在不打算使用 Dovecot,因为它的 wiki 提到了一些“Maildir++”。Dovecot 还推荐(同上)mb2md.pl以及 Dovecot 自己的一些补丁。mb2md似乎是一般推荐的。

但是,有两种实现方式mb2mdsh+Python 脚本Perl 脚本前者是最初的实现,其页面上关于 Perl 版本的描述如下:“如果您在使用我的脚本时遇到这个特定的 [看似荒谬的与环境相关的] 问题,请尝试一下 [Perl 实现]”,仅此而已。目前尚不清楚这两个脚本是否以相同的方式运行,甚至是否支持相同的语法。(简单的检查表明事实并非如此;那么为什么要使用相同的名称?)据报道,Python 版本是 2006 年的,到今天已有 10 多年的历史了。而且,我使用的发行版(Gentoo)的mb2md存储库中似乎也没有这个版本。我可以安装 Dovecot 并使用其转换器,但感觉不对。

尽管问题可能微不足道(mbox 只不过是 eml 的字符串连接,对吧?),但上述所有情况都令人担忧:对于一种已有 10 多年历史的格式(Maildir),人们普遍认为它优于 mbox,但显然没有标准的迁移机制。我不想盲目地进行转换,结果后来才发现一些数据丢失了,正如页面警告mb2md的那样,或者我无法在不失去一致性的情况下向新的 Maildir 存储中添加更多消息,如mbsync 手册页(搜索短语“本机方案更快”)。

顺便说一下,我打算将 mbsync 与新的 Maildir 存储一起使用。希望答案不取决于此。

  1. 已有 10 年历史的 sh+Pythonmb2md转换器与现代 mboxen 的配合是否能像与 2006 年的 mboxen 一样好?
  2. Thunderbird 目录包含MailImapMail和子目录,NewsFeeds这些子目录又包含其他文件。INBOX这些文件是否是唯一的 mbox 文件,或者我可能会错过其他文件?
  3. 我是否应该分别转换每个 mbox 文件mb2md,并且是否必须以某种方式手动连接或将它们分组到 Maildir 存储中?
  4. 过去,Thunderbird 提供“压缩”文件夹功能,无论这意味着什么,用户都表示可以。这会影响转换过程吗?
  5. 在选择不同版本时,我应该考虑什么mb2md?为了完整起见,假设标签、PGP 加密和各种形式的签名在 Thunderbird 中被大量使用。

答案1

wbob 的回答很有用,也很详细。不过,在 wbob 建议进行 dovecot 转换之前,我曾使用过不同的解决方案。此外,我最终得到的存储空间并不多。我不得不接受自己的答案,因为毕竟那是我用过的。

我使用了一个利用mailbox库的简单 Python 脚本。(感谢notmuchfreenode 上的 IRC 频道。)

#!/usr/bin/python3
import mailbox
import sys
import os
mbox_filename = sys.argv[1]
maildir_root_dir_name = sys.argv[2]
mbox = mailbox.mbox(mbox_filename, create=False)
mailbox_name = os.path.basename(mbox_filename)
maildir_dir_name = "/".join((maildir_root_dir_name, mailbox_name))
os.mkdir(maildir_dir_name, mode=0o750)
mdir = mailbox.Maildir(maildir_dir_name, create=True)
os.mkdir("/".join((maildir_dir_name, "cur")), mode=0o750)
os.mkdir("/".join((maildir_dir_name, "new")), mode=0o750)
os.mkdir("/".join((maildir_dir_name, "tmp")), mode=0o750)
count = 0
for x in mbox:
    print(x.get_from())
    count += 1
    if count % 1000 == 0:
        print(count)
    mdir.add(x)

一些消息被破坏了;脚本因错误和行号而停止,所以我不得不使用 emacs(我相信使用 vlf 来打开大文件)来修复 mbox 文件中的问题消息。

这个问题值得更详细的回答,因为对于大多数用户来说,完成这项任务相当麻烦。希望我将来能对此进行扩展。

答案2

对于 Thunderbird 用户,版本60为 Maildir 转换提供了实验性的双向 mbox 支持。请参阅元票对于未解决的问题。我个人推荐 dovecot dsync 方法。

我最近将较大的 Thunderbird mbox 文件夹转换为 Maildir,并评估了您提到的链接,我无法推荐任何帮助脚本。有一个脚本遗漏了“发件人:”拆分,并且迁移前后的消息计数不匹配,其他问题是文本编码或时间戳,在 github 上找到的其他转换脚本也存在此问题。

反而,dsync给出了快速(25k 条消息 1-2 分钟)和一致的结果,请参阅您提到的迁移/邮件格式Wiki 页面:dsync -Dv mirror mbox:~/.thunderbird/<profile/popMail/Account>:INBOX=Inbox。如前所述,mail_location=maildir:~/Maildir在 处预先配置/etc/dovecot/conf.d/10-mail.conf。从一个空文件夹开始,然后通过一些手动清理使其成为启用 Maildir 的 Thunderbird 的帐户文件夹。basedir 中的 {cur,new,tmp} 必须移至“收件箱”,并且可以删除文件夹 .dot-prefix。拥有第二个启用 Maildir 的配置文件将指示 Thunderbird 期望的内容。

答案3

感谢 wbob 提供的有关 dsync 的信息。非常有用。但是,我发现将 Thunderbird 'mbox' 转换为 Maildir 稍微复杂一些,我首先必须在 ~/.thunderbird/path/to/folder/ 上运行 dsync。

每个文件夹仍然只有一个 mbox 文件。但我可以在生成的根文件夹上运行 mb2md(Debian Bullseye 包)。(如果不先运行 dsync,mb2md 只会在生成的文件夹中生成 2 个文件。其中一个是前面巨大的 mbox 文件的内容。)

还值得注意的是,当我将 Thunderbird 设置为“每个消息的文件 (maildir)”时,无法让其正确使用 Maildir 格式。

随后,超过 9000 封电子邮件被移至实际用户的 ~/Maildir,并且所有内容都被迁移(从 GMail 到本地服务器),没有任何明显的错误。

具体步骤如下:

sudo dsync -u username mirror mbox:~/.thunderbird/o9oln6fe.default-default/ImapMail/
mb2md -s ~/mail/imap.gmail.com/ -R```

答案4

Dovecot 迁移对 mbox -> maildir 有一些支持。

这个著名的 mb2md.py 脚本(我猜是“mbox to maildir”的缩写)有点丢失(链接损坏)并且已经过时(Python 2.3......),但我找到了一个更新的版本(Python 3,来自 2019 年)这里

但正如 akatar 提到的,官方 Pythonmailbox模块也许可以做到这一点,但似乎也有些不完善。

相关内容