通过 Linux 命令行发送和接收 Gmail

使用 Mutt 从终端发送和接收电子邮件,即使您使用的是 Gmail 等托管服务。
81 位读者喜欢这篇文章。
woman on laptop sitting at the window

CC BY 3.0 US Mapbox Uncharted ERG

我是 Mutt 用户。我喜欢在便捷的 Linux 终端中查看和撰写电子邮件。使用像 Mutt 这样轻量级和极简的客户端,我知道无论系统规格或互联网访问如何,我都可以使用我的电子邮件。而且由于我打开 Linux 终端的频率非常高,我的电子邮件客户端基本上不会占用我的桌面空间。它隐藏在终端选项卡或多路复用器窗格中,因此我可以在不需要时忽略它,但在需要时可以快速访问它。

人们普遍认为 Mutt 存在一个问题,那就是我们大多数人现在都使用托管电子邮件帐户,并且仅表面上与实际电子邮件协议进行交互。Mutt(以及之前的 ELM)是在更简单的时代创建的,那时检查电子邮件是调用 uucp 和查看 /var/mail。然而,它很好地适应了发展中的技术,并且可以与各种现代协议(如 POP、IMAP 甚至 LDAP)良好配合使用,因此即使您使用 Gmail 作为电子邮件主机,也可以使用 Mutt。

由于今天运行自己的电子邮件服务器相对罕见,并且由于 Gmail 非常普遍,本教程假设您将 Mutt 与 Gmail 一起使用。如果您担心电子邮件隐私,请考虑在 ProtonMailTutanota 开设帐户,这两者都提供完全加密的电子邮件。Tutanota 有许多 开源组件,ProtonMail 为付费用户提供 IMAP 桥,这样您就不必费力在浏览器之外访问您的电子邮件。但是,许多公司、学校和组织不运行自己的电子邮件服务,而只是使用 Gmail,因此您可能拥有 Gmail 帐户,无论您是否想要。

如果您正在运行自己的电子邮件服务器,那么设置 Mutt 甚至比我在本文中演示的还要容易,所以直接开始吧。

安装 Mutt

在 Linux 上,您可以从发行版的软件存储库安装 Mutt,然后创建一个 .mutt 目录来保存其配置文件

$ sudo dnf install mutt
$ mkdir ~/.mutt

在 macOS 上,使用 MacPortsHomebrew。在 Windows 上,使用 Chocolatey

Mutt 是一个邮件用户代理 (MUA),意味着它的工作是读取、撰写和发送电子邮件到出站邮件假脱机。实际上将消息传输到邮件服务器或从邮件服务器传输消息是其他应用程序或服务的工作(尽管 Mutt 有很多集成,以至于看起来它正在完成所有工作,即使它不是)。了解任务的这种分离有助于配置更有意义。

它还解释了为什么您必须拥有辅助应用程序(除了 Mutt 之外),具体取决于您需要与什么服务通信。对于本文,我使用 IMAP,以便我的电子邮件本地副本和我的电子邮件提供商的远程邮件副本保持同步。如果您决定改用 POP,则该配置甚至更容易配置,并且无需任何外部工具即可完成。但是,IMAP 集成需要 OfflineIMAP,这是一个 Python 应用程序,可从 其 GitHub 存储库获得。

最终,您将能够使用 python3 -m pip 命令安装它,但截至撰写本文时,您必须手动安装 OfflineIMAP,因为它仍在从 Python 2 移植到 Python 3。

OfflineIMAP 需要 imaplib2,它也处于大量开发中,因此我更喜欢手动安装它。过程相同:使用 Git 克隆源代码存储库,更改到目录,然后使用 pip 安装。

首先,安装 rfc6555 依赖项

$ python3 -m pip install --user rfc6555

接下来,从源代码安装 imaplib2

$ git clone git@github.com:jazzband/imaplib2.git
$ pushd imaplib2.git
$ python3 -m pip install --upgrade --user .
$ popd

最后,从源代码安装 OfflineIMAP

