mew-emacs下的邮件客户端

简介

unix 世界的邮件客户端很丰富,有跨平台的 thunderbirdevolution, 无穷定制性的 muttemacs 上的邮件客户端有强大的 gnus,作为 新闻组阅读器实在舒适。

unix 的哲学思想为 "do one thing better",因此在 unix 的世界中,邮件程序 依据功能可以细分为 [MUA],[MTA] 和 [MDA]。mutt 和 gnus 这些定制性强的邮件客户端也很依赖这些强大 的工具,功能的实现也依赖于这些工具的搭配,曾经自己也有几番尝试 mutt 的经 历,但都失败了。

几番搜索比较后,选择了 mew 作为邮件客户端,一如 所有的 emacs 的插件,强大和无穷的定制性。

  • 可以自给自足,不依赖于 MTA 和 MDA,因此 mutt 的跨平台要好的多,可以在 windows 上使用。
  • 强大的过滤器定制,在 mew 中称为 refile。而且 mew 自动 refile 还是比较 准确和人性化的。
  • mew 为来自日本的作品。因此相比 gnus 对 cjk 的支持要完善。
  • mew 内建的丰富模式,一共六种,有 summary, virtual meaaage, draft, header, edit, addrbook mode。
  • mew 的配色相比 gnus 实在是非常的舒服,也是最初吸引自己的原因。
  • mew 内建的无处不在的强大的补全机制,使得撰写处理阅读邮件很便捷。

安装

mew 的安装在 linux 下很简单,如果是 gentoo 的话,可以直接通过命令 "emerge app-emacs/mew" 安装。如果是想要手动管理各个 elisp 拓展,那可以 通过 autotools 进行安装,更推荐前者。mew 在 windows 上的安装可以参考 mew 目录下的 "00readme.w32" 文件。

mew 在 windows 的安装上比较折腾,不得不说, emacs 在 windows 上使用相较 于 unix 要辛苦的多。mew 对于邮件附件的处理依赖于 unix 的各个组件, windows 上的 mew 基本是无对附件的处理能力。如果需要 mew 的 ssl 加密连接功能,必须要安装 stunnel3 版本,stunnel4 的版本总是会处于无法相 应的状态。

(if (string-equal system-type "windows-nt")
    ;; Note,in windows,you must use replace stunnel4 with stunnel3 version.
    (setq mew-prog-ssl  "C:/Program Files/stunnel/stunnel.exe")
  (setq mew-prog-ssl "/usr/bin/stunnel"))

配置

mew 的 初始化必要代码建议写入 ~/.emacs 文件中,而 mew 单独的配置建议保存 在 ~/.mew.el 文件中,mew 在启动时会读取此文件中的配置内容。

初始化配置

安装完之后还需要在 ~/.emacs 文件中加入如下必要代码以告诉 emacs 如何启动 mew。

