LinuxLinux终端操作积累我用 Linux

❖ 正式的介绍「Mutt」:命令行的邮件大师 (一文详解)

2019-02-12  本文已影响4人  Solomon_Xie

为什么要用Mutt?
这个世界已经有了成百上千的漂亮邮件客户端,为什么还要用命令行里的?
其实说什么功能都没用。说到本质上,其实是一种Geek精神,一种爱折腾的精神,一种Customizability的精神。就像明明有WhatsApp,还要用IRC一样的精神;明明有Finder,还要用Ranger的精神。
在终端里待久了,会比较烦GUI,所以不管什么软件都会寻求终端的替代方案。
对于这个需求来说,在Linux的世界里,似乎就只有一个选择:Mutt。

Mutt的可配置性,强如Vim。配置起来也和Vim差不多,有专门的~/.muttrc供你配置软件本身。

需要理解的是:Mutt本身是一个框架而已。收件、发件、编辑邮件等功能,是要通过搭配不同的程序来做到的。

Mutt的模块搭配方案

就像穿衣搭配一样,收件发件过滤邮件转发邮件各种功能都有很多种程序可以用,mutt怎么搭配呢?
常用选项有这些(User/Transport/Delivery):

参考邮件代理(功能分类):Email agent (infrastructure) - Wikipedia

一般搭配是:

但是maildrop不支持Mac,而procmail比较通用一点。所以这里我们用:
mutt + fetchmail + msmtp + procmail

安装:

# Mac
$ brew install mutt fetchmail msmtp procmail

# Ubuntu
$ sudo apt-get install mutt fetchmail msmtp procmail -y

Mutt或各个写协作程序在配置前都是不能使用的,学习曲线还是比较陡峭的,所以要做好准备去花好一段去了解和学习各个部件。

大概的配置流程是:

注意:初学过程中,不要一上来就配置mutt。最好是先从各个部件开始:收件->过滤邮件->阅读邮件->发件->mutt界面,按照这种顺序。

配置参考:
参考Arch Wiki:Mutt (极详细,但对人类不友好)
参考Youtube:Mutt - Email for everyone (nerds like me)

收件:配置Fetchmail

Fetchmail是由著名的《大教堂与集市》作者 Eric Steven Raymond 编写的。

Fetchmail是一个非常简单的收件程序,而且是前台运行一次性运行的,意思是:你每次手动执行fetchmail命令,都是在前台一次收取完,程序就自动退出了,不是像一般邮件客户端一直在后台运行。

注意:fetchmail只负责收件,而不负责存储!所以它是要调用另一个程序如procmail来进行存储的。

fetchmail的配置文件为~/.fetchmailrc。然后文件权限最少要设置chmod 600 ~/.fetchmailrc

参考:Using Fetchmail to Retrieve Email

比如我们要设置多个邮箱账户同时收取,那么配置如下:

poll pop.AAA.com protocol POP3 user "me@AAA.com" password "123"
poll pop.BBB.com protocol POP3 user "me" there with password "123" is falko here fetchall
poll pop.CCC.com protocol POP3 user "me" there with password "123" is till here keep
poll pop.DDD.com
  protocol POP3
  user "me"
  password "123"

# 全局选项
mimedecode
mda "/usr/local/bin/procmail"

其中,

配置完成后,可以运行fetcmail -v来看看是否有错误信息,如果能够正常显示很多行的收取信息,那么就能正确登录邮箱收取了。

一般收取的命令如下:

# 只收取未读邮件
$ fetchmai

# 收取所有邮件
$ fetchmail -a

# (重要)收取新邮件,但不在服务器端删除已经收取的邮件
$ fetchmail -k

但是fetchmail只负责收取,不负责“下载”部分,你找不到邮件存在哪了。
所以还需要配置MDA分类器,如procmail,才能看到下载后的邮件。

注意:Fetch其实不是在Mutt“里”使用的,而是脱离mutt之外的!也就是说,Mutt只负责读取本地存储邮件的文件夹更新,而不会自动帮你去执行fetchmail命令。

你必须自己手动执行,或者用Crontab定期收取,或者设为Daemon守护进程,还可以在Mutt中设置快捷键执行Shell命令。

设置Mutt快捷键收取邮件的方法是在~/.muttrc中加入macro:

macro index,pager I '<shell-escape> fetchmail -vk<enter>'

这样的话,你就可以在index邮件列表中按I执行外部shell命令收取邮件了。

邮件过滤:配置Procmail

