几年前曾经写过 一篇blog ,讲gnus如何搭配fetchmail收取邮件。但是后来由于Gmail实在太好用了,所以完全投靠了web mail,而不再使用客户端。不过,最近由于gmail被墙得半身不遂,gnus又派上了用场。另外,我看到现在网络上关于gnus这个怪物的中文说明五花八门,而且不少无用的内容,遂把原来的blog再重新整理一下,补充一些内容。
gnus有很多的后端,可以上新闻组,也可以读邮件。由于国内网络阻尼太大,imap的方式经常会hang住emacs,因此,这里只讲述一种最传统的邮件管理风格:
- 收取邮件:fetchmail → procmail → gnus
- 发送邮件:gnus → msmtp
fetchmail
虽然fetchmail支持imap,但是我认为它只适合做pop3的拍档,因为fetchmail收取imap会把邮箱的未读标记弄乱。这里给出一个适合gmail的 ~/.fetchmailrc
:
poll pop.gmail.com with proto POP3 uidl no dns
user 'username@gmail.com'
password 'password' is jqian here
options keep ssl
sslcertck
sslcertpath /etc/ssl/certs
mda "/usr/bin/procmail -d %T"
其中, uidl
表示只收取新的邮件, sslcertpath
指向你系统上的证书位置(上面给出的是ubuntu里openssl证书的位置)。另外,你可以使用如下命令来检查你的设置:
$ fetchmail --configdump
最后,在crontab里让fetchmail定时抓取邮件。
procmail
一般这些古老的工具分工明确,fetchmail只管收取邮件,而procmail用来过滤邮件,把邮件保存到你所指定的位置去。而一般邮件有两种保存格式 mbox 和 Maildir ,前者保存到一个文件,后者为分级目录,这里我选择保存为Maildir:
PATH = /bin:/usr/bin:/usr/local/bin
MAILDIR = $HOME/Mail
DEFAULT = $MAILDIR/inbox
LOCKFILE = $MAILDIR/.lock
VERBOSE = on
:0:
${DEFAULT}
procmail的过滤规则可以非常复杂,这里我只是简单的让它把邮件全部保存到 ~/Mail/inbox
目录里,到gnus里再按规则分类。
gnus
由于任务分工了,所以这里gnus只是单纯作为一个邮件管理界面,并不管收发。这时候其实只需要一条elisp就可以让gnus工作起来:
(setq gnus-select-method '(nnmaildir "" (directory "~/Mail/")))
不过,如果除了让gnus管理邮件,你还想管理新闻组,那最好不要这么霸道,请使用 gnus-secondary-select-methods
,同样可以工作:
(setq gnus-secondary-select-methods '((nntp "localhost") ; leafnode
(nnmaildir "" (directory "~/Mail/"))))
然后,M-x gnus,你会看到类似这样的界面:
File Options Buffers Tools Gnus Groups Group Agent Help
0: nndraft:queue
0: nndraft:drafts
TU:--- *Group* {nnmaildir:} 2:2L 48(Group Plugged)-----------------------------
不是吧,什么也没有?……因为默认 gnus-default-subscribed-newsgroups
是空的,你需要订阅你所关心的group。先按^ (gnus-enter-server-mode
) 罗列出所有的server,就像下边这样:
File Options Buffers Tools Connections Server Agent Help
{nnmaildir:} (opened) (agent)
TU:--- *Server* 1:1L 34(Server Plugged)------------------------------------
看到nnmaildir了吧,这就对应于邮件Maildir格式,RET 后进入,在 inbox
前按u订阅即可,回到group界面,你会看到多了一个group,那就是你收下来的邮件。另外,默认RET进入该group只会显示未读邮件,如果期望显示所有邮件使用C-u RET进入。
File Options Buffers Tools Gnus Groups Group Agent Help
0: nndraft:queue
0: nndraft:drafts
10:*inbox
TU:--- *Group* {nnmaildir:} 2:2L 68(Group Plugged)-----------------------------
不过这还只是初步能用,更多的内容大家可以翻阅Info相关章节,包括 Group Parameters、Posting Styles、Splitting Mail、Article Buffer、Summary Buffer、Group Buffer、Expiring Mail等。
最后讲如何发送邮件,gnus里也只需要一条elisp即可:
(setq message-send-mail-function 'message-send-mail-with-sendmail
sendmail-program "msmtp")
把所有发送邮件的任务推给msmtp吧。
msmtp
msmtp 是个短小精悍的smtp客户端,顾名思义,它支持管理多个SMTP账户,这里我只给出Gmail的配置:
account gmail
host smtp.gmail.com
tls on
tls_certcheck off
tls_starttls on
auth on
user username@gmail.com
password gmail_password
port 587
如果你期望在gnus里根据不同的邮件使用不同的smtp账户来发送邮件,通过 设置 message-sendmail-extra-arguments
来实现。