邮件管理软件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 收取邮件了,多端同步更方便。