当前位置: 首页 > Linux

“Mutt”正式介绍:命令行的邮件高手(一文详解)

时间:2023-04-06 23:25:13 Linux

为什么要用Mutt?世界上有数百个漂亮的电子邮件客户端,为什么要使用命令行?其实什么功能都没用。说到它的本质,其实就是Geek精神,折腾精神,Customizability精神。就像有WhatsApp也有IRC精神一样;并使用Ranger的精神,即使有Finder。在终端呆久了,GUI会比较烦,所以不管什么软件,我都会寻求终端的替代品。对于这个需求,在Linux的世界里,似乎只有一个选择:Mutt。Mutt比Vim更易于配置。配置与Vim类似,有一个专门的~/.muttrc供您配置软件本身。需要明白的是:Mutt本身就是一个框架。接收、发送、编辑邮件等功能必须通过匹配不同的程序来实现。Mutt的模块搭配方案就像穿衣搭配。有许多程序可用于接收和发送电子邮件、过滤电子邮件和转发电子邮件。怎么搭配mutt?常用的选项是这些(用户/传输/交付):MUA接收:fetchmail或getmail或OfflineIMAPMTA发送:sendmail或msmtp或postfix。其中msmtp兼容性强,postfix对国内MDA分类不友好:procmail或maildrop邮件编辑器:VIM。参考邮件代理(功能分类):Emailagent(infrastructure)-Wikipedia)一般搭配是:旧搭配:mutt+getmail+sendmail+procmail新搭配:mutt+fetchmail+msmtp+maildrop但是maildrop不支持Mac,procmail是比较普通一点。所以这里我们使用:mutt+fetchmail+msmtp+procmail安装:#Mac$brewinstallmuttfetchmailmsmtpprocmail#Ubuntu$sudoapt-getinstallmuttfetchmailmsmtpprocmail-yMutt或各种写协作程序在配置之前不能使用,学习曲线相对陡峭,因此请准备好花很长时间了解和学习各种组件。大概的配置过程是:配置接收:~/.fetchmailrc配置过滤:~/.procmailrc配置发送:~/.msmtprc配置mutt框架本身:~/.muttrc注意:新手过程中,不要马上配置mutt当你上来的时候。最好从组件开始:传入->过滤邮件->阅读邮件->传出->mutt接口,按此顺序。配置参考:参考ArchWiki:Mutt(很详细,但对人类不友好)参考Youtube:Mutt-Emailforeveryone(像我这样的书呆子)接收:ConfigureFetchmailFetchmail是著名的《大教堂与集市》作者EricStevenRaymond写的.fetchmail是一个非常简单的接收程序,运行在前台,一次性运行,也就是说:你每次手动执行fetchmail命令,都会在前台收集一次,程序会自动退出,不像普通邮件客户端。终端始终在后台运行。注意:fetchmail只负责接收,不负责存储!所以就是调用另外一个程序比如procmail进行存储。fetchmail的配置文件是~/.fetchmailrc。那么文件权限至少要设置chmod600~/.fetchmailrc参考:使用Fetchmail取回邮件比如我们要设置多个邮箱账号同时取回邮件,那么配置如下:pollpop.AAA.com协议POP3用户“me@AAA.com”密码“123”pollpop.BBB.com协议POP3用户“me”,密码“123”是falko这里fetchallpollpop.CCC.com协议POP3用户“me"therewithpassword"123"istillherekeeppollpop.DDD.comprotocolPOP3user"me"password"123"#globaloptionmimedecodemda"/usr/local/bin/procmail"其中各种参数可以调出订单或不在一行。一个空格分隔每个参数,poll分隔每个帐户。here,there,with,is等不是关键字,随便写也不会影响参数。poll之后是邮件服务器的地址,通常pop.xxx.comprotocol后面是接收协议,一般是pop或者pop3user后面是用户名,可以是用户名或者邮箱地址,password后面是密码。以上是必须的,其他的可以不选:fetchall,nofetchall,keep,nokeepmimedecode是用来自动解码安装在MIMEmda之后指定机器上的邮件过滤分类程序。如果留空,收到的邮件将不会保存在本地。您可以使用$whichprocmail检查路径。配置完成后,可以运行fetchmail-v查看是否有报错信息。如果多行收款信息都可以正常显示,那么就可以正确登录邮箱进行收款了。收集的一般命令如下:#只接收未读邮件$fetchmai#获取所有邮件$fetchmail-a#(重要)获取新邮件,但不要删除服务器端已经收到的邮件$fetchmail-k但是fetchmail是只负责收集,不负责在“下载”部分,您找不到电子邮件的存储位置。所以还需要配置procmail等MDA分类器,才能看到下载的邮件。注意:Fetch实际上并不是在Mutt中使用,而是在mutt之外使用!也就是说,Mutt只负责读取本地存储邮件的文件夹更新,并不会自动为你执行fetchmail命令。得自己手动执行,或者用crontab定时收集,或者设置成Daemon守护进程,也可以在Mutt中设置快捷键来执行Shell命令。设置Mutt快捷键接收邮件的方法是在~/.muttrc中添加宏:macroindex,pagerI'fetchmail-vk'这样就可以按I执行了索引邮件列表外部shell命令已收到邮件。邮件过滤:配置ProcmailProcmail简单的负责邮件的存储、过滤和分类,一般和fetchmail一起使用来接收邮件。在Pipline中,fetchmail将所有收到的邮件发送给Procmail进行过滤筛选,然后Procmail将邮件保存在本地形成文件,然后将邮件分类为工作、生活、重要、垃圾等。当然分类规则可以自己指定。可以根据发件人、主题、长度和关键字对电子邮件进行排序、分类和组织。参考:ProcmailProcmail的配置文件是~/.procmailrc,记得修改权限:chmod600~/.procmailrc。内容也很简单。前面是邮件位置、日志等默认选项,后面是一条一条的过滤规则。基本配置:MAILDIR=$HOME/Mail#邮件存储地址DEFAULT=$MAILDIR/inbox#默认:收件箱VERBOSE=offLOGFILE=/tmp/procmaillog#垃圾邮件规则:0*^From:webmaster@st\.zju\.edu\.cn/dev/null#垃圾文件存放位置#其他都存放在收件箱中:0:inbox/其中$HOME/Mail是设置的邮件存放位置。我们需要手动创建mkdir~/Mail,否则程序会报错。配置好后,我们再测试一下。假设邮箱中有一封未读邮件,你会看到:$fetchmail1messageforJason@aliyun.comatpop3.aliyun.com(7833octets).readingmessageJason@aliyun.com@pop3.aliyun.com:1of1(7833octets)flushed$tree~/Mail/Users/Jason/Mail└──inbox├──cur├──new│└──1549706227.89809_0.Jason-mba.lan└──tmp你可以看到一个新邮件保存在~/Mail/inbox/new/,文件为1549706227.89809_0.Jason-mba.lan。但是手动打开后是这样的:这其实就是邮件的真面目:MIME格式(协议)的邮件源代码。就像HTML一样,展现在我们面前的和背后的源代码是不一样的。那么如何将这种类似HTML的MIME格式邮件解析成我们人类可以看懂的内容呢?为此,我们必须依赖mutt。Mutt本身具有基本的MIME邮件解析功能(不包括HTML格式的邮件阅读)。不过邮件阅读的问题先不说到这里,留到最后再说。发送:配置msmtpmsmtp是sendmail程序的更好替代品。msmtp的配置文件是~/.msmtprc,记得修改权限:chmod600~/.msmtprc配置内容比接收简单,因为发送总是比接收容易。提示:发送服务器是smtp协议。接收是pop3协议。基本配置:账号默认auth登录主机smtp.XXX.com端口587fromME@XXX.com用户ME密码passwdtlsontls_certcheckofflogfile/tmp/msmtp.log注意如果是阿里云就不用写了tls,如果是Outlook,必须写:tlsontls_starttlsontls_certcheckoff主界面:配置MuttMutt配置文件为~/.muttrc,记得改权限:chmod600~/.muttrc另外:mutt配置文件也可以放在~/.笨蛋/muttrc。这种方式的好处是很多主题、插件等文件都可以放在~/.mutt/目录下。基本配置:#Generalsettingsetuse_from=yessetenvelope_from=yessetmove=yes#Mobilereadmailsetinclude#回复时调用原文setcharset="utf-8"auto_viewtext/html#自动显示HTML#Senderaccountsetrealname="SolomonXie"setfrom="solomonxie@aliyun.com"#Categorymailboxsetmbox_type=Maildir#Mailboxtypesetfolder="$HOME/Mail"setspoolfile="$HOME/Mail/inbox"#INBOXsetmbox="$HOME/Mail/seen"#Seenboxsetrecord="$HOME/Mail/sent"#Sentboxsetpostponded="$HOME/Mail/draft"#Draftbox#关联程序(需要用which命令确认自己)seteditor="vim-nw"setsendmail="/usr/local/bin/msmtp"最小配置结合上面四个配置文件,下面是我的四个文件的最小配置:另外可以参考网友的最小配置简单配置:https://gist.github.com/ihars...现在我的目的是让发送和接收工作先工作。至于界面美化、快捷键设置等,后面再说,很有学问。确认邮箱服务器没有问题。即使上面的配置没问题,也不一定能正常收发邮件。因为你用的是Gmail、QQ、网易、阿里云等,后台有一系列的第三方收款设置。这各不相同。比如QQ和网易现在(2019年)几乎不能用了,为什么?因为他们完全阻止了第三方客户端发送和接收邮件。即使你去后台设置面板,可以通过短信验证等设置,但是你会发现验证总是失败。所以本质上,他们只允许自己的官方客户端,不允许任何其他手机和PC客户端(流氓行为)。众所周知,Gmail不能在中国使用。现在只有阿里云和微软Outlook比较好用。除了第三方客户端的权限,我们还需要设置POP。最好放开所有邮件或者最近30天,然后禁止客户删除邮件。这是什么意思?POP默认客户端收到邮件后,服务器上的邮件自动删除!这是不合适的,所以必须禁止。例如阿里云邮箱:Mutt主界面基本操作参考:HowtoUsetheFastandPowerfulMuttEmailClientwithGmailReferenceYoutube:mutt-TerminalEmailClient-LinuxTUImailinglist操作:基本:q:Quit,d:删除当前邮件,s:移动邮件到指定文件夹,m:新建邮件,r:回复当前邮件,?:helpmove:j/k上下移动邮件,z/Z上下翻页,跳转到序号(不输入邮件)打开选中的邮件/在当前文件夹中搜索d标记选中的邮件为已删除,N标记选中的邮件为未读,$使标记的东西生效,这样如已删除、未读等。f转发所选邮件,e编辑所选邮件c切换文件夹(收件箱/已读/草稿等),您需要输入文件夹名称,或按?在列表中选择,j/k上下移动。gi查看收件箱,ga查看所有邮件,gd查看草稿,gs查看加星标的邮件邮件中的操作:j/k上一封/下一封邮件,:向下翻页,:向前滚动e进行编辑当前邮件,t编辑TO,c编辑CC,b编辑BCC,y发送邮件,a添加附件,返回查看附件,E编辑附件,D删除附件使用命令像Vim一样操作Mutt,你不仅可以使用命令绑定作为快捷键,还可以直接输入:直接输入命令。但不同的是Mutt称之为Action,需要执行的格式为:exec。例如移动侧边栏侧边栏,命令为:sidebar-next,sidebar-prev。然后我们可以直接输入:execsidebar-next,回车执行。参考:https://gitlab.com/muttmua/mu...mutt乱码一般分为:邮件列表乱码内容乱码附件乱码不管~/.muttrc中charset=utf-8怎么设置。这时候先在mutt中输入命令查看软件当前的charset设置::set&charset?charset如果显示charset="us-ascii",那就是正确的,ascii永远不会显示中文。必须使用其他unicode格式,例如utf-8。但是为什么在muttrc中设置charset没有用呢?经测试,MacOS和Ubuntu同时设置了相同的配置。Ubuntu能正常显示中文,MacOS不能。在Ubuntu中输入test命令显示charset="utf-8";而在macOS中,无论是iTerm2还是Terminal,显示us-ascii都是乱码。那么问题就变成了:为什么muttrc中的charset没有生效呢?Locale大法:在命令行输入$locale命令查看Shell中的语言设置,发现我在Mac上的Locale是:?$localeLANG=LC_COLLATE="C"LC_CTYPE="en_US.UTF-8"LC_MESSAGES="C"LC_MONETARY="C"LC_NUMERIC="C"LC_TIME="C"LC_ALL=在Ubuntu中是:?$localeLANG=en_GB.UTF-8LANGUAGE=LC_CTYPE=en_GB.UTF-8LC_NUMERIC="en_GB.UTF-8"LC_TIME="en_GB.UTF-8"LC_COLLATE="en_GB.UTF-8"LC_MONETARY="en_GB.UTF-8"LC_MESSAGES="en_GB.UTF-8"LC_PAPER="en_GB.UTF-8"LC_NAME="en_GB.UTF-8"LC_ADDRESS="en_GB.UTF-8"LC_TELEPHONE="en_GB.UTF-8"LC_MEASUREMENT="en_GB.UTF-8"LC_IDENTIFICATION="en_GB.UTF-8"LC_ALL=也许问题出在这里:shell的设置出了问题,而不是mutt的!解决方法很简单:$exportLANG=en_US.UTF-8然后输入locale命令就可以看到正常的语言编码设置了。重新打开mutt也是正常显示。但是这样直接导出是暂时的,需要在~/.zshrc或~/.bash_profile中添加。以HTMLweb格式浏览电子邮件的参考:https://debian-administration...参考:https://fiasko.io/projects/ht...参考:http://jasonwryan.com/blog/20...大概两步:创建一个~/.mailcap文件,在里面设置HTML渲染规则,在~/.muttrc设置auto_view等自动浏览规则普通邮件,内容只是简单的text/plain格式,所以我们不不需要渲染就可以直接看到它很好。但是,为了美化,有些邮件经常以text/html格式显示,很麻烦,因为你看到的都是html代码。所以当遇到HTML格式的邮件时,我们需要做的就是使用第三方软件进行渲染(render)。渲染的问题涉及到两个需要解决的问题:HTML源码转换成人类可读的文本来显示图片HTML源码转换成文本很容易解决,只要你用命令行浏览器这样用w3m来完成,很轻,很简单,很快,感觉不到它的存在,可以直接在mutt中查看。但是图片有一些问题:在终端显示图片一直是个问题。虽然可以实现,但是需要大量的配置。所以,有些人为了方便,遇到HTML格式的邮件,直接弹出chrome网页查看(不推荐)。所以说实话,意义不大。常用的将HTML渲染为Text的方式有:w3m:命令行中的浏览器链接常用的图片显示方式有:直接弹出chrome浏览器查看内容(BAD!)w3mrendering使用brewinstallw3m后,你得到浏览器的命令行。然后我们需要配置两个mutt配置文件。~/.muttrc添加这两行:auto_viewtext/html#ViewHTMLautomaticallyalternative_ordertext/plaintext/enrichedtext/html#savehtmlforlast~/.mailcap添加这一行:text/html;w3m-I%{字符集}-T文本/html;丰富的输出;然后重新打开mutt,再打开一封html格式的邮件,发现内容已经转换成人类可读的文本格式了。当然,此时不能看图片。关于mutt图像渲染的问题,留待另外一个专项说明。