Tag Archives: mutt

配置mutt收发邮件

(这篇blog的草稿已经在草稿箱里呆了一年了,趁这次五一赶紧写完吧,乱七八糟胡说一通,算是给自己留个参考)

对mutt仰望已久,还有那句著名的”All mail clients suck. This one just sucks less.”。由于一开始接触email就是webmail,导致我对email系统极其不熟悉,什么MUA,MTA,MDA,MRA,各种概念完全不清楚。这也导致我前一次尝试mutt失败。(对各种概念的简单解释请看Mutt的Mail concept

这次再次挑战mutt是因为遇到了真实的需求——发patch,webmail或者其他一些mail client对patch都不够友好,可能会自动断行,自动把tab换成空格等等,收到patch也不方便从网页上复制粘贴(虽然我还用不着收patch,没人给我发啊……)。所以这次mutt就真正派上用场了。

网上配置mutt的文章一搜一堆,不过我还是看gentoo的文档写的最清晰也最明了,gentoo的文档果然名不虚传。地址在这里。按照这个文档应该就能配置出能用的mutt了,我也按照自己的理解写一下我的配置。

我使用fetchmail收信,用msmtp发信,用mutt做mail client管理邮件。

首先是MRA(Mail Retrieval Agent),也就是收信的。mutt里支持pop3,但我还是按照gentoo的文档,配置了fetchmail作为我的MRA。

# ~/.fetchmailrc
poll mail.example.com protocol imap authenticate gssapi user eguan keep ssl folder Inbox
mda "/usr/bin/procmail -d %T"
set daemon 180
  • 第一行poll是说从哪里获取邮件,用什么协议,如何认证,keep表示不删除服务器上的邮件,folder后边表示从哪些文件夹里取邮件,这里是Inbox,如果还有其他文件夹都写上。
  • 第二行是指定MDA,负责邮件分发,要不所有邮件都在一个文件里,不方便管理。
  • 第三行设置fetchmail以daemon方式运行,每180秒收一次邮件。

其次是MDA(Mail Delivery Agent),做信件的分发。说白了就是根据不同的邮件列表/收件人/发件人把邮件归类。我使用procmail,以把所有redhat bugzilla的邮件都放入bugzilla这个文件中为例

# ~/.procmailrc
PATH=$HOME/bin:/usr/bin:/usr/ucb:/bin:/usr/local/bin:.
MAILDIR=$HOME/.mail
DEFAULT=$MAILDIR/mbox
LOGFILE=$MAILDIR/from
LOCKFILE=$MAILDIR/.lockmail

:0
* ^(From):.*bugzilla@redhat.com
bugzilla
  • 首先是一些环境变量的设置,DEFAULT是当所有规则都没有匹配的时候邮件的默认归类
  • 然后是把所有由 *bugzilla@redhat.com 发来的信件都放入bugzilla归类(其实就是$MAILDIR/bugzilla这个文件中)。其中的详细语法不清楚,不过根据这个配置改写其他的配置应该还是比较简单的。
  • 再次是MSA(Mail Submission Agent),也就是发送邮件,我用的是msmtp这个程序,感觉很不错。

    # ~/.msmtprc
    defaults
    logfile ~/.msmtp.log
    
    # Gmail account
    account gmail
    host smtp.gmail.com
    port 587
    tls on
    tls_trust_file /etc/pki/tls/certs/ca-bundle.crt
    from yourname@gmail.com
    auth on
    user yourname@gmail.com
    password your_passwd
    

    msmtp的一个好处是可以设置多个account,可以用命令行参数选择想用的帐号。

    最后就是MUA(Mail User Agent)了,这里也就是mutt。这个配置好多,不详细说了,好多东西自己也不清楚……还是多google多看mutt的手册吧。手册内容非常丰富,有特定需求的时候再去看就可以了。这里把配置贴一下,给个参考吧。

    # Set mail from header
    set use_from=yes
    set realname='Your Name Here'
    set from='Your Name '
    
    # Folders
    set spoolfile="~/.mail/mbox"
    set folder="~/.mail"         # Local mailboxes stored here
    set record="+sent"           # Where to store sent messages
    set postponed="+postponed"   # Where to store draft messages
    set mbox_type=mbox           # Mailbox type
    set move=no                  # Don't move mail from spool
    
    # Set mail boxes
    mailboxes =mbox
    mailboxes =postponed
    mailboxes =sent
    mailboxes =bugzilla
    
    # 
    # Some configs
    #
    
    set askcc	# prompt for cc's
    set help	# show help on first line of display
    set pager_stop	# don't go to next message at end of message
    unset mark_old	# don't mark unread messages as Old
    
    set sendmail="/usr/bin/msmtp"	# use msmtp rather than sendmail.
    set editor="vim"		# use vim as editor
    set pager_context=1		# display one line context on pageup/pagedown
    set quit=ask-yes		# confirm quit, default to yes
    set ispell="aspell -e -c"	# spell checker
    set include=yes			# include original message in reply
    
    #set sort='reverse-threads'
    set sort=threads
    set sort_aux='last-date-received'
    
    # Set send charset
    set send_charset="us-ascii:utf-8"
    
    # To recognize reply messages
    set reply_regexp="^(re([[0-9]+])*|aw|回复|答复)(:|:)[ t]*"
    
    # Include attachments in forward emails
    set mime_forward=yes
    set mime_forward_rest=yes
    
    # Traditional Fwd: subject
    set forward_format="Fwd: %s"
    
    # Display settings
    set index_format="%4C %Z %{%b %d} %?X?%X& ? %-18.18L [%4c] %s"
    
    # Alias setup
    set alias_file= ~/.mutt/aliases
    set sort_alias= alias
    set reverse_alias=yes
    source $alias_file
    
    # 
    # Key bindings
    #
    bind index gg first-entry
    bind index G last-entry
    bind index cf next-page
    bind index cb previous-page
    bind index Cx sync-mailbox
    bind index r display-message
    bind index R reply
    bind index = parent-message
    
    bind pager j next-line
    bind pager k previous-line
    bind pager  previous-line
    bind pager  next-line
    bind pager gg top
    bind pager G bottom
    bind pager n next-entry
    bind pager p previous-entry
    bind pager = parent-message
    bind pager N search-next
    
    bind index,pager L group-reply
    bind index,pager S resend-message
    
    bind generic zt current-top
    bind generic zb current-bottom
    bind generic zz current-middle
    bind editor  noop
    
    #
    # Macros
    #
    
    # Mark all as read
    macro index A "T.*n;WN;^t.*n" "Mark all as read"
    
    # Quit from index view and return to mailboxes view
    macro index q '?'
    macro browser q ''
    
    # Run fetchmail by hitting key of ~
    macro index ~ "!fetchmail -k -m 'procmail -d %T'r"
    macro pager ~ "!fetchmail -k -m 'procmail -d %T'r"
    
    #
    # Color setup
    #
    color header brightred black subject
    color hdrdefault brightwhite black
    color quoted brightgreen black
    color status black cyan
    color indicator default green
    # email address
    color body yellow default [-a-z_0-9.]+@[-a-z_0-9.]+
    color header brightyellow default [-a-z_0-9.]+@[-a-z_0-9.]+
    # URLS
    color body brightmagenta default "(ftp|http)://[^ ]+"
    # mails cced myself
    color index brightblue black   '~c yourmail@example.com'
    # mails to myself
    color index brightyellow black   '~t yourmail@example.com'
    # mails sent from myself
    color index cyan black   '~f yourmail@example.com'
    
    #
    # Auto view
    #
    set mailcap_path=~/.mutt/mailcap
    auto_view text/html application/pdf application/msword
    

    最后简单说一下用 git send-email 配合msmtp发送patch。假设已经用git format-patch生成好要发送的patch了,那么

    git format-patch -1 
    git send-email --to xxx@yyy.com --cc sb@ex.com --smtp-server=/usr/bin/msmtp 0001-xxx.patch
    

    主要就是 –smtp-server这个参数指定发送程序。只要配置好了msmtp就可以发patch了,很方便。