跳转到主要内容

mswatch、OfflineIMAP和Gnus之间的实时邮件集成

项目描述

mswatch、OfflineIMAP和Gnus之间的实时邮件集成

本包提供了一些脚本,用于封装mswatch和OfflineIMAP的部分功能,并与Gnus集成,以提供与远程maildir同步的本地maildir,在变化发生时而不是定期轮询。这提供了几乎即时的新邮件交付,同时减少了资源利用率。还提供了与Emacs邮件和新闻阅读器Gnus的集成,这样您的单线程Emacs进程在maildir发生变化时阻塞得就少多了。

需求

实际上,它们都是可选的。OfflineIMAP同步包装脚本可以与mswatch一起使用而不需要Gnus。Gnus检查器可以在不使用OfflineIMAP的情况下使用。至于OfflineIMAP同步包装脚本,也可以在没有mswatch的情况下使用,但为什么你会这样做呢? :)

安装

您只需要easy_install

$ easy_install rpatterson.mailsync

mailsync-gnus.el库将被安装在egg的site-lisp目录中。要使用库,您需要将此路径添加到您的emacs load-path。它应该是以下类似的形式,但请确保用您Python版本、rpatterson.mailsync版本和easy_install site-dirs的相应值替换问号

/usr/lib/python?.?/site-packages/rpatterson.mailsync-?-py?.?.egg/site-lisp/

或者,如果您有/usr/local/emacs/site-lisp目录,如果从源分布安装rpatterson.mailsync,mailsync-gnus.el库可以被安装到该目录中。您仍然可以使用easy_install来获取源分布

$ easy_install --editable --build-directory=/usr/local/src rpatterson.mailsync
$ cd /usr/local/src/rpatterson.mailsync/
$ python setup.py install

一旦库在Emacs的load-path中,要使用mailsync/gnus-check函数,您需要确保它在您的Emacs中已加载。您可以通过将以下内容添加到您的 .gnus.el 来做到这一点

(load-library "mailsync-gnus")

如果您将使用mailsync_offlineimap来同步您的邮件,首先请根据OfflineIMAP文档配置OfflineIMAP。一旦确认OfflineIMAP正常工作,从控制台运行mailsync_offlineimap来验证它。

在您将使用maildir监视器的任何机器上,无论是使用mswatch还是不使用,请参阅mswatch文档并验证watch_maildirs是否正常工作。在您想使用mailsync_gnus_watch的地方安装rpatterson.mailsync。从控制台运行它以进行测试。启动时应检查Gnus中的所有组并输出一个空白行,然后应检查Gnus中任何更改的maildir文件夹组,然后省略文件夹名称。使用“mailsync_gnus_watch –help”查看可用于修改监视器行为的选项。

要使用mswatch,请参阅mswatch文档,但以以下内容为基础创建您的~/.mswatchrc,并查看“MAILSYNC:”注释以了解需要更改的内容

# minimum time after first queued mailbox change to synchronization (default: 10s)
#base_delay 10

# minimum time between two syncs or failed attempts (default: 60s)
#inter_delay 60

# minimum time between two syncs or failed attempts for specific lists
#inter_delay 30 important_list
#inter_delay 600 high_volume_list another_list

# maximum waiting time between failed attempts (default: 600s)
#max_delay 600

# program (and arguments) to run to sync the mail stores (required)
# sync mswatch-sync

# MAILSYNC: use the following to have mswatch use your OfflineIMAP
# setup to sync folders on change.
sync mailsync_offlineimap

# prefix this string to sync's mailboxes;
#     useful as mbsync channel or OfflineIMAP account.
# the first string ("mydomain") is always prefixed
# the second string (":") is prefixed only when syncing a particular mailbox
mailbox_prefix foo :

# a store to watch, call it "local" (required)
store local
{
    # program (and args) that will monitor this store for changes (required)
    # see 'man watch_maildirs' to tell watch_maildirs where to find mail
    # watch watch_maildirs

    # MAILSYNC: use the following to have your local Gnus check
    # folders as they change, otherwise, just use the above.
    watch mailsync_gnus_watch
}

