邮件管理软件mutt全系统配置详解(neomutt getmail6 msmtp pass abook)

【Mutt简介】

Mutt是一个功能强大的字符界面邮件管理软件。相比图形界面邮件管理软件如thunderbird来说,它具有更丰富的功能、更大的可定制性和更简洁的界面。目前linux下最常用的图形界面邮件管理软件应该是thunderbird,它也非常优秀(我在windows下就是用thunderbird),配置简单,能满足大部分需求。但是占用资源稍大,而且配置比较死板,比如它都是用mbox格式存储邮件,不能换成新的Maildir格式(一直放出风声要换,目前还没有)。比如你在某邮箱下用pop3收取邮件,如果要改成IMAP,对不起不能直接改,要换账户。比如你想把储存的大邮件统一去掉附件,好像也不好办。然后,linux是有系统邮件的,早年的thunderbird可以收,现在至少我没找到这个设置。这些问题在Mutt下都不是问题。

但是Mutt也有麻烦的地方:Mutt本身配置就比较复杂。而且Mutt设计思想就是只管邮件管理(现在有简单收发功能了),收信发信都由其它软件实现。所以要实现完整的收发、管理邮件,必须要几个软件一起协作,所以又涉及其它软件设置。这就导致初学Mutt感觉特别麻烦。本文参考网上其他牛人给出的配置说明,给出整个Mutt系统的详细配置,看完了模仿下就能简单上手Mutt,实现多账户收发邮件,并且让Mutt具有漂亮实用的收信界面。我的mutt界面如图:

下面简单介绍下整个Mutt系统的相关软件:

neomutt:打了一堆补丁的改进版Mutt,用mutt也行,但是muttrc要稍作修改。

getmail6:收取邮件(这个软件和getmail5不是一个作者,目前getmail5作者在主页上放出风声要求debian 12移除getmail6,换回getmail5,而且官方也答应了。getmail5用法和getmail6差不多)

msmtp:发送邮件

pass:管理密码

abook:管理地址簿

安装所有软件:

sudo apt install neomutt getmail6 msmtp pass abook

注意千万不要装msmtp-mta,否则会卸掉exim4,导致系统邮件无法收取。只要装msmtp即可。

1 个赞

【Mutt配置文件】

无论neomutt还是mutt都可以读取~/.muttrc作为配置,当然也有其它路径。在此先给出配好的整个配置文件示例,后面介绍到相关配置时再引用。你可以先把以下内容保存为~/.muttrc,并把一些个人部分按照你的情况修改。这个配置有2个个人邮箱:a@163.com和1@qq.com,a@163.com用pop3收信,1@qq.com用IMAP收信,对应的本地邮箱名为163和qq。还有一个系统邮箱/var/mail/你的用户名,debian会发送系统邮件到这里。比如你输错sudo,它就会发警告邮件。如果没有,要sudo dpkg-reconfigure exim4-config,在最后一项:系统邮件投递用户名,输入你的用户名即可。

--------.muttrc--------

#编辑器 直接在 Mutt 的终端里使用vim

set editor="gvim -f"

#设置邮件发送程序

set sendmail="/usr/bin/msmtp"

# 收信配置,建立信箱,用=替代folder指定目录

set mbox_type=Maildir #新建立的邮箱采用Maildir格式

set folder="~/Mail"

set mbox="=163"

set spoolfile="=163" #默认打开邮箱

set trash="=trash" #垃圾邮箱

set header_cache="~/Mail/.hcache" #信件缓存

# 让mutt监视下面几个邮箱,并随时报告新邮件

named-mailboxes "163" "=163" "163-草稿箱" "=163-draft" \

"QQ" "=qq" "QQ-草稿箱" "=qq-draft" \

"系统" "/var/mail/你的用户名" "回收站" "=trash"

set check_new = yes

set timeout = 600

#侧边栏设置

set sidebar_visible

set sidebar_format = "%D%?F? [%F]?%* %?N?%N/?%S"

set mail_check_stats #随时检查当前邮箱状态

set sidebar_non_empty_mailbox_only #不显示空邮箱

# 发送新邮件通知

set new_mail_command="notify-send --icon='/usr/share/pixmaps/neomutt.xpm' '%b 个邮箱有新邮件' &"

#你有可能收到信件的地址

alternates "a@163.com" "1@qq.com"

#显示标志

set to_chars=" +TCFL"

#设置回复引用格式,!命令其使用中文的时间格式是必要的,否则发信后显示变成英文格式

set attribution="* %n <%a> [%{!%Y-%m-%d %H:%M:%S}]:\n"

#set date_format="!%Y %b%d, 星期%a %I:%M"

#这是一个格式字符串,用来控制你的index的列表显示。它的缺省定义是

#set index_format="%4C %Z %{!%b%d} %-15.15L [%4l] %?y?[%.20Y]?%s"

#控制folder列表显示的格式字符串

#set folder_format="%2C %F %d %8s %N %f"

#这是一个 bool 型变量。它表明你在回信时引用原文是否加入原文的邮件头。

set header=no

#可以设置为 yes, no, ask-yes, 或者 ask-no. 这是说,当你按q退出时,是否提示你(ask-yes,ask-no),

#还是直接就退出了(yes),还是根本不理你(no)。

set quit=ask-yes

