Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
434 lines (349 sloc) 17.6 KB

WanderLust

All mail clients suck. -cira, the author of another mail client, mutt

但是后来我发现其它 email 程序都有某种我不喜欢的怪毛病。– 《Mutt 使用指南》

目录

简介

WanderLust 是一个完全用 Emacs Lisp 实现的一个不需要在 Emacs 之外进行配置的邮件客 户端。难能可贵的是,即使作为和 GNUS 同样的一个单线程应用,IMAP 收信速度仍然碾压 绝大部分其它客户端。

和 Mew 一样,这个包最早是由日本人构建的,所以不需要额外配置字体就能正常显示中文。 同时 WanderLust 也支持 NNTP,MailDir,POP,RSS 等多种协议。

兼顾了 GNUS 的纯 Emacs Lisp 实现和 Mew 的 IMAP 优化、强大的邮件分类功能,同时 还具备一个优秀的邮箱界面,这就是 WanderLust。

为了向《Mutt 使用指南》致敬,我在这里列出了一些不错的特性。

WanderLust 的特点

WanderLust 具有以下特点:

超强的信件分类功能

这也是和 Mew/Mutt 相似的地方。

信件打分排序功能

令人惊讶的是,和 Mutt 一样,它也有这种功能。

几乎任意条件的彩色设置

是的。

可以随意绑定热键

因为你在用 Emacs!

设置条件挂钩

同样这也仰仗于 Emacs。

批量邮件处理

当然可以了!你可以通过标记系统批量处理邮件,也可以用 Emacs Lisp 自动化邮件处 理。

任选编辑器

额,这个好像做不到。不过你用的 Emacs 已经是最好的编辑器(为了防止被打我得加个 “之一”)了,而且你也可以用 Evil。

高级的 MIME 支持

WangderLust 依赖于用 Emacs Lisp 实现的 MIME —— SEMI,能够很好地处理各种文件。

支持 PGP 加密

Emacs 内建的几个包能作为 PGP 的前端。你可以用 EasyPGPGG 来用 GPG 加密 邮件。

Mutt WanderLust 是免费的

听了上面那么多好处之后,还有比这更好的消息吗?

开始

好吧,实际上这个插件极度缺少说明,你几乎无法找到任何介绍这个包的中文资料,甚至 英文资料也几乎仅限于 EmacsWiki 上模糊不清的几段说明。

但是至少有自带的 Emacs Manual 可以看。据说日文版的使用手册比英文版的还要详细一 点。

因为这个包可以直接在 melpa 上找到,安装部分就略过。唯一值得注意的是因为依赖包 比较多,可能要重启几次 Emacs 才能保证安装成功。

然后,和 Mew 一样,记得在 init.el 里面加几行:

(if (boundp 'mail-user-agent)
    (setq mail-user-agent 'wl-user-agent))
(if (fboundp 'define-mail-user-agent)
    (define-mail-user-agent
      'wl-user-agent
      'wl-user-agent-compose
      'wl-draft-send
      'wl-draft-kill
      'mail-send-hook))

配置收信方式

WanderLust 用 ~/.folders 来配置收信方式。非常令人无语的是,这个文件是 unix-rc 格式的。但是不要被吓退,其实这是很容易弄懂的。

%INBOX:johndoe/clear@mail.domain.com:993! "收件箱"
INBOX {
  %INBOX/Family:johndoe/clear@mail.domain.com:993! "家庭"
  %INBOX/Work:johndoe/clear@mail.domain.com:993! "工作"
  Work {
    .inbox "Bug Reports"
  }
}
# 一个以 `/' 结束的访问组,解析整个文件夹结构
%maildir/clear@mail.domain.com:993! /

明白了吗?这就是一个邮箱入口列表了,用不同的标记来告诉 WanderLust 到哪里取邮件。 % 表示 IMAP 信箱, . 表示本地 MailDir 格式的信箱, & 表示 POP 信箱。这甚 至比用 Emacs Lisp 配置还要直观,让我想起了用 Org-mode 来配置 RSS Feeds 的 org-elfeed 。(说实话我觉得 elfeed 的中文支持差爆了,甚至还不如那个性能比较 低的 newsticker。)具体格式参照 Manual。

生成的邮件列表结构是这样的:

总邮箱
 |-收件箱(一个实际邮件文件夹)
 `-INBOX(这个则是用来分类的一个文件夹)
   |-家庭
   |-工作
   `-Work
     `-Bug Reports(本地 MailDir)

你应该可以看出来,通过这种方式很容易就能同时收取多个邮箱。

一个相对复杂的范例

(来自 Emacs Wiki)

# -*- conf-unix -*-
GMAIL{
   %INBOX:myname/clear@imap.gmail.com:993!         "In"
   %[Gmail]/Sent:myname/clear@imap.gmail.com:993!  "Sent"
   %[Gmail]/Draft:myname/clear@imap.gmail.com:993! "Draft"
   %[Gmail]/Trash:myname/clear@imap.gmail.com:993! "Trash"
   %[Gmail]/Spam:myname/clear@imap.gmail.com:993!  "Spam"

   Buy{
      %buy/ebay:myname/clear@imap.gmail.com:993!     "E-bay"
      %buy/records:myname/clear@imap.gmail.com:993!  "Records"
      %buy/books:myname/clear@imap.gmail.com:993!    "Books"
   }

   Friends{
      %friends/work:myname/clear@imap.gmail.com:993!       "work friends"
      %friends/university:myname/clear@imap.gmail.com:993! "university friends"
      %friends/college:myname/clear@imap.gmail.com:993!    "old friends"
      %friends/highschool:myname/clear@imap.gmail.com:993! "very old friends"
   }
}

#Note: usernames with "strange" characters (like "@") must be written 
#like: "myname@company.com". Folders at my work are delimited by dot '.'.
WORK{
   %INBOX:"myname@company.com"/clear@mail.company.com        "Inbox"
   %INBOX.Sent:"myname@company.com"/clear@mail.company.com   "Sent"
   %INBOX.Drafts:"myname@company.com"/clear@mail.company.com "Draft"
   %INBOX.Trash:"myname@company.com"/clear@mail.company.com  "Trash"

   Projects{
      %INBOX.Project1:"myname@company.com"/clear@mail.company.com "Project 1"
      %INBOX.Project2:"myname@company.com"/clear@mail.company.com "Project 2"
   }
}

虽然其实也可以直接用 WanderLust 的文件夹管理器来设置,但在第一次启动时最好还是 了解一下如何配置。

举例

如果你需要马上上手的话,我就用比较常见的 QQ 邮箱举例了。

%inbox:7XXXXXXX9/login@imap.qq.com:993!  "QQ Mail"
路径:用户名/验证方式(QQ 邮箱需要设为 login)@服务器:端口!加上感叹号表示要使用 SSL "用于显示的名称,可以不设"

需要注意的是,用户名用 john@gmail.com 之类的,也就是中间有@符号的,会导致 无法正确连接到服务器。这时候你需要用 =”“= 把用户名包起来。

下面是一个 Gmail 的例子。(注意:中国大陆地区 Gmail 服务已经不可用,包括网页和 POP、IMAP、SMTP 服务。)

%inbox:"john@gmail.com"/clear@imap.gmail.com:993!  "Gmail"

当然你也可以用 Emacs Lisp 来配置,不过一般不推荐这样做。

(setq elmo-imap4-default-server "imap.gmail.com"
      elmo-imap4-default-user "<accountname>@gmail.com"
      elmo-imap4-default-authenticate-type 'clear
      elmo-imap4-default-port '993
      elmo-imap4-default-stream-type 'ssl)

配置发信方式

使用内置 SMTP 发信

下方是一个 SMTP 配置的范例,你应该放在 .wl 里,或者其它合适的地方。

(setq wl-smtp-connection-type 'starttls
      wl-smtp-posting-port 587
      wl-smtp-authenticate-type "plain"
      wl-smtp-posting-user "myname"
      wl-smtp-posting-server "smtp.gmail.com"
      wl-local-domain "gmail.com"
      wl-message-id-domain "smtp.gmail.com")



;; 更加复杂的多账号设置
(setq wl-user-mail-address-list (quote ("myname@gmail.com" "myname@company.com")))

;;(NOTE: "M-: wl-draft-parent-folder" => %INBOX:myname/clear@imap.gmail.com:993)
(setq wl-draft-config-alist
      '(((string-match "company.com" wl-draft-parent-folder)
         (template . "work"))
        ((string-match "gmail.com" wl-draft-parent-folder)
         (template . "gmail"))
        ;; automatic for replies
        (reply "\\(To\\|Cc\\|Delivered-To\\): .*company.com.*"
         (template . "work"))
        (reply "\\(To\\|Cc\\|Delivered-To\\): .*gmail.com.*"
         (template . "gmail"))))

;;choose template with C-c C-j
(setq wl-template-alist
      '(("gmail"
         (wl-from . "My Name <myname@gmail.com>")
         (wl-smtp-posting-user . "myname")
         (wl-smtp-posting-server . "smtp.gmail.com")
         (wl-smtp-authenticate-type ."plain")
         (wl-smtp-connection-type . 'starttls)
         (wl-smtp-posting-port . 587)
         (wl-local-domain . "gmail.com")
         (wl-message-id-domain . "smtp.gmail.com"))
        ("work"
         ("Fcc" . "%INBOX.Sent:\"myname@company.com\"/clear@mail.company.com")
         (wl-from . "My Name <myname@company.com>")
         (wl-smtp-posting-user . "myname@company.com")
         (wl-smtp-posting-server . "mail.company.com")
         (wl-local-domain . "mail.company.com"))
         ("From" . wl-from)))

密码用可 ~/.authinfo 配置。

使用 sendmail/msmtp

如果你已经安装并设置过 sendmail 或者 msmtp ,你当然也可以用这两个 MUA 来发件。

(setq wl-draft-send-mail-function 'wl-draft-send-mail-with-sendmail)

如果用的是 msmtp ,还需要一些额外配置,详见 EmacsWiki

MailDir 设置

尽管 WanderLust 是一个 IMAP 客户端,它也支持用 MailDir。而且不像 GNUS 是把邮件 全部导入到本地文件夹,WanderLust 是直接对 MailDir 进行读写操作,这使得它可以和 我很喜欢的 CLT 邮件客户端 Mutt 共存。我使用 WanderLust 其中之一的原因也是我至 今还没找到 Mew 如何使用 MailDir(后来发现其实和 WanderLust 差不多)。

FAQ

在这里我会对几个常见的问题进行说明。

密码

不像 Mew 那样需要用那种奇怪的方式来避免每次进入邮箱都要输入密码,WanderLust 支 持用 elmo-passwd-alist-save 来在第一次登陆输入密码后保存密码。密码通常被保存 在 ~/.elmo/passwd 。不用担心安全问题,因为密码当然不是明文,而是被加密处理后 保存的。

邮件头显示了一大堆乱七八糟的东西

(setq wl-message-ignored-field-list
      '(".")
      wl-message-visible-field-list
      '("^\\(To\\|Cc\\):"
        "^Subject:"
        "^\\(From\\|Reply-To\\):"
        "^\\(Posted\\|Date\\):"
        "^Organization:"
        "^X-\\(Face\\(-[0-9]+\\)?\\|Weather\\|Fortune\\|Now-Playing\\):")
      wl-message-sort-field-list
      (append wl-message-sort-field-list
              '("^Reply-To" "^Posted" "^Date" "^Organization")))

如何在读信时显示邮件列表

(setq wl-stay-folder-window t)

自动删除邮件和自动归类邮件

;; Refile rule
(setq wl-refile-rule-alist
      '(("to"
         ("splab-ml@do-johodai.ac.jp" . "+ml/splab")
         ("doluc@ncjoho.co.jp" . "+ml/linux-jp/doluc")
         ("debian-users@debian.or.jp" . "+ml/linux-jp/debian-users")
         ("mule-ja@m17n.org" . "+ml/emacsen/mule-ja")
         ("semi-gnus-ja@meadowy.org" . "+ml/emacsen/emacs-mime-ja")
         ("wl@lists.airs.net" . "+ml/emacsen/wl")
         ("skk@ring.gr.jp" . "+ml/emacsen/skk")
         ("emacs-w3m@namazu.org" . "+ml/emacsen/emacs-w3m")
         ("bbdb@tutrp.tut.ac.jp" . "+ml/emacsen/bbdb")
         ("yatex@yatex.org" . "+ml/emacsen/yatex"))))

;; Expire
(setq wl-expire-alist
      `((,(concat "^\\" wl-trash-folder "$") (date 7) remove)
        ("^\\+mag/" (date 30) remove)
        ("^\\.ads$" (date 15) remove)
        ;;("^@" (date 30) remove)
        ("^\\+ml/linux-jp/doluc$" (number 300 500) hide)
        ("^\\+ml/splab$" (number 300 500) hide)
        ))
(add-hook 'wl-summary-prepared-hook 'wl-summary-expire)

如何插入附件

WandeLust 用 SEMI 这个包处理 MIME。如果你对 MIME 没有概念的话,简单来说就是 附件处理。你只要在 wl-draft-mode 下按 C-c C-x TAB mime-edit-insert-file 就可以插入附件了。

如何利用 Org-mode 发送 html 邮件

先做如下配置:

(setq org-mime-library 'semi)

然后只需要在 org-mode 中写好邮件内容后运行 M-x org-mime-org-buffer-htmlize ,就会新建一封 html 格式的邮件。

X-face

有时候在 Article buffer 顶部有个小小的图片,是什么?我发的帖子如何加上?

那些图片称为 X-Face,是一些 48*48 的黑白图片,被编码为一行邮件头 (header line),如果你也想加一个,需要把图片转换 X-Face。用一个图片处 理程序(比如 gimp),打开你想要的图片,剪切相应部分,将颜色降低为 1bit,改变大小到 48*48,另存为位图(bitmap)。从 this site (ftp://ftp.cs.indiana.edu:/pub/faces/) 取来 compface 包,通过如下命 令,创建一个 X-face:

cat file.xbm | xbm2ikon |compface > file.face cat ./file.face | sed ‘s/\/\/g’ | sed ‘s/"/\”/g’ > ./file.face.quoted

如果不能使用 compface,还有另一个 X-face 转换器: http://www.dairiki.org/xface/. 如果在 MS Windows 上,也可以用 WinFace 程序:http://www.xs4all.nl/~walterln/winface/. 然后只需要 在 ~/.gnus 中告诉 Gnus 在你的帖子里面加入 X-face:

(setq message-default-headers (with-temp-buffer (insert “X-Face: “) (insert-file-contents “~/.xemacs/xface”) (buffer-string)))

From: http://blog.csdn.net/lujun9972/article/details/46002803

X-face 是在邮件/新闻组时代很流行的东西。就和现在的 Gravatar 差不多。甚至以 前的 IRC 也能显示 X-face 头像。

原理就是在邮件的 Header 部分嵌入一段专门的代码,在读入的时候转换成一个 48x48 的黑白图片,比如我的头像的代码就是:

0@1]t/p1\-TYA>y*B},]Iv$z1v-o$C/G)\m9=?bWtc9/yca-)cV,[jIwgM(=|h85EAfU7'+b_|+m$TU.6bsD5SGd/RTu.h+}8b>OCDNCDr_#zv"H:o23#+m@g5USw)-74icq8Q(6Dy?Lkc+3P&v%2yerI[)FWEljAhOcZKz3bH6b&QEYd{Vm'g]\7.5bCsb?jqKKk0e%SlU[sL'Jok%WNH_ql4c;/HD`OR,3NBbzKgT9$Mbz;"y~;&Gi-3aa

在 WanderLust 中,设置 X-face 很简单,只要把生成的代码作为纯文本文件保存在 ~/.xface 就会自动读取。

但是显示出来只是代码,不是图片?

这个嘛,我看了看 WanderLust 的手册,里面提到要用 Mule 来处理。Mule 是 Emacs 21 之前不支持 UTF-8 的时候用来处理字体和编码的包,现在 Emacs 21 以后可以用 x-face-e21.el 来处理,不需要 Mule。

可以在这里下载: http://www.jpl.org/ftp/pub/elisp/

然后

(autoload 'x-face-decode-message-header "x-face-e21")
(setq wl-highlight-x-face-function 'x-face-decode-message-header)

你还要从包管理器装 compface 来转换出图片。

乱码?

出现乱码,可以设置 wl-mime-charset 为 =’gbk= ,或者其它合适的值。你也可以设 置 wl-folder-mime-charset-alist

如果是标题部分出现乱码,这可不是 WanderLust 的错,而是因为对方用了不规范的邮 件头编码,不过你可以通过设置 mime-header-accept-quoted-encoded-words 来让它 能正确解码不规范的邮件头。