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的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 104737e403129ead9ccce53c00229eddbef18253a0e0970e1dde37b10e9ada64 |
|
MD5 | bf03316e9531077d2c68045ff6329436 |
|
BLAKE2b-256 | a0c2969cbeba1fc7fa6785bf57e1b00765c723c155f485e604fc5a0de769e97d |