$ git clone git@github.com:OfflineIMAP/offlineimap3.git
$ pushd offlineimap3.git
$ python3 -m pip install --upgrade --user .
$ popd

如果您在 Windows 上使用 Cygwin,那么您还必须安装 Portalocker

配置 OfflineIMAP

OfflineIMAP 默认读取配置文件 ~/.offlineimaprc。此文件的模板(名为 offlineimap.conf)包含在您克隆以安装 OfflineIMAP 的 Git 存储库中。将示例文件移动到您的主目录

$ mv offlineimap3.git/offlineimap.conf ~/.offlineimaprc

在您喜欢的文本编辑器中打开文件并通读它。这是一个注释完善的文件,熟悉可用的选项是很好的。

这是我的 .offlineimaprc 作为示例,为了简洁起见,删除了注释。某些值可能与您的略有不同,但这为您提供了您的最终产品应该是什么样子的合理想法

[general]
ui = ttyui
accounts = %your-gmail-username%
pythonfile = ~/.mutt/password_prompt.py
fsync = False

[Account %your-gmail-username%]
localrepository = %your-gmail-username%-Local
remoterepository = %your-gmail-username%-Remote
status_backend = sqlite
postsynchook = notmuch new

[Repository %your-gmail-username%-Local]
type = Maildir
localfolders = ~/.mail/%your-gmail-username%-gmail.com
nametrans = lambda folder: {'drafts':  '[Gmail]/Drafts',
                            'sent':    '[Gmail]/Sent Mail',
                            'flagged': '[Gmail]/Starred',
                            'trash':   '[Gmail]/Trash',
                            'archive': '[Gmail]/All Mail',
                            }.get(folder, folder)

[Repository %your-gmail-username%-Remote]
maxconnections = 1
type = Gmail
remoteuser = %your-gmail-username%@gmail.com
remotepasseval = '%your-gmail-API-password%'
## remotepasseval = get_api_pass()
sslcacertfile = /etc/ssl/certs/ca-bundle.crt
realdelete = no
nametrans = lambda folder: {'[Gmail]/Drafts':    'drafts',
                            '[Gmail]/Sent Mail': 'sent',
                            '[Gmail]/Starred':   'flagged',
                            '[Gmail]/Trash':     'trash',
                            '[Gmail]/All Mail':  'archive',
                            }.get(folder, folder)
folderfilter = lambda folder: folder not in ['[Gmail]/Trash',
                                             '[Gmail]/Important',
                                             '[Gmail]/Spam',
                                             ]

此文件中有两个可替换的值:%your-gmail-username%%your-gmail-API-password%。将第一个替换为您的 Gmail 用户名。那是您的电子邮件地址中 @gmail.com 部分左侧的部分。您必须通过双因素身份验证 (2FA) 设置过程从 Google 获取第二个值(即使您不需要使用 2FA 来检查电子邮件)。

设置 Gmail 的 2FA

Google 希望其用户使用 Gmail 网站进行电子邮件,因此当您尝试在 Gmail 界面之外访问您的电子邮件时,您本质上是以开发人员的身份进行操作(即使您不认为自己是开发人员)。换句话说,您正在创建 Google 认为的“应用”。要获得开发人员级别的应用密码,您必须设置 2FA;通过该过程,您将获得一个应用密码,Mutt 可以使用该密码在通常的浏览器界面之外登录。

为了安全起见,您还可以添加恢复电子邮件地址。为此,请转到 Google 的 帐户安全页面 并向下滚动到 恢复电子邮件

要设置 2FA,请返回帐户安全页面,然后单击 两步验证 以激活和配置它。这需要一部手机进行设置。

激活 2FA 后,您将获得一个新的 Google 帐户安全选项:应用密码。单击它以为 Mutt 创建新的应用密码。Google 会为您生成密码,因此复制密码并将其粘贴到您的 .offlineimaprc 文件中,以替换 %your-gmail-API-password% 值。