#这也是一个提示性变量。它是确定当你退出时,是否提示你把信件从 spool 移动到的 mbox 文件。

set move=no

#当 Mutt 用 thread 方式显示时,是否用纯 ascii 表示树状列表,如果设成no,树状列表出现乱码的话,则设成yes。设成no界面美观些。

set ascii_chars=no

#回信时是否包含原文。

set include

#回信的引文之前插入那个符号?

set indent_str="> "

#设置你自己的邮件头。

set realname="Lin Lin"

#thread排序方式。当用 thread 排序方式时,我们按日期对各个 thread 的相对排序顺序。

set use_threads=yes sort=reverse-last-date sort_aux=date

#如果翻到最后,再按往下翻也不会翻到下一封信件

set pager_stop

#当你按 "t" 或者 "D" 之类的标记操作时,是否自动把光标移动到下一封信件。

set resolve=yes

#地址簿

#source ~/.mutt.alias

#当你在 index 里按 "a" 为来信者取别名时,使用哪一个别名文件保存这个别名。

#set alias_file=~/.mutt.alias

## 使用Abook作为地址簿

set pipe_decode=yes #传邮件之前先去掉mime编码,否则地址和人名会乱码

set query_command= "abook --mutt-query '%s'"

macro index,pager a "<pipe-message>abook --add-email-quiet<return>" "将发信人添加到Abook"

bind editor <Tab> complete-query

#你的终端支持哪一种编码的显示?这个必须和你的终端编码一样。

set charset="utf-8"

#send_charset

set send_charset="us-ascii:iso-8859-1:gb2312:utf-8"

#外部程序退出时,是否要求用户按一个键才返回。这在察看某些shell命令输出时是比要的,

#否则它们一下就消失了。

set wait_key=yes

#当你要把信件存到另一个信箱,而这个信箱已经存在时,是否提示附加?

set noconfirmappend

#是否把邮件头也放在编辑器里可以修改?

set edit_headers=yes

#是否不输入To和Subject就开始编辑?

set autoedit=yes

#如果设置,当你按 "r" 回信时,就不会再提示你输入回信地址和主题,直接进入编辑模式。

set fast_reply

#当你在用 pager 看信件时,在 index 留出多少行显示邮件列表?

set pager_index_lines=6

#告诉 Mutt 你已经订阅了那些邮件列表(mailing-list).

subscribe debian-chinese-gb@lists.debian.org

#用RFC2047 的格式编码附件

set rfc2047_parameters=yes

##字符编码设置

#如果收取邮件有乱码要设置charset-hook,没有就不用设

#处理没有用mime码编码的信乱码

set assumed_charset="utf-8:gb2312:big5" #第一个是优先使用编码,要和终端编码一致

#自动打开html邮件

auto_view text/html

#把html放最后

alternative_order text/plain text/enriched text/html

#把mutt发送的from域作为sendmail发送邮件的sender(否则会用user@localdomian)

set envelope_from=yes

#显示特定的邮件头

ignore *

unignore from to subject date

##快捷键

bind index,pager <C-Up> sidebar-prev # Ctrl-Up – Previous Mailbox

bind index,pager <C-Down> sidebar-next # Ctrl-Down – Next Mailbox

bind index,pager <C-Right> sidebar-open # Ctrl-Right – Open Highlighted Mailbox

##宏设置

macro index,pager G "!nohup getmails -n > /dev/null 2> /dev/null &\n" "用getmail收取信件"

#按<ESC>+m载入.muttrc而不必重新运行

macro generic \em ":source $HOME/.muttrc\r" "载入.muttrc"

macro generic \ej "!gvim $HOME/.muttrc\r" "编辑.muttrc"

#邮件备份临时宏

#macro index,pager \es "T.*<enter>;s" "将所有邮件转移到指定邮箱"

#macro index,pager \en "T~N<enter>;WN;W*T~O<enter>;WO;W*" "清除N和O标记"

##hook设置

#对其它邮箱(这里是对所有邮箱设置,但下面的指定邮箱设置会覆盖),发送邮件和延迟发送邮件不保存,不投递

folder-hook . 'set record=""; set postponed=""; unmy_hdr *; set sendmail=""'

#对163开头的邮箱设定同样邮件头和发送设置,下同

folder-hook =163.* 'set record="=163"; set postponed="=163-draft"; my_hdr From: a@163.com; set sendmail="/usr/bin/msmtp -a 163"'

folder-hook =qq.* 'set record="=qq"; set postponed="=qq-draft"; my_hdr From: 1@qq.com; set sendmail="/usr/bin/msmtp -a qq"'

##颜色设置

##这里提供了四级的引用文本

##这些设置覆盖了/etc/mutt/Muttrc 中的系统设置

color quoted green brightblack

color quoted1 magenta black

color quoted2 yellow brightblack

color quoted3 red black

color signature cyan black

# 特殊状态

color index lightcyan black "~P" # 标记自己所发信件(由alternates确定)

color index lightred black "~D" # 删除

color index lightgreen black "~U" # 未读信件

color index yellow black "~T" # 短期标记

color index lightyellow black "~F" # 长期标记

#color index magenta black "~h ^Disposition-Notification-To: !~Q" #标记附带收条的未回复信件

#这个色彩设置拷贝自 /etc/mutt/Muttrc.color