(autoload 'mew "mew" nil t)
(autoload 'mew-send "mew" nil t)

;; Optional setup (Read Mail menu for Emacs 21):
(if (boundp 'read-mail-command)
    (setq read-mail-command 'mew))

;; Optional setup (e.g. C-xm for sending a message):
(autoload 'mew-user-agent-compose "mew" nil t)
(if (boundp 'mail-user-agent)
    (setq mail-user-agent 'mew-user-agent))
(if (fboundp 'define-mail-user-agent)
    (define-mail-user-agent
      'mew-user-agent
      'mew-user-agent-compose
      'mew-draft-send-message
      'mew-draft-kill
      'mew-send-hook))

帐号设置

对于邮件服务的设置,在 mew 中即被映射为对 mailbox 的设置,mew 中对于 邮件的组织是通过 mailbox 完成的。相应的有 3 种类型的 mailbox,分别表示着 local/pop/imap/nntp/,即不同的邮件箱对应着不同的邮件协议,通过变量 proto 进行设置。

包含邮件的 mailbox 在 mew 中被称为 folder,而 folder 的名称由两部分组 成:proto + string。proto 相应的有三种类型,分别以 +/$/%/- 对应着 local/pop/imap/nntp, 如 +inbox 即为最典型的 folder。相应的 mew 的文件 夹分为两类,本地 folder 和 远程 folder,本地 folder 有四种类型, +inbox/+draft/+quene/+postq。远程 folder 根据协议既可以分为三种类 型,$folder/%folder/-folder,如$inbox/$inbox/-fj.mail.reader.mew。

通常来说,如果需要收发邮件,可以设置 'mew-name','mew-user', 'mew-smtp-server' 变量,然后根据收取邮件时使用的协议,再设置 'mew-pop-server' 或是 'mew-imap-server' 即可。

例如,如果你需要通过 POP3 的方式使用 Gmail,以下即为简单的示例。

(setq mew-name "username")
(setq mew-pop-user "popuser@gmail")
(setq mew-pop-server "pop.gmail.com")
(setq mew-smtp-user "smtpuser@gmail.com")
(setq mew-smtp-server "smtp.gmail.com")

当然,mew 也提供了通过 'mew-config-alist' 变量对相应变量进行集中设置管理 的方法。如下为相应的示例。

(setq mew-config-alist
      '(
        ("default"
         ("pop-server"           . "pop.gmail.com")
         ("name"                 . "username")
         ("user"                 . "user")
         ("mail-domain"          . "gmail.com")
         ("pop-user"             . "popuser@gmail.com")
         ("smtp-user"            . "smtpuser@gmail.com")
         ("smtp-server"          . "smtp.gmail.com")
        ))

从 mew 6.1 版本开始,mew 使用了改进格式的配置文件,但旧的配置文件格式也 可以同样兼容,更推荐采用新的配置文件格式。关于新旧配置文件之间的区别可以 参考 mew 的使用手册。

如下为上例对应的新的文件配置格式。

(setq mew-config-alist
      '(
        (default
         (pop-server            "pop.gmail.com")
         (name                  "username")
         (user                  "user")
         (mail-domain           "gmail.com")
         (pop-user              "popuser@gmail.com")
         (smtp-user             "smtpuser@gmail.com")
         (smtp-server           "smtp.gmail.com")
        ))

'mew-config-alist' 更强大方便的使用之处是实现 mew 对多账户的良好支持, 可以同时设置 imap/pop3/nntp/local folder。如下为 gmail 的 imap 和 smtp 的设 置和新闻组的简要示例,示例采用新的 'mew-config-alist' 配置文件格式。

(setq mew-config-alist
      '(
        ;; Default fetch mailbox is IMAP
        (default
         (mailbox-type          imap)
         (proto                 "%")
         (imap-server           "imap.gmail.com")
         (imap-user             "imapuser@gmail.com")
         (name                  "User Mew")
         (user                  "user")
         (mail-domain           "gmail.com")
         (imap-size             0)
         (imap-delete           t)
         (imap-queue-folder     "%queue")
         (imap-trash-folder     "%Trash") ;; This must be in concile with your IMAP box setup
         (smtp-auth-list        ("PLAIN" "LOGIN" "CRAM-MD5")) 
         (smtp-user             "smtpuser@gmail.com")
         (smtp-server           "smtp.gmail.com")

         ;; news group comp.lang.c
       (usenet
        (mailbox-type         . mbox)
        (proto                . -)
        (nntp-server           "news.aioe.org")
        (nntp-user             nil) ;; should be nil defaulty
        (nntp-header-only      nil)
        (nntp-newsgroup        "-comp.lang.c") ;; little '-'
        (nntp-size             0)
        (nntp-msgid-user       "User Mew")
        (smtp-auth-list        ("PLAIN" "LOGIN" "CRAM-MD5"))
        (smtp-user             "smtpuser@gmail.com")
        (smtp-server           "smtp.gmail.com")

        (mailinglist
         (mailbox-type          pop)
         (proto                 +)
         (pop-server            "pop.gmail.com")
         (name                  "User Mew")
         (user                  "user")
         (mail-domain           "gmail.com")
         (pop-auth              pass)
         (pop-user              "popuser@gmail.com")
         (smtp-user             "smtpuser@gmail.com")
         (smtp-server           "smtp.gmail.com")
        ))

在如上的示例中,我们分别定义了三个 folder,"default","usenet" 和 "mailinglist"。如果我们切换至 "usenet" folder,mew 默认会收取 comp.lang.c 新闻组上的帖子,而如过切换至 "mailing" folder,mew就会使用 pop 协议收取 Gmail 上的邮件。默认使用 mew 时,使用的为 "default" folder, 即使用 imap 协议 收取 Gmail 邮件。在 summary-mode 中,可以通过快捷键 "C" 方便地在不同 folder 之间切换。

引用,回复与签名档

mew 可以灵活的设置如何引用邮件上下文,定制引用的格式。mew的引用是由变量 mew-cite-fields 控制,有 From,Subject,Date 域,具体的引用样式由 mew-cite-format 设置。 mew 默认的配置如下:

(defvar mew-cite-fields '("From:" "Subject:" "Date:"))
(defvar mew-cite-format "From: %s\nSubject: %s\nDate: %s\n\n")
(defvar mew-cite-prefix "> ")

如果需要修改为 Gmail 的引用格式,可以只选择 From 和 Date 域,然后修改 mew-cite-format 即可。

(setq mew-cite-fields '("Date:"  "From:"))
(setq mew-cite-format "On %s %s wrote:\n\n")

如何回复,回复的位置,大概是邮件中争论最多的地方。基本上所有邮件的 web 客户端,Gmail,outlook 都默认使用上回复(top-posting),但是邮件列表和新闻 组(usenet)提倡下回复(bottom-posting),在一个社区中使用“错误”的风格,可能 被视作严重违反网络礼仪,从而遭致社区成员的激烈反应。 可以参考 wikipython的邮件列表规范 和礼节

回到 mew 的设置,通过设置变量 mew-summary-reply-with-citation-position 可以选择是使用上回复或是下回复。如果设置为 body,即回复出现在引文之前, 名为上回复,如设置为 end,在引文后回复,使用下回复样式。

mew 默认使用的邮件签名档位于 ~/.signature 文件,由变量 mew-signature-file 控制,快捷键 'C-c TAB' 会在光标处插入签名档。建议将签名档放置在邮件的末 尾,可以通过 mew-signature-as-lastpart’ 与 ‘mew-signature-insert-last’ 设置。如果需要在撰写或是回复邮件时,需要自动插入签名档,可以通过 mew-draft-mode-newdraft-hook 进行插入。

(setq mew-signature-file "~/Mail/signature")
(setq mew-signature-as-lastpart t)
(setq mew-signature-insert-last t)
(add-hook 'mew-before-cite-hook 'mew-header-goto-body)
(add-hook 'mew-draft-mode-newdraft-hook 'mew-draft-insert-signature)

refile

对于邮件列表和新闻组,邮件过滤和 thread 功能是不可或缺的。 mew 的邮件过滤功能,或是 mew 的术语称谓的 refile 很强大而实用。refile 功能对于 pop 邮箱而言非常实用,gmail 的 imap 由于可以使用 filter 与 label 的组合,也 非常的完美。

如果为设置任何的 refile rules,在 summary-mode 里面按 o 即可对当前邮件进 行分类,mew 会问你把邮件分类到哪个文件夹里面去,并提供了一个默认的选项, 通常情况下默认选项就是正确的选项,所以直接回车就可以了。

虽然 mew 的 refil-by-guess 很方便,但是更加使用的还是自定义 refile rules。 mew 提供的 refile 非常丰富,但感觉实用可定性好的还是 Guess by user defined rules。例如,如果你订阅了 octave,freebsd 的帮助邮件列表, 很自然的会需要把此三个邮件列表的邮件分开存放在不同的本地文件下,而通常的 邮件会存放到 inbox folder。相应的只需要把邮件头的 To 和 Cc 域里包含有 "@octave.org" 的邮件 refile 到 +math/octave 文件夹中,同时把 To 和 Cc 域里含有 "@freebsd.org"的邮件 refile 到 +unix/freebsd,就可以使用如下的实例代码。 更详尽的 refile rules 可以参考 mew 的使用手册。

(setq mew-refile-guess-alist
      '(("To:"
         ("@octave.org"                       . "+math/octave")
         ("@freebsd.org"                      . "+unix/freebsd"))
        ("Cc:"
         ("@octave.org"                       . "+math/octave")
         ("@freebsd.org"                      . "+unix/freebsd"))
        (nil . "+inbox")))
(setq mew-refile-guess-control
      '(mew-refile-guess-by-folder
        mew-refile-guess-by-alist))

完成 refile rules 后,在收取邮件后,按下 'M-o' 即可对当前 mode 下的邮件 按照定义的 rules 进行 refile。然后,你想要查阅 octave 邮件列表,只需要按 下 'g' 与 '+math/octave',就可以切换到 octave 文件夹,此时再按下 'tt', 既可以进入 mew 提供的 thread 功能,此时的 mode 称为 virtual folder mode,mew 会指示出各个邮件之间的层次关系,非常方便。

如果只使用小写字母命名自己的邮件文件夹的话,可以把 "mew-use-fast-refile" 设置为 t 用于加快速度。

使用 folder

在邮件服务设置完成后,就需要获取远程的邮件到本地的 +inbox folder。当输入 'M-x mew',mew 会依据 'mew-mailbox-type' 获取相应协议的邮件。但此时 位于 summary 模式时,只需输入 'i' 即可。如果用 mew 处理邮件一段时间后,需要再 查收远程 folder 上的邮件,试试 's' 快捷键。对于 IMAP 和 NetNews,更加建 议使用 's',而非 'i'。当按下 's' 时,mew 会向你询问 range,一般而言输入 'sync' 比较合适,这会同步本地 folder,即删除已在远程服务器上删除的邮件和 收取新接受的邮件。当使用 'C-u s'快捷键时,可以在仅获取邮件头和获取完整邮 件信息间切换,相应的这是由诸如 'mew-pop-header-only' 变量定义的。对于邮 件列表和新闻组而言,跟推荐获取完整的邮件信息,刻意离线查阅,非常方便。

使用 Gmail IMAP 非常方便,使用 mew 配合 Gmail 的 filter 与 label 可以对 邮件进行很有效的管理。如你当下在 %inbox,如果需要切换到 'All sent',只需 要输入 'g',然后输入 '%[Gmail]/All Mail' 或者使用 mew 提供方便的自动补全 机制。mew 使用 folder 管理邮件,而在各个 folder 进行切换的快捷键既是方便 的 'g'。

快捷键

mew 的日常使用可以通过各种 mode 上的菜单完成,使用快捷键也非常方便。

w 撰写新邮件
a 回复邮件,不带引用
A 回复邮件,带引用
f 转发邮件
r 重新发送邮件
SPC 阅读邮件
y 保存文件(可以保存信件全文、信件正文、附件)
C-c C-l 转换当前邮件的编码格式
C-c C-a 加入地址薄
C-u C-c C-a C-c C-a 多加入昵称和名字
C-c C-q 不保存退出
C-c C-a 准备插入附件
mew-attach-copy 用复制方式加入附件
mew-attach-link 用链接方式加入附件
mew-attach-delete 删除附件
C-c C-c 发送邮件
C-c RET 保存邮件到发送队列
C 如果设置了多个邮箱,用 C 命令切换
Q 退出Mew

Tips

summary-mode

各个 folder 的 summary-mode 显示邮件的样式由 "mew-summary-form' 控制,通 过对此变量的控制,你可以具体定制 summary-mode 显示的邮件域。特别的, summary-mode 中的 from 域还可以由变量 'mew-summary-form-extract-rule'进 行具体的设置,可以在 'nickname",'name",'address" 和 'comment。 自己为了使 summary-mode 显示看起来不是很拥挤,不显示 "Body:" 域,并且 增加了 "Subject:" 域,更改 from 仅仅显示寄件人的 name。

(setq mew-summary-form
      '(type (5 date) " " (14 from) " " t (0 subj)))
(setq mew-summary-form-extract-rule '(name))

在设置调整好变量后,你可能会发现 summary-mode 还是没有任何变化,这是由于 mew 的默认缓存机制所致,你可以手动删除缓存文件强制 mew 重新生成。缓存文 件位于相应 folder 下,例如:~/Mail/inbox/.mew-summary 。

Spam

设置 "mew-summary-form-mark-spam" 为 t 可以在 spam message 前制动添加 D。