# the other store to watch, call it "mydomain" (required)
store foo.com
{
    # program (and args) that will monitor this store for changes (required).
    #
    # Uses ssh private/public keys to login without password prompting.
    # Uses ssh BatchMode so that 'mswatch' promptly detects disconnects.
    # Uses 'inputkill' to run 'watch_maildirs' so that 'watch_maildirs'
    # promptly exits if the connection dies.
        # watch ssh -o BatchMode=yes foo.com inputkill watch_maildirs

    # MAILSYNC: use the following to have your remote Gnus check
    # folders as they change, otherwise, just use the above.
    watch ssh -o BatchMode=yes foo.com inputkill mailsync_gnus_watch
}

待办事项

  • 为同步器使用optparse

    使用optparse为同步器添加内置帮助和更清晰的选项和参数处理。

  • 在监视器/检查器中使用延迟

    目前,检查器在监视器发出文件夹名称时每次都运行。大多数maildir更改都会多次发出相同的文件夹,导致检查器冗余运行。使用mswatch时,合并事件的逻辑在mswatch进程中。为了解决这个问题,该逻辑需要扩展到监视器中。这是重新实现mswatch的许多原因之一。

  • 在相同进程中调用OfflineIMAP

    目前,mailsync将OfflineIMAP作为子进程调用,鉴于启动Python应用程序可能会很重,这有点浪费。我简要地查看了一下OfflineIMAP的代码,看看是否可以轻松地完成这项工作,但感到失望。

    如果任何OfflineIMAP的人想向我展示如何做到这一点,那将是很好的。

  • 长时间运行的同步器

    目前,mswatch每次都重新调用同步过程。几乎任何同步过程都会建立一个或多个网络连接。没有必要每次都这样做。最好有一个长时间运行的同步过程,mswatch可以将文件夹同步到需要同步的地方。实现这一点需要修改或重新实现mswatch本身。这也需要在同步过程中提供支持。也许可以将OfflineIMAP用作库来完成这项工作。

  • 忽略重复的maildir通知

    如mswatch页面中所述,每次同步都会重复两次。为了解决这个问题,需要修改或重新实现mswatch本身。

  • maildrop和gnus分割?

    也许让maildrop直接调用Gnus分割并在交付时将传入的消息分割。这将消除INBOX上的重复同步,否则gnus会立即将消息移动到另一个文件夹。然而,这种方法可能对maildrop管道来说太重了。

    另一种方法是使用一个与真实INBOX maildir(~/Maildir)分开的maildir(~/Incomming),邮件首先被交付。这个传入的maildir可以使用检查器/监视器进行监视,其唯一真正的目的是让Gnus检查传入的maildir并分割消息。然后分割会将消息移动到目的地或回退到真实的INBOX maildir,这会触发mswatch使用的任何真实监视器/检查器。

    这种方法不需要额外的mailsync支持。它还使maildrop作业保持小巧轻便,将gnus分割工作与交付解耦。

    这两种方法的优势之一是,邮件在服务器上分割,即使本地mswatch没有连接。目前,只有在mswatch正在运行或服务器上的Gnus定期检查所有邮件时,才会分割邮件。

  • 使用Gamin

    使用Gamin提供跨可用文件修改服务的兼容性。

变更日志

0.4 - 2009-06-28

  • 从子进程传播非零返回代码,以便mswatch知道要重新启动事物。

  • 不要检查同步是否失败,允许mswatch在离线时不断尝试同步,而无需不断运行检查器。

  • 为offlineimap添加一个带有本地gnus检查器的另一个同步器

  • 翻译 Gmail 和 Gnus IMAP 文件分隔符

0.3 - 2008-05-13

  • 明确并修正文档

0.2 - 2008-05-07

  • 修复 easy_install 的 site-lisp 处理问题

0.1 - 2008-05-01

  • 首次发布

0.0 - 背景

令人惊讶的是,邮件用户代理(MUAs)仍然很糟糕。在我的情况下,这被我对使用 Gnus 作为我的 MUA 的强烈偏好所加剧。Thunderbird 可能很棒,但因为它缺乏与 Emacs 的良好集成(不,emacsclient 外部编辑器并不足够),所以这实际上并不重要。

我开始使用 nnimap 来访问我服务器上的 dovecot。那时我还是一个 Gnus 新手,我在 nnimap 上遇到了很多问题。我试图使用 Gnus 代理来解决这些问题,但我的头和 Emacs 同时爆炸。