color normal lightwhite default

# color attachment brightgreen blue

# color bold brightwhite default

# color underline default blue

# color error brightwhite default

# color indicator white blue

# color message brightblue default

# color status white blue

#侧边栏颜色

color sidebar_indicator default red # Red background

#color sidebar_highlight brightwhite grey # Grey background

#color sidebar_spool_file lightyellow default # Yellow

color sidebar_unread lightcyan default # Light blue

color sidebar_new brightgreen default # Green

color sidebar_ordinary default default # Default colors

color sidebar_flagged lightred default # Red

color sidebar_divider color8 default # Dark grey
1 个赞

【收信 pass+getmail6+neomutt】

建立邮箱:

先看muttrc:

# 收信配置,建立信箱,用=替代folder指定目录

set mbox_type=Maildir #新建立的邮箱采用Maildir格式

set folder="~/Mail"

set mbox="=163"

set spoolfile="=163" #默认打开邮箱

set trash="=trash" #垃圾邮箱

# 让mutt监视下面几个邮箱,并随时报告新邮件

named-mailboxes "163" "=163" "163-草稿箱" "=163-draft" \

"QQ" "=qq" "QQ-草稿箱" "=qq-draft" \

"系统" "/var/mail/你的用户名" "回收站" "=trash"

默认邮箱目录是~/Mail,=163的=代表了默认邮箱目录,=163就是~/Mail/163。named-mailboxes “163” “=163"表示显示名称是163,实际对应邮箱是”=163"。系统邮箱是系统自建的。我们需要建立"=163" “=163-draft” “=qq” “=qq-draft” “=trash"这几个邮箱。因为我们指定了邮箱格式是Maildir,所以每个邮箱都要有cur、new、tmp三个目录。用mkdir -p ~/Mail/163/{cur,new,tmp}创立”=163"邮箱,其它类似。

设置密码管理软件pass:

创建密码对:

gpg --full-generate-key

初始化密码存储:(这个和Mutt管理的邮箱无关,是pass需要一个邮箱)

pass init a@163.com

输入公共密码

插入新密码:

pass insert a@163.com

pass insert 1@qq.com

最后pass ls就显示密码项。pass 密码项 显示密码。

设置getmail6收取邮件到指定本地邮箱:

getmai6的一个配置文件对应一个邮箱账户,并提供了一个方便的方式收取多个账户邮件。就是把配置文件都放到~/.config/getmail/,文件名随便,然后用getmails -n收取所有账户信件。163和qq邮箱配置文件分别取名为163和qq,内容如下:

--------163--------

[retriever]

# 邮箱的账户信息,用于收取邮件.

type = SimplePOP3SSLRetriever

server = pop.163.com

username = a@163.com

port = 995

password_command = ("/usr/bin/pass", "a@163.com") #调用pass

#收取所有IMAP邮件

#mailboxes = ALL

[destination]

# 如何处理已经收取到的邮件

type = Maildir

path = ~/Mail/163/

[option]

# 默认为True, 每次执行getmail收取全部邮件, False表示只收取未收取过的邮件

read_all = False

# 本地删除服务器是否也删除邮件

delete = False

message_log = ~/.getmail/getmail.log

--------qq--------

[retriever]

# 邮箱的账户信息,用于收取邮件.

type = SimpleIMAPSSLRetriever

server = imap.qq.com

username = 1

port = 993

password_command = ("/usr/bin/pass", "1@qq.com") #调用pass

#收取所有IMAP邮件

#mailboxes = ALL

[destination]

# 如何处理已经收取到的邮件

type = Maildir

path = ~/Mail/qq/

[option]

# 默认为True, 每次执行getmail收取全部邮件, False表示只收取未收取过的邮件

read_all = False

# 本地删除服务器是否也删除邮件

delete = False

message_log = ~/.getmail/getmail.log

完毕后运行getmails -n收取邮件。打开neomutt就能看到收取的邮件。在.muttrc中,设置了按G收信:

macro index,pager G "!nohup getmails -n > /dev/null 2> /dev/null &\n" "用getmail收取信件"

nohup保证了getmails不会被neomutt退出打断。

为了实现自动收信,我写了两个小脚本,执行mutt.sh就可以每5分钟自动收信并打开neomutt,如果neomutt退出,则不再收信。

--------mutt.sh--------

#!/bin/sh

## 调用gmail.sh每隔一段时间收信,并打开neomutt

LOG=~/maillog.txt #记录文件名

#如果没有其它mutt.sh进程,则运行gmail.sh收信

if [ `ps --no-headers -C gmail.sh | wc -l` -eq 0 ]; then

echo "" >> $LOG ; date >> $LOG

nohup gmail.sh >> $LOG 2>> $LOG &

else

echo "gmail.sh已在运行"

fi

xfce4-terminal -T "邮箱 NeoMutt" --maximize --hide-menubar -x "neomutt"

--------gmail.sh--------

#!/bin/sh

#在neomutt运行期间定时收信

RUN=1

while [ $RUN -gt 0 ]

do

getmails -n #收信

sleep 300

#检测neomutt是否运行,不运行则等于0

RUN=`ps --no-headers -C neomutt | wc -l`

done
1 个赞

【发信 neomutt+msmtp】

msmtp发信设置:

msmtp设置文件为~/.config/msmtp/config,内容如下:

# Set default values for all following accounts.

defaults

# tls加密

tls on

tls_trust_file /etc/ssl/certs/ca-certificates.crt

logfile ~/.config/msmtp/msmtp.log

account 163

host smtp.163.com

port 465

from a@163.com

user a@163.com

passwordeval "pass a@163.com"

auth login

#如果不是SSL/TLS加密方式改成off

tls_starttls off

#如果是STARTTLS加密改成on

tls_certcheck off

# tls_starttls

account qq

host smtp.qq.com

port 465

from 1@qq.com

user 1@qq.com

passwordeval "pass 1@qq.com"

auth login

#如果不是SSL/TLS加密方式改成off

tls_starttls off

#如果是STARTTLS加密改成on

tls_certcheck off

# Set a default account

account default : 163

有几个账号就写几个account,用msmtp -a 帐号名 目的邮箱 发送邮件。保存后试验下:

msmtp -a 163 你想发到的邮箱

随便输入几行,然后^D看看是否发送成功。不成功查看~/.config/msmtp/msmtp.log

要在neomutt中不同邮箱调用不同帐号发送邮件,.muttrc相关设置如下:

#对其它邮箱(这里是对所有邮箱设置,但下面的指定邮箱设置会覆盖),发送邮件和延迟发送邮件不保存,不投递

folder-hook . 'set record=""; set postponed=""; unmy_hdr *; set sendmail=""'

#对163开头的邮箱设定同样邮件头和发送设置,下同

folder-hook =163.* 'set record="=163"; set postponed="=163-draft"; my_hdr From: a@163.com; set sendmail="/usr/bin/msmtp -a 163"'

folder-hook =qq.* 'set record="=qq"; set postponed="=qq-draft"; my_hdr From: 1@qq.com; set sendmail="/usr/bin/msmtp -a qq"'

folder-hook是neomutt进入指定邮箱后自动执行的设置。folder-hook . 表示对所有邮箱执行后面设置:发送邮件和延迟发送邮件不保存,不投递;folder-hook =163.* 表示对163开头的所有邮件执行后面设置:发信保存在"=163"(你也可以改成=163-sent,自己建立这个邮箱,把收信发信分开存放),延迟发送邮件保存在"=163-draft",邮件头为From: a@163.com,调用msmtp的163账户发信。至此,我们实现了多个邮箱的独立收发邮件。

1 个赞

【Mutt杂项设置】

打开附件类型设置在/etc/mailcap,已经很全了,为了显示html邮件,.muttrc作如下设置:

#自动打开html邮件
auto_view text/html
#把html放最后
alternative_order text/plain text/enriched text/html 

建立~/.mailcap,写入:

text/html; firefox '%s' > /dev/null 2> /dev/null &; needsterminal;
text/html; lynx -dump %s; nametemplate=%s.html; copiousoutput;

按v进入附件界面,m查看附件。html用firefox打开。

在neomutt中引入侧边栏sidebar

#侧边栏设置
set sidebar_visible
set sidebar_format = "%D%?F? [%F]?%* %?N?%N/?%S"
set mail_check_stats #随时检查当前邮箱状态
set sidebar_non_empty_mailbox_only #不显示空邮箱

##快捷键
bind index,pager <C-Up> sidebar-prev       # Ctrl-Up – Previous Mailbox
bind index,pager <C-Down> sidebar-next       # Ctrl-Down – Next Mailbox
bind index,pager <C-Right> sidebar-open       # Ctrl-Right – Open Highlighted Mailbox

#侧边栏颜色
color sidebar_indicator default red     # Red background
#color sidebar_highlight brightwhite   grey    # Grey background
#color sidebar_spool_file lightyellow  default     # Yellow
color sidebar_unread    lightcyan    default     # Light blue
color sidebar_new       brightgreen   default     # Green
color sidebar_ordinary  default default     # Default colors
color sidebar_flagged   lightred     default     # Red
color sidebar_divider   color8  default     # Dark grey

按Ctrl+上下光标选择高亮邮箱,按Ctrl+右光标进入高亮邮箱。

使用Abook作为地址簿:

## 使用Abook作为地址簿
set pipe_decode=yes #传邮件之前先去掉mime编码,否则地址和人名会乱码
set query_command= "abook --mutt-query '%s'"
macro index,pager  a "<pipe-message>abook --add-email-quiet<return>" "将发信人添加到Abook"
bind editor        <Tab> complete-query

neomutt中按a添加地址,要发送到指定地址,先按Q查询,m发送邮件。

其它使用技巧:
按上下键更改要看的邮件。中键滚轮也可以翻动。左右键翻页。PGUP和PGDOWN信件翻页。1回车到第一封邮件,End键到最后一封邮件。

m发送邮件,如果有延迟发送邮件,直接按m就是召唤出延迟发送邮件。

mutt可以读取任意位置的mbox/Maildir/MH格式邮箱,按c,输入邮箱路径名即可(可tab补全)。

1 个赞

【宏和标记】

宏Macro和标记Tag是展现Mutt强大之处。

标记符合要求的信件:T

显示符合要求的信件:l

将标记信件施行操作:;

l all 显示所有邮件