Procmail是单纯负责邮件的存储、过滤和分类的,一般配合fetchmail收件使用。

在Pipline中,fetchmail把收到的邮件全部传送到Procmail进行过滤筛选处理,然后Procmail就会把邮件存到本地形成文件,然后给邮件分类为工作、生活、重要、垃圾等。

当然,分类规则是自己可以指定的。可以根据发信人、主题、长度以及关键字 等对邮件进行排序、分类、整理。

参考:Procmail

Procmail 的配置文件是 ~/.procmailrc ,记得改权限:chmod 600 ~/.procmailrc
内容也非常简单,前面是邮件位置、日志等默认选项,后面则是一块一块的过滤规则。

基本配置:

MAILDIR=$HOME/Mail   #邮件存储地址
DEFAULT=$MAILDIR/inbox   #默认:收件箱
VERBOSE=off
LOGFILE=/tmp/procmaillog

# 某个垃圾邮件规则
:0
* ^From: webmaster@st\.zju\.edu\.cn
/dev/null    #垃圾文件的存储位置

# 其它所有都存到收件箱中
:0:
inbox/

其中,$HOME/Mail是设定的邮件存储位置。
我们需要手动创建mkdir ~/Mail,否则程序会报错。

配置好后,我们再测试一下,假设邮箱里有一封未读邮件,就会看到:

$ fetchmail
1 message for Jason@aliyun.com at pop3.aliyun.com (7833 octets).
reading message Jason@aliyun.com@pop3.aliyun.com:1 of 1 (7833 octets) 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。但是手动打开以后是这样的:

image

这个实际上就是邮件的真面目:MIME格式(协议)的邮件源码。就像HTML一样,展示给我们的和背后的源码不一样。

那么怎么把这个类似HTML的MIME格式邮件解析为我们人能读懂的内容呢?
这个我们就要靠mutt自己了,mutt自身具备基本的MIME邮件解析功能(不包括HTML格式邮件读取)。

但是这里我们先不讲邮件阅读的问题,把它留在最后。

发件:配置msmtp

msmtp是作为替代sendmail发邮件程序的更好替代品。
msmtp的配置文件为~/.msmtprc,记得改权限:chmod 600 ~/.msmtprc
配置内容比收件还简单,因为发件永远比收件简单。

Tip: 发件的服务器是smtp协议。收件才是pop3协议。

基本配置:

account default
  auth login
  host smtp.XXX.com
  port 587
  from ME@XXX.com
  user ME
  password passwd
  tls on
  tls_certcheck off

logfile /tmp/msmtp.log

其中注意,关于tls,如果是阿里云则不用写,如果是Outlook的话,必须写:

    tls on
    tls_starttls on
    tls_certcheck off

主界面:配置Mutt

Mutt的配置文件为~/.muttrc,记得改权限:chmod 600 ~/.muttrc

另外:mutt的配置文件还可以放在~/.mutt/muttrc。这种方法有一个好处,即~/.mutt/目录下可以放很多主题、插件等文件。

基本配置:

# 通用设定
set use_from=yes
set envelope_from=yes
set move=yes    #移动已读邮件
set include #回复的时候调用原文
set charset="utf-8"
auto_view text/html   #自动显示HTML

# 发送者账号
set realname="Solomon Xie"
set from="solomonxie@aliyun.com"

# 分类邮箱
set mbox_type = Maildir #Mail box type
set folder = "$HOME/Mail"
set spoolfile = "$HOME/Mail/inbox" #INBOX
set mbox="$HOME/Mail/seen"  #Seen box
set record="$HOME/Mail/sent"  #Sent box
set postponed="$HOME/Mail/draft"  #Draft box

# 关联程序(需要自己用which命令确定一下)
set editor="vim -nw"
set sendmail="/usr/local/bin/msmtp"

极简配置

综合上面的四大配置文件,下面是我的四个文件的极简配置:

image

另外可参考网友的极简配置:https://gist.github.com/iharsuvorau/45a078ecb597eb916fdf

现在我的目的是先让收发件运行起来,至于界面美化、快捷键设定等,我们以后再说,里面很有学问。

确认邮箱服务器有没有问题

即使上面配置一切OK,也不一定能正常收发邮件。因为你用的Gmail、QQ、网易、阿里云等等,后台都有一系列的第三方收取设置。这是各不相同的。