将您的 API 密码放在 .offlineimaprc 文件中会将其以纯文本形式存储,这可能很危险。很长一段时间以来,我这样做感觉很好,因为我的主目录已加密。但是,为了提高安全性,我现在使用 GnuPG 加密我的 API 密码。这有点超出本文的范围,但我写了一篇文章,演示了如何设置 GPG 密码集成

在 Gmail 中启用 IMAP

在您可以永远告别 Gmail 网络界面之前,还有最后一件事:您必须启用对您的 Gmail 帐户的 IMAP 访问。

为此,请转到 Gmail 网络界面,单击右上角的“齿轮”图标,然后选择 查看所有设置。在 Gmail 设置中,单击 POP/IMAP 选项卡,然后启用 启用 IMAP 旁边的单选按钮。保存您的设置。

现在 Gmail 已配置为允许您在 Web 浏览器之外访问您的电子邮件。

配置 Mutt

现在您已经为 Mutt 完成了所有设置,您会很高兴地了解到配置 Mutt 很容易。与 .bashrc.zshrc 和 .emacs 文件一样,互联网上有很多非常好的 .muttrc 文件示例。对于我的配置文件,我借鉴了 Kyle RankinPaul Frields 和许多其他人的选项和想法,因此为了简单起见,我将我的 .muttrc 文件缩写为仅包含基本要素

set ssl_starttls=yes
set ssl_force_tls=yes

set from='tux@example.com'
set realname='Tux Example'

set folder = imaps://imap.gmail.com/
set spoolfile = imaps://imap.gmail.com/INBOX
set postponed="imaps://imap.gmail.com/[Gmail]/Drafts"
set smtp_url="smtp://smtp.gmail.com:25"
set move = no
set imap_keepalive = 900
set record="imaps://imap.gmail.com/[Gmail]/Sent Mail"

# Paths 
set folder           = ~/.mail
set alias_file       = ~/.mutt/alias
set header_cache     = "~/.mutt/cache/headers"
set message_cachedir = "~/.mutt/cache/bodies"
set certificate_file = ~/.mutt/certificates
set mailcap_path     = ~/.mutt/mailcap
set tmpdir           = ~/.mutt/temp
set signature        = ~/.mutt/sig
set sig_on_top       = yes

# Basic Options
set wait_key = no
set mbox_type = Maildir
unset move               # gmail does that

# Sidebar Patch
set sidebar_visible = yes
set sidebar_width   = 16
color sidebar_new color221 color233

## Account Settings
# Default inbox
set spoolfile = "+example.com/INBOX"

# Mailboxes to show in the sidebar.
mailboxes +INBOX \
          +sent \
          +drafts

# Other special folder
set postponed = "+example.com/drafts"

# navigation
macro index gi "<change-folder>=example.com/INBOX<enter>" "Go to inbox"
macro index gt "<change-folder>=example.com/sent" "View sent"

此文件中的任何内容都不需要更改,但请考虑将虚假姓名 Tux Example 和虚假地址 example.com 替换为适用于您的内容。将此文本复制并粘贴到文件中,并将其另存为 ~/.mutt/muttrc

启动 Mutt

在启动 Mutt 之前,从终端运行 offlineimap 以将您的计算机与远程服务器同步。第一次运行需要很长时间,因此让它运行过夜。

一旦您的帐户同步完成,您就可以启动 Mutt

$ mutt

Mutt 会提示您允许创建它需要的目录以组织您的电子邮件活动,然后显示您的收件箱视图。

Mutt email client

学习 Mutt

学习 Mutt 是探索应用程序和查找您最喜欢的 .muttrc 配置技巧的结合。例如,我的配置文件集成了 Emacs 用于撰写消息,LDAP 用于搜索联系人,GnuPG 用于加密和解密消息,链接收集,HTML 视图等等。您可以将 Mutt 变成您想要的任何东西(只要您希望它成为电子邮件客户端),并且您尝试的越多,您发现的就越多。

接下来阅读什么
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,经常同时工作。

评论已关闭。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.