批量移动信件

  1. 先使用大写 T 利用 pattern 依据日期规则,tag 信件。日期的 pattern 写法为~d -,其中, 与 的语法皆是「日/月/西元年」。好比说,我要标记 2005 年 4 月份的所有信件,便这么下 pattern:~d 1/4/2005-31/4/2005。时间可以是相对时间(3d 1y之类)或绝对时间。

  2. 接著利用 ; 指令,将跟著而来的指令,改施行到被 tag 的那些信件。对于mutt 来说,所谓的 move 信件,其实就是 save 信件。Save 用的指令是 s,所以我们这么打:「;s」,然后输入信件夹路径即可。

  3. 最后,那些被 save 到指定信件夹的信件,会被 mutt 自动标记成 mark deleted,这时,我们可以用 $ 指令,执行真正的 delete 动作,将目前信件夹变小,加速后续动作的执行。

找出/删除重复信件:

按T/D,条件:~=

~s:标题

~d:日期

~f:发信人

~r:收信时间

~t:收信人

~N:新信件

~O:old信件

~B:内容

T.* 选取所有邮件

标记某个主题为已读取:^R

清除标记:W,然后按O/N/*/!

举几个标记例子:

批量清除N标记:

标记:T ~N

; W N

; W *

标记旧的超大信件,并转为无mime编码的纯文本信件(去除附件),保存到原邮箱:

T ~z >2m ~d >6m

;s ^

将旧邮件归档到指定邮箱:

T ~d >1y

;s ^-bak

.muttrc中的邮件备份也用到了宏,只是被注释了,要用把#删掉即可。macro里用
<enter>代表回车。

#邮件备份临时宏

#macro index,pager \es "T.*<enter>;s" "将所有邮件转移到指定邮箱"

#macro index,pager \en "T~N<enter>;WN;W*T~O<enter>;WO;W*" "清除N和O标记"
1 个赞

发完收工。十几年前用过mutt,当时没用好,这次再次捡起来,也算做个纪念吧,帮助mutt入门爱好者能快速上手。

我现在用 offlineimap 收取邮件了,多端同步更方便。

最近继续使用mutt,用脚本增添了一些功能,给mutt入门爱好者分享一下。

原有功能:

后台每隔5分钟自动收信

用folder-hook实现不同邮箱用不同账号发送邮件

新增功能:

引入procmail并设置脚本,给不同条件的邮件添加X-label标签,不同标签可叠加。在Mutt中用紫红色显示X-label。

添加vim脚本,给新信件自动添加中/英文问候语和签名,提供回复折叠、从文件管理器nnn中选择多个文件作为附件粘贴功能。在.muttrc中修改editor,完成脚本自动执行和参数传递。

改进:

.muttrc设置:

修改 index_format,使一年前的邮件显示年份,一年内的邮件不显示年份。

不同邮箱用不同账号发送邮件写法优化:设置set use_envelope_from=yes,在folder-hook中用set from=xxx控制发信选择的邮箱账号。

设置set sendmail_wait = -1,让mutt后台发信,直接返回

设置附件默认保存路径:set attach_save_dir=“~/下载/”

整理结构,分为收信设置、显示/处理邮件设置、发信设置等几部分。

mutt.sh脚本中,用bash -ic 确保执行.bashrc,否则.bashrc里的环境变量不会传给mutt

所有mutt的宏和vim快捷键都改用key,就是先按F2再按指定键,以免和其它快捷键冲突。说明中指明key意义。如果宏有删除邮件行为,则要回车后再删除。宏均使用<函数名>而不用快捷键,以防快捷键修改,增强可读性。如果宏的作用不能直接看出,用echo显示其作用。

mutt宏:

<F2>r 读取(Read) .muttrc

<F2>e 编辑(Edit) .muttrc

<F2>l 列出(List)重要邮件

<F2>a 列出所有(All)邮件

<F2>c 批量清除(Clear)N和O标记

<F2>b 将旧邮件归档(Backup)到^-bak邮箱

<F2>d 将旧的大邮件转为(Decode)纯文本邮件

vim快捷键:

<F2>c 编辑回复信件时折叠回复reply compress,保留前三行和后两行,中间省略

<F2>a 从nnn选择添加多个附件

主要的.muttrc设置,个人信息隐去。

----------------------- ~/.muttrc -----------------------

## 收信设置
# 建立信箱,用=替代folder指定目录
set mbox_type=Maildir #新建立的邮箱采用Maildir格式
set folder="~/Mail"
set mbox="=163"
set spoolfile="=163" #默认打开邮箱
set trash="=trash" #垃圾邮箱
set header_cache="~/Mail/.hcache" #信件缓存

# 让mutt监视下面几个邮箱,并随时报告新邮件
named-mailboxes "163" "=163" "163-草稿箱" "=163-draft" \
	"QQ" "=qq" "QQ-草稿箱" "=qq-draft" \
	"收件箱" "=inbox" "系统" "/var/mail/你的用户名" "回收站" "=trash"
set check_new = yes
set timeout = 0 #等待用户输入时间
set mail_check = 10 #检查新邮件间隔

# 收到新邮件发送通知
set new_mail_command="notify-send --icon='/usr/share/pixmaps/neomutt.xpm' '您有新邮件' &"

## 显示/处理邮件设置

#侧边栏设置
set sidebar_visible
set sidebar_format = "%D%?F? [%F]?%* %?N?%N/?%S"
set mail_check_stats #随时检查当前邮箱状态
set sidebar_non_empty_mailbox_only #不显示空邮箱
#侧边栏快捷键
bind index,pager <C-Up> sidebar-prev       # Ctrl-Up – Previous Mailbox
bind index,pager <C-Down> sidebar-next       # Ctrl-Down – Next Mailbox
bind index,pager <C-Right> sidebar-open       # Ctrl-Right – Open Highlighted Mailbox

#地址簿设置
#source ~/.mutt.alias
#当你在 index 里按 "a" 为来信者取别名时,使用哪一个别名文件保存这个别名。
#set alias_file=~/.mutt.alias

# 使用Abook作为地址簿
set pipe_decode=yes #传邮件之前先去掉mime编码,否则地址和人名会乱码
set query_command= "abook --mutt-query '%s'"
macro index,pager  a "<pipe-message>abook --add-email-quiet<return>" "将发信人添加到Abook"
bind editor        <Tab> complete-query

#自己邮箱帐号,mutt以此判定哪些邮件是你自己发出的
alternates a@163.com 1@qq.com
#显示标志
set to_chars=" +TCFLR"

#列表里的%d时间显示
#set date_format="!%Y %b%d, 星期%a %I:%M"
#这是一个格式字符串,用来控制你的index的列表显示。
set index_format="%4C %Z %?[y?%8{%m-%d}&%{%y-%m-%d}? %-15.15L (%4cr) %?y?[%.20Y]?%s"
#控制folder列表显示的格式字符串
#set folder_format="%2C %F %d %8s %N %f"
#显示特定的邮件头
ignore *
unignore from to subject date

#可以设置为 yes, no, ask-yes, 或者 ask-no. 这是说,当你按q退出mutt时,是否提示你(ask-yes,ask-no),还是直接就退出了(yes),还是根本不理你(no)。
set quit=ask-yes

#这也是一个提示性变量。它是确定当你退出时,是否提示你把信件从 spool 移动到的 mbox 文件。
set move=no

#当 Mutt 用 thread 方式显示时,是否用纯 ascii 表示树状列表,如果设成no,树状列表出现乱码的话,则设成yes。设成no界面美观些。
set ascii_chars=no
#thread排序方式。当用 thread 排序方式时,我们按日期对各个 thread 的相对排序顺序。
set use_threads=yes sort=last-date sort_aux=date
#如果翻到最后,再按往下翻也不会翻到下一封信件
set pager_stop
#当你按 "t" 或者 "D" 之类的标记操作时,是否自动把光标移动到下一封信件。
set resolve=yes

#外部程序退出时,是否要求用户按一个键才返回。
set wait_key=no
#当你要把信件存到另一个信箱,而这个信箱已经存在时,是否提示附加?
set noconfirmappend
#当你在用 pager 看信件时,在 index 留出多少行显示邮件列表?
set pager_index_lines=6
#告诉 Mutt 你已经订阅了那些邮件列表(mailing-list).
subscribe debian-chinese-gb@lists.debian.org
#用RFC2047 的格式编码附件
set rfc2047_parameters=yes

#自动打开html邮件
auto_view text/html
#把html放最后
alternative_order text/plain text/enriched text/html 
#附件默认保存路径
set attach_save_dir="~/下载/"

# 字符编码设置
#你的终端支持哪一种编码的显示?这个必须和你的终端编码一样。
set charset="utf-8"
#send_charset
set send_charset="us-ascii:iso-8859-1:gb2312:utf-8"
#处理没有用mime码编码的信乱码
set assumed_charset="utf-8:gb2312:big5" #第一个是优先使用编码,要和终端编码一致

## 发信设置

#编辑器 直接在 Mutt 的终端里使用vim,用[变量1,变量2,...]=[值1,值2,...]传递变量值给mutt.vim并执行
set editor="vim -f +'let b:twidth=${reflow_wrap} | source ~/Mail/mutt.vim'"
#设置邮件发送程序
set sendmail="/usr/bin/msmtp"
set sendmail_wait = -1 #后台发信,直接返回
#把mutt发送的from域作为sendmail发送邮件的sender(否则会用user@localdomian),相当于将from作为-f选项传递给sendmail。这样msmtp会选择符合from域的第一个帐号
set use_envelope_from=yes
#设置你自己的邮件头,就是发信时From: 和<邮箱地址>之间的文字
set real_name="Lin Lin"
#是否把邮件头也放在编辑器里可以修改?
set edit_headers=yes
#是否不输入To和Subject就开始编辑?
set autoedit=yes
#如果设置,当你按 "r" 回信时,就不会再提示你输入回信地址和主题,直接进入编辑模式。
set fast_reply
#回信时是否包含原文。
set include
#这是一个 bool 型变量。它表明你在回信时引用原文是否加入原文的邮件头。
set header=no 
#回信的引文之前插入那个符号?
set indent_str="> "
#回信只包含第一个主体附件
set include_only_first=yes
#设置回复引用格式
set attribution="* %n <%a> [%{%Y-%m-%d %H:%M:%S}]:\n"

##宏设置
#载入.muttrc而不必重新运行
macro generic,pager <f2>r ":source $HOME/.muttrc\r:echo '读取配置文件'\r" "读取(Read) .muttrc"
macro generic,pager <f2>e "!gvim $HOME/.muttrc\r" "编辑(Edit) .muttrc"
macro index,pager <f2>l "<limit>!~P(~N|~O|~F|(~h \^X-Label: !~h \^X-Label:\\ SPAM$ ~d<2m))<enter>" "列出(List)重要邮件" #列出重要邮件:新邮件、标记重要邮件、2月内的带非SPAM标签邮件
macro index,pager <f2>a "<limit>all<enter>" "列出所有(All)邮件"
macro index,pager <f2>c "<tag-pattern>~N|~O<enter><tag-prefix><clear-flag>N<tag-prefix><clear-flag>O<tag-prefix><clear-flag>*" "清除(Clear)N和O标记"
macro index,pager <f2>b "<tag-pattern>~d>1y<enter><tag-prefix><save-message>^-bak<enter><sync-mailbox>" "将旧邮件归档(Backup)到^-bak邮箱"
macro index,pager <f2>d "<tag-pattern>~z>2M ~d>1y !~h^X-Label:<enter><tag-prefix><decode-save>^<enter><sync-mailbox>" "将旧的大邮件转为(Decode)纯文本邮件"

##hook设置

#对其它邮箱(这里是对所有邮箱设置,但下面的指定邮箱设置会覆盖),发送邮件和延迟发送邮件不保存,不投递
folder-hook . 'set record=""; set postponed=""; unmy_hdr *'

#对fjnu开头的邮箱设定同样邮件头和发送设置,下同
folder-hook =163.* 'set record="=163"; set postponed="=163-draft"; my_hdr From: a@163.com; set from=a@163.com'
folder-hook =qq.* 'set record="=qq"; set postponed="=qq-draft"; my_hdr From: 1@qq.com; set from=1@qq.com'

##颜色设置
##这里提供了四级的引用文本
##这些设置覆盖了/etc/mutt/Muttrc 中的系统设置
color quoted green brightblack
color quoted1 magenta black
color quoted2 yellow brightblack
color quoted3 red black
color signature cyan black

#一般信件着色
color normal lightwhite default
color index_label lightmagenta default #标签着色
#color index_date green default #日期着色

# 特殊信件着色
color index lightcyan default "~P" # 标记自己所发信件(由alternates确定)
color index lightred default "~D" # 删除
color index lightgreen default "~U" # 未读信件
color index lightyellow default "~T" # 标记信件
color index brightyellow default "~F" # 重要信件

#这个色彩设置拷贝自 /etc/mutt/Muttrc.color
# color normal white default
# color attachment brightgreen blue
# color bold brightwhite default
# color underline default blue
# color error brightwhite default
# color indicator white blue
# color message brightblue default
# color status white blue

#侧边栏颜色
color sidebar_indicator default red     # Red background
#color sidebar_highlight brightwhite   grey    # Grey background
#color sidebar_spool_file lightyellow  default     # Yellow
color sidebar_unread    lightcyan    default     # Light blue
color sidebar_new       brightgreen   default     # Green
color sidebar_ordinary  default default     # Default colors
color sidebar_flagged   lightred     default     # Red
color sidebar_divider   color8  default     # Dark grey

启动mutt并自动收信脚本,放在$PATH目录其中之一

----------------------- mutt.sh -----------------------

#!/bin/bash

## 调用gmail.sh每隔一段时间收信,并打开neomutt

LOG=~/Mail/maillog.txt #记录文件名
#如果没有其它mutt.sh进程,则运行gmail.sh收信
if [ `ps --no-headers -C gmail.sh | wc -l` -eq 0 ]; then
	echo "启动gmail.sh"
	date +'%Y/%m/%d' > $LOG
    nohup gmail.sh >> $LOG 2>> $LOG &
else
    echo "gmail.sh已运行"
fi

#如果没有其它neomutt进程,则运行neomutt收信
if [ `ps --no-headers -C neomutt | wc -l` -eq 0 ]; then
	echo "启动neomutt"
	xfce4-terminal -T "邮箱 NeoMutt" --maximize --hide-menubar -x bash -ic "neomutt" #用bash -ic 确保执行.bashrc,否则.bashrc里的环境变量不会传给mutt
else
	echo "neomutt已运行"
fi

----------------------- gmail.sh -----------------------

#!/bin/bash

#在neomutt运行期间定时收信
RUN=1
while [ $RUN -gt 0 ]
do
    echo "" ; date +'%H:%M:%S'
    getmails -n #收信
    sleep 300
    #检测neomutt是否运行,不运行则等于0
    RUN=`ps --no-headers -C neomutt | wc -l`
done

收信设置:用procmail实现针对不同邮件添加X-label标签。多个标签可重叠,中间用|分开。
如果要用procmail,getmail相关配置文件里要改写成:

[destination]
# 如何处理已经收取到的邮件
# 因为要使用procmail分拣信件,所以此处这样填写
type = MDA_external
# procmail命令的位置,如果不确定可以通过$ which procmail获得
path = /usr/bin/procmail
arguments = ("-f", "%(sender)", "-m", "~/.procmailrc")
user = 你的debian用户名

----------------------- ~/.procmailrc -----------------------

MAILDIR = $HOME/Mail
DEFAULT = $MAILDIR/inbox/
LOGFILE = $MAILDIR/.procmaillog

:0
* ^To.*a@163.com
{
	#根据邮件头添加标签
	:0 fhw
	| $MAILDIR/proc_mail.sh

	:0
	163/
}

:0
* .*
inbox/

----------------------- ~/Mail/proc_mail.sh -----------------------

#!/bin/bash

#procmail给邮件添加标签

#从信件头取得指定项。-o:MIME码不转换;-u:转换
GetHeader() {
case $1 in
-o)
	formail -x $2":" ;; 
-u)
	formail -x $2":" | tr -d '\n' | sed 's/^ //' | /usr/bin/perl -MEncode -ne 'print encode ("utf8",decode ("MIME-Header",$_ )) ' ;;
*)
	;;
esac
}

#根据指定条件添加标签到LABEL。$1:-o/-u $2:邮件头指定项 $3:匹配条件 $4:添加的标签
AddLabel() {
	if $(GetHeader $1 $2 < $MFILE | egrep -iq $3); then
		LABEL=$LABEL$4"|"
	fi
}

#将输入邮件保存到临时文件
MFILE=$(mktemp)
tee $MFILE > /dev/null

#根据条件设置标签
LABEL=""
AddLabel -u X-getmail-retrieved-from-mailbox "^垃圾邮件$" SPAM
AddLabel -o From ".*@163\.com" 同事
AddLabel -u Subject ".*(发票|电子票|数电票)" 发票

#如果没有标签,则原样输出。如果有标签,则在信件中添加标签
if [ -z $LABEL ]; then
	cat $MFILE
else
	LABEL=$(echo $LABEL | sed "s/.$//")
	cat $MFILE | formail -I "X-Label: ${LABEL}"
fi

rm $MFILE

发信设置:用vim脚本实现:给新信件自动添加中/英文问候语和签名,提供回复折叠、从文件管理器nnn中选择多个文件作为附件粘贴功能。

----------------------- ~/Mail/mutt.vim -----------------------

" Vim邮件处理脚本

" 防止脚本重复运行
if exists("b:did_mutt")
  finish
endif
let b:did_mutt = 1

" 变量
" b:twidth	行宽
" s:MyGreeting 中/英文问候语
" s:MyName 中/英文签名
let s:MyGreeting = [['', '尊敬的 :','','    您好。','','    祝身体健康,工作顺利。'], ['', 'Dear :', '', '    Best wishes.']]
let s:MyName = ['中文名', 'English Name']

" 编辑回复信件时折叠回复reply compress,保留前三行和后两行,中间省略
let b:omitline='> ' . repeat('... ', b:twidth/4) . "\n" "省略行
noremap <F2>c :%s/\v(^\>.*\n){3}\zs(^\>.*\n)+\ze(^\>.*\n){2}/\=b:omitline/<CR>
"添加附件
noremap <F2>a :call AddAttach()<CR>

" 将字符串数组ListSign右对齐,列宽为TWidth
function s:PrintSign(ListSign, TWidth)
let ListSignNew = []
for nlist in a:ListSign
	call add(ListSignNew, nlist=='' ? nlist : printf("%".a:TWidth."s", nlist))
endfor
return ListSignNew
endfunction

" Mutt发信添加问候语/签名
function s:AddGreeting(TWidth)
" 根据输入设置中/英文问候语/签名
let s:selection = inputlist(['选择问候语/签名: 0. 无', '1. 中文', '2. 英文'])
if s:selection==1 || s:selection==2
	let greeting = s:MyGreeting[s:selection-1]
	let sign = s:PrintSign(['', s:MyName[s:selection-1], strftime('%Y/%m/%d %H:%M:%S')], a:TWidth)
	call cursor(1,1)
	let HeadLine = search('\n\n') "找到信头末行
	call append(HeadLine, greeting) "添加问候语
	call append(line('$'), sign) "添加签名
else
	let s:selection = 0 "输入1和2之外的其它数字视为选择0
endif
endfunction

" 将nnn选择项作为附件添加
function AddAttach()
let selfile=readfile($sel) "读入nnn选择项
if !empty(selfile) "如果有选择项
	let attach=split(selfile[0], "\n") "将nnn选择项转为列表,$sel为.bashrc里设置的nnn选择文件
	call map(attach, "substitute(v:val, ' ','\\\\\\0', 'g')")  "将' '更换为'\ ',如果有其它特殊字符如#,前面写成'[# ]'
	call map(attach, '"Attach: "..v:val') "在文件名前加Attach: 
	call cursor(1,1)
	let HeadLine = search('\n\n') "找到信头末行
	call append(HeadLine, attach) "添加Attach:行
endif
endfunction

"截取倒数第二行看是否有签名,如有则已加问候语/签名,不作处理,如无则为新信件,添加问候语/签名
let s:SignName = getline(line('$')-1)->trim(' ',1)
if s:SignName!=s:MyName[0] && s:SignName!=s:MyName[1]
	call s:AddGreeting(b:twidth)
	if s:selection == 1 "如果是中文信件,将发信人姓名换成中文
		call cursor(1,1)
		let s:FromLine = search('^From:') "寻找发信人一行
		let s:repl=substitute(getline(s:FromLine), '^From:\zs *.*\ze<', ' ' . s:MyName[0] . ' ','')
		call setline(s:FromLine, s:repl)
	endif
endif