像很多人一样,我继续使用 OfflineIMAP 将服务器上的 ~/Maildir 与本地完整副本同步。然后我在我的笔记本电脑上设置了 gnus,使用 nnimap 与本地在我的笔记本电脑上运行的 Dovecot 进行通信。这工作得非常好,只有一个例外,我必须在新的邮件显示速度和 OfflineIMAP 使用的带宽之间做出选择。我对我的电子邮件很急躁,所以每分钟同步一次,我发现 OfflineIMAP 容易饱和那些咖啡店或类似场所的带宽。延长频率只能稍微改善情况,因为每 5 分钟或更长时间,我的网络浏览速度仍然会减慢。我假设我也在减慢其他人的速度,请不要告诉他们。尽管如此,我还是使用了这种方法一年或更长时间,因为我实在想不出更好的方法。

随着时间的推移,我使用了越来越多的 Gnus 功能。我有一个漂亮的 BBDB 精美分割设置。我使用自动评分,这真是一件令人愉悦的事情。我同意 Gnus 学习和配置太难了,但说实话,它可能更难,我仍然会使用 Gnus。

后来,随着我在 Gnus 上经验的不断积累,我决定将 .emacs 和 .gnus.el 删除,决心使用 nnimap 和代理,因为我现在更加熟练。我设置了所有这些,它们似乎都工作得很好,但随着时间的推移,我遇到了越来越多的问题。一次又一次,组缓冲区会显示不准确的新消息计数或根本不显示新消息。我发现文章根本就没有下载,所以我无法离线阅读它们。我变得越来越像 Skinarian 鸽子,在 Gnus 面前在混乱中鞠躬,使用神秘的“C-u g”和“M-x gnus-agent-regenerate”组合。除了这些和许多其他小烦恼之外,还有带宽与检查频率的问题,这次每次检查邮件时,我的 emacs 都会阻塞。

然后我了解到 IMAP IDLE,我兴奋不已。然后我了解到 neither OfflineIMAP nor Gnus nnimap 支持它,而 Thunderbird 支持,我发现自己认真地考虑更换。然而,对离开 Gnus 的犹豫让我搜索了很长时间,最终我发现了 mswatch。实际上是一个由三个实用程序组成的组合,mswatch 使用 Linux 的文件修改通知系统(inotify 或 dnotify)按需同步 maildirs。

最初,我尝试使用 mswatch 与其预期的同步程序 mbsync,但 mbsync 无法同步嵌套的 IMAP 文件夹。mswatch 的作者很有心地清晰地记录了用于不同进程的接口,所以我开始编写一个脚本,用 OfflineIMAP 提供的 mswatch 接口来包装它。第一次,我终于有一个新的邮件设置,它快速交付新邮件,而且不会消耗过多的带宽。

但是等等,我使用Gnus与BBDB的分割功能,因此每当邮件到达服务器上的INBOX时,它就会被同步到我的笔记本电脑上,然后Gnus将其分割到目的地,然后再同步回服务器。这个小舞蹈加倍了带宽消耗。此外,我一直希望我的BBDB分割在服务器上完成,那些我使用SSH会话中的Gnus或从其他IMAP客户端访问邮件的时候。所以我还想在邮件到达时通知服务器上的Gnus运行。

因此,我开始编写一个检查脚本,该脚本包装mswatch的监视进程,并使用“emacsclient –eval”告诉Gnus检查发生变化的文件夹。在我的服务器上,这意味着邮件在通知mswatch进程发生变化之前就会被分割,这意味着mswatch也会同步消息被移动到的文件夹。不再有往返之旅。这还有一个额外的优点,就是不需要使用gnus-demon定期检查所有文件夹,就可以让Gnus保持所有邮件文件夹的最新状态。总的来说,快得多,信息非常及时,而且干扰更少。

这个解决方案中有很多东西都是即兴的和不高效的,所以我觉得它大约有75%到80%的效果。然而,鉴于之前的解决方案甚至没有达到50%,我现在已经非常满意了。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分发

rpatterson.mailsync-0.4.tar.gz (26.5 kB 查看哈希值)

上传时间

由以下组织支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面