比如QQ和网易,现在几乎已经不能用了(2019),为什么?因为它们完全阻止了第三方客户端收发件。即使你去后台设置面板,可以通过手机短信验证之类设置,但是会发现实际上总是验证不了总是通过不了。所以本质上,他们只允许自己的官方客户端不允许任何别的手机、PC客户端(流氓行径)

Gmail在国内用不了众所周知。现在比较好用的只有阿里云和微软的Outlook了。

除了第三方客户端的允许,我们还要设置POP。最好放开全部邮件或者最近30天,然后禁止客户端删信。这是什么意思呢?POP默认客户端在收件后,服务器上的邮件就自动删除了!这个不太合适,所以必须要禁止

例如阿里云邮箱:

image

Mutt主界面的基本操作

参考:How to Use the Fast and Powerful Mutt Email Client with Gmail
参考Youtube:mutt - Terminal Email Client - Linux TUI

邮件列表操作:

在邮件中的操作:

使用命令操作

Mutt如同Vim一样,不光可以把命令绑定为快捷键,还能直接输入:直接输入命令。
但是稍有不同的是,Mutt称之为Action,而且需要用:exec <命令>这样格式执行。

比如sidebar侧边栏的移动,命令是:sidebar-next, sidebar-prev
那么我们可以直接输入:exec sidebar-next,按下回车执行。

参考:https://gitlab.com/muttmua/mutt/wikis/MuttFaq/Action

Mutt乱码问题

一般分为:

无论~/.muttrc中怎么设置charset=utf-8都没用。

这个时候,先在mutt中输入命令查看软件当前的charset设置::set &charset ?charset
如果显示的是charset="us-ascii",那么就没错,ascii绝对不会显示中文。必须要utf-8等其它unicode格式才行。

但是为什么muttrc中设置charset没用呢?

测试了下,在MacOS、Ubuntu中同时设置一样的配置,Ubuntu正常显示中文,MacOS却不能。
在Ubuntu中输入测试的命令,显示出charset="utf-8";而MacOS里无论iTerm2或Terminal,都是显示us-ascii,且乱码。

问题就变成了:为什么muttrc中的charset不生效?

locale大法:
在命令行里分别输入$ locale命令,查看Shell中的语言设置,发现,我在Mac中的Locale是:

↳ $ locale
LANG=
LC_COLLATE="C"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=

而Ubuntu中的确是:

↳ $ locale
LANG=en_GB.UTF-8
LANGUAGE=
LC_CTYPE=en_GB.UTF-8
LC_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的设置!

解决方法很简单:

$ export LANG=en_US.UTF-8

然后再输入locale命令就可以看到正常的语言编码设置了。
再打开mutt也是正常显示。

但是直接这样export是临时的,需要把这个加入到~/.zshrc~/.bash_profile中。

HTML网页格式邮件的浏览

参考:https://debian-administration.org/article/75/Reading_HTML_email_with_Mutt
参考:https://fiasko.io/projects/htmail-view.html.en
参考:http://jasonwryan.com/blog/2012/05/12/mutt/

大概两步:

普通的邮件,内容只是单纯的text/plain格式,这样我们不用渲染直接看就行。但有的邮件为了美化,往往用text/html的格式展现,这就很麻烦,因为看到的都是html代码。
所以遇到HTML格式的邮件,我们需要做的是利用第三方软件来Render(渲染).

渲染的问题涉及到两个问题需要解决:

HTML源码翻译成文字非常好解决,只要利用w3m等命令行浏览器即可完成,非常轻量非常简单非常快感受不到有它的存在,可以直接在mutt中查看。
但是图片就有些问题了:图片在终端里展示,一直是个问题。虽然可以达到,但是需要配置很多东西。所以有人为了图方便,遇到HTML格式邮件,就直接弹出chrome网页来看(不推荐)。这样说实话,就没什么意义了。

常用的HTML渲染为Text的方式有:

常用的图片显示方法有:

w3m渲染

brew install w3m后,就得到了一个命令行里的浏览器。

然后我们需要配置两个mutt配置文件。

~/.muttrc添加这两行:

auto_view text/html # View HTML automatically
alternative_order text/plain text/enriched text/html # save html for last

~/.mailcap添加这一行:

text/html; w3m -I %{charset} -T text/html; copiousoutput;

然后重新打开mutt,再打开一个html格式的邮件就发现,内容已经很好的转换成人可读的text格式了。
当然,这时候还不能看图片。

关于mutt图片渲染的问题,我们留到另一篇专门说明。

上一篇下一篇

猜你喜欢

热点阅读