3个不稳定版本

0.2.0 2022年6月7日
0.1.1 2022年5月17日
0.1.0 2022年5月12日

#151电子邮件

GPL-3.0 许可证

185KB
3K SLoC

mujuemap

mujuemap是一个工具,用于将您的notmuch数据库与支持JMAP邮件协议的服务器同步。具体来说,它下载新邮件,并同步notmuch标签与邮箱和关键词的双向同步,并且可以通过类似sendmail的接口发送电子邮件。在设计和工作方式上与Lieer非常相似。

免责声明

mujuemap处于非常早期阶段,不提供任何保证。我本人也在使用它,并且它已经在其他用户中得到了稳步的采用,我在永久性更改方面已经采取了谨慎的措施,插入了大量的警惕性。已知它可以在Linux和macOS上运行,并且至少与一个网络邮件提供商(Fastmail)兼容。

如果您决定使用mujuemap,请首先查看开放问题的列表。如果您正在安装最新的Cargo版本而不是最新的git修订版,请考虑查看自最新版本以来发现和解决的问题列表中的变更日志

安装

请首先阅读免责声明部分。

使用cargo安装

cargo install mujmap

您也可以从最新的main修订版安装,因为错误正在被定期修复

cargo install --git https://github.com/elizagamedev/mujmap

还有一个官方的Nix软件包。正在开发一个home-manager模块

用法

mujuemap可以作为您notmuch数据库中唯一的邮件代理或与其他代理共存,它可以管理同一数据库中的两个或多个独立的JMAP账户,并可用于不同的notmuch数据库,每个数据库都有不同的配置。

在您希望用作特定mujuemap实例的maildir的目录中放置一个mujuemap.toml文件(示例)。此目录必须是notmuch根目录的子目录。然后,从该目录调用mujuemap,或者从指向该目录的另一个目录使用-C选项。有关更多信息,请检查mujuemap --help

同步

使用mujuemap sync同步您的邮件。TL;DR:mujuemap下载新邮件文件,合并本地更改,在发生冲突时优先考虑本地更改,然后将更改推送到远程。

mujuemap大致按以下步骤操作

  1. mujmap收集自上次运行以来在服务器上创建、可能更新或被删除的所有电子邮件的元数据。

    JMAP不会告诉我们消息的确切变化,只知道JMAP Email 对象的许多属性中的一个已经改变。可能没有任何我们关心的事情发生了变化。这在进行“完全同步”时尤其如此,这可能发生在我们丢失上次运行的状态信息或此类信息在服务器端过期的情况下。在这种情况下,我们必须从头开始查询一切,并将每条消息都视为“可能已更新”。

  2. mujmap将所有新消息下载到缓存中。

  3. mujmap收集自上次运行以来在本地数据库中更新的所有消息的列表;我们称这些为“本地更新”的消息。

  4. mujmap将新的远程消息添加到本地notmuch数据库中,然后更新所有本地消息(除了本地更新消息),以反映消息的远程状态。

    我们跳过更新本地更新消息,因为再次,我们无法询问JMAP服务器什么变化了;我们只能检索服务器上存在的标签的最新状态。我们更愿意保留本地标签更改而不是远程更改。

  5. 我们将本地更新消息推送到远程。

    不幸的是,notmuch API也没有提供任何更改历史,所以我们只能像JMAP一样查看数据库条目的最新状态。看起来Xapian,作为底层数据库后端,实际上支持这样的功能,但notmuch尚未公开。

  6. 在“mujmap.state.json”中记录我们收到的第一个JMAP Email 状态和下一个notmuch数据库修订版本,以便在步骤1中再次运行mujmap时读取。

有关此可能已经过度解释的过程的更多解释,请参阅稍显过时且不完全按所述实现的DESIGN.org文件,其中包含更多详细信息。

发送

使用mujmap send发送电子邮件。此子命令设计得与sendmail非常相似;即,它从stdin读取RFC5322邮件文件并将其发送到网络空间。尽管如此,此接口仍然是实验性的。

接受但忽略所有-i-oi-f-F参数,以保持与sendmail兼容。发件人始终由电子邮件消息本身确定。

收件人指定方式与sendmail相同。它们必须在参数列表的末尾指定,或者如果指定了-t,mujmap可以从中推断出它们。如果指定了-t,则忽略消息末尾的任何收件人参数,并且mujmap会警告您。

Emacs配置

(setq sendmail-program "mujmap"
      message-sendmail-extra-arguments '("-C" "/path/to/mujmap/maildir" "send"))

怪癖

  • 如果您在已有一个有效设置之后更改配置文件中的任何“标签”选项,请务必注意示例配置文件中的警告并遵循说明!
  • 无论更改有多老,在同步之间更改的本地数据库中的任何消息都将覆盖远程更改。这是由于API限制造成的,在行为部分有更详细的描述。
  • 重复的消息可能行为异常。参见第13条。
  • 此软件可能不适用于Windows。我并没有证据证明这一点,只是个直觉。请证明我错了。

从IMAP+notmuch迁移

遗憾的是,目前还没有直接的迁移方法。以下是一个(未经测试)的方法,您可以使用它,但请在**备份您的notmuch数据库**之后,并且**在独立实例的notmuch数据库中验证mujmap对您的账户是否正常工作**(有关如何操作的信息,请参阅notmuch手册页)。

  1. 确保您已完全与IMAP服务器同步。
  2. 将mujmap作为已存在的maildirs的兄弟节点添加一个maildir。根据需要配置它,但不要现在运行mujmap sync
  3. 在此目录中创建一个名为mujmap.state.json的文件,与mujmap.toml位于同一目录下,内容如下:
{"notmuch_revision":0}
  1. 在此处运行mujmap --dry-run sync。这实际上不会对您的maildir进行任何更改,但允许您验证配置并下载电子邮件到缓存中。
  2. 在此处运行mujmap sync以实际同步您的邮件。这将把下载的电子邮件放到mujmap的maildir中,并将它们添加到您的notmuch数据库中。因为这些消息应该是您现有消息的副本,它们将继承这些副本的标签,并将它们推回服务器。
  3. 删除您旧的IMAP maildirs并运行notmuch new --no-hooks。如果一切顺利,notmuch的输出不应该提到任何被删除的文件。

限制

mujmap无法且永远不会能够

  • 修改消息内容。
  • 删除消息(除了将它们标记为deletedspam)。

故障排除

状态码401(未授权)

  • 确保您的邮件服务器支持HTTP基本认证。Fastmail支持。参见第5点。
  • 验证您是否使用正确的用户名和密码。Fastmail需要一个特殊的第三方密码专门用于JMAP访问
  • 验证您是否使用了一个password_command,该命令将正确的密码打印到stdout。如果密码命令失败,mujmap将记录其stderr。
  • 如果使用Fastmail,请检查网站上的登录日志以获取更多信息。

如果您的邮件目录存储在不同于缓存目录的设备上,将会出现此错误。默认情况下,mujmap的缓存存储在Linux/FreeBSD的XDG_CONFIG_HOME和macOS的~/Library/Caches。您可以通过设置mujmap.toml中的config_dir来更改此位置。

将消息下载到缓存而不是直接下载到maildir的原因是,mujmap旨在能够在其能力范围内回滚本地状态更改,以防止在灾难性故障发生时留下未完全集成到notmuch数据库中的邮件文件。作为一个替代方案,mujmap本可以依赖notmuch配置为忽略正在进行的下载,但这更容易发生用户错误。

依赖

~16-26MB
~400K SLoC