在 Linux 命令行中收發(fā) Gmail 郵件
即使你用的是諸如 Gmail 的托管郵件服務(wù),你也可以通過 Mutt 在終端里收發(fā)電子郵件。
我喜歡在 Linux 終端上讀寫電子郵件的便捷,因此我是 Mutt 這個輕量簡潔的電子郵件客戶端的忠實用戶。對于電子郵件服務(wù)來說,不同的系統(tǒng)配置和網(wǎng)絡(luò)接入并不會造成什么影響。這個客戶端通常隱藏在我 Linux 終端的 某個標(biāo)簽頁或者某個終端復(fù)用器的面板 上,需要用的時候隨時可以調(diào)出來,不需要使用的時候放到后臺,就不需要在桌面上一直放置一個電子郵件客戶端的應(yīng)用程序。
當(dāng)今我們大多數(shù)人使用的都是托管電子郵件賬號,在這種使用場景中并不會與電子郵件協(xié)議發(fā)生過多的直接交互。而 Mutt(以及更早的 ELM)是在更簡單的時代創(chuàng)建的,那時候檢查郵件只是對 uucp 的調(diào)用,以及對 /var/mail 的讀取。當(dāng)然 Mutt 也很與時俱進,隨著各種流行的協(xié)議(如 POP、IMAP、LDAP)出現(xiàn),它都實現(xiàn)了良好的支持。因此,即使我們使用的是 Gmail 這種郵件服務(wù),也可以與 Mutt 無縫銜接。
如今在大多數(shù)情況下,用戶都不會擁有自己的電子郵件服務(wù)器,大部分用戶都會選擇 Gmail,因此下文會以 Mutt + Gmail 為例作介紹。如果你比較注重電子郵件隱私,不妨考慮 ProtonMail 或者 Tutanota,它們都提供完全加密的電子郵件服務(wù)。其中 Tutanota 包含很多 開源組件,而 ProtonMail 則為付費用戶提供 IMAP 橋接,簡化了在非瀏覽器環(huán)境下的郵件訪問。不過,很多公司、學(xué)校和組織都沒有自己的電子郵件服務(wù),而是使用 Gmail 提供的郵件服務(wù),這樣一來,大部分用戶都會有一個 Gmail 郵箱。
當(dāng)然,如果你自己就 擁有電子郵件服務(wù)器,那么使用 Mutt 就更簡單了。下面我們開始介紹。
安裝 Mutt
在 Linux 系統(tǒng)上,一般可以直接從發(fā)行版提供的軟件庫中安裝 Mutt,另外需要在家目錄中創(chuàng)建一個 .mutt 目錄以存放配置文件:
- $ sudo dnf install mutt
- $ mkdir ~/.mutt
在 MacOS 上,可以通過 MacPorts 或者 Homebrew 安裝;在 Windows 上則可以使用 Chocolatey 安裝。
Mutt 是一個郵件用戶代理Mail User Agent(MUA),因此它的作用是讀取、編寫以及向外部郵件池發(fā)送郵件。向郵件服務(wù)器實際傳輸郵件是其它應(yīng)用或郵件服務(wù)的工作,盡管它們可以和 Mutt 進行協(xié)作,讓我們看起來是 Mutt 完成了所有功能,但實際上并非如此。在弄懂了兩者之間的區(qū)別之后,我們會對 Mutt 的配置更加清楚。
這也是為什么除了 Mutt 之外,我們還需要視乎進行通信的服務(wù)種類選擇一些輔助應(yīng)用程序。在本文中我使用的是 IMAP 服務(wù),這可以讓我本地的電子郵件副本與電子郵件服務(wù)提供商的遠(yuǎn)程郵件副本保持同步。如果你選擇 POP 服務(wù),配置的難度就更下一個臺階了,也無需依賴其它外部工具。我們需要 OfflineIMAP 這個 Python 應(yīng)用程序來實現(xiàn) IMAP 的集成,這個應(yīng)用程序可以在 它的 GitHub 存儲庫 獲取。
OfflineIMAP 目前仍然在從 Python 2 移植到 Python 3,目前需要手動安裝,但以后你也可以通過 python3 -m pip 命令進行安裝。
OfflineIMAP 依賴于 imaplib2 庫,這個庫也在努力開發(fā)當(dāng)中,所以我更喜歡手動安裝。同樣地,也是通過 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,那么你還需要安裝 Portlocker。
配置 OfflineIMAP
OfflineIMAP 默認(rèn)使用 ~/.offlineimaprc 這個配置文件,在它的代碼庫中會有一個名為 offlineimap.conf 的配置模板,可以直接將其移動到家目錄下:
- $ mv offlineimap3.git/offlineimap.conf ~/.offlineimaprc`
你可以使用任何文本編輯器打開瀏覽這個配置文件,它的注釋很完善,便于了解各個可用的配置項。
以下是我的 .offlineimaprc 配置文件,為了清晰起見,我把其中的注釋去掉了。對于你來說其中有些配置項的值可能會略有不同,但或許會為你的配置帶來一些啟發(fā):
- [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 設(shè)置雙因素身份驗證(2FA)
Google 希望用戶通過 Gmail 網(wǎng)站收發(fā)電子郵件,因此當(dāng)你在 Gmail 網(wǎng)站以外操作電子郵件時,實際上是被 Google 作為“開發(fā)者”看待(盡管你沒有進行任何開發(fā)工作)。也就是說,Google 會認(rèn)為你正在創(chuàng)建一個應(yīng)用程序。要獲得開發(fā)者層面的應(yīng)用程序密碼,就必須設(shè)置雙因素身份驗證。完成了這個過程以后,就可以獲得一個應(yīng)用程序密碼,Mutt 可以通過這個密碼在瀏覽器以外的環(huán)境登錄到你的電子郵箱中。
為了安全起見,你還可以在 Google 的 賬號安全 頁面中添加一個用于找回的電子郵件地址。
在賬號安全頁面中,點擊“兩步驗證2-step Verification”開始設(shè)置 2FA,設(shè)置過程中需要用到一部手機。
激活 2FA 之后,賬號安全頁面中會出現(xiàn)“應(yīng)用程序密碼App Passwords”選項,點擊就可以為 Mutt 創(chuàng)建一個新的應(yīng)用程序密碼。在 Google 生成密碼之后,將其替換 .offlineimaprc 配置文件中的 %your-gmail-API-password% 值。
直接將應(yīng)用程序密碼記錄在 .offlineimaprc 文件中,這種以純文本形式存儲的做法有一定的風(fēng)險。長期以來我都是這樣做的,而且感覺良好,因為我的家目錄是加密的。但出于安全考慮,我現(xiàn)在已經(jīng)改為使用 GnuPG 加密應(yīng)用程序密碼,這部分內(nèi)容不在本文的討論范圍,關(guān)于如何設(shè)置 GPG 密碼集成,可以參考我的 另一篇文章。
在 Gmail 啟用 IMAP
在你永遠(yuǎn)告別 Gmail 網(wǎng)頁界面之前,還有最后一件事:你必須啟用 Gmail 賬戶的 IMAP 訪問。
在 Gmail 網(wǎng)站頁面中,點擊右上角的“cog”圖標(biāo),選擇“查看所有設(shè)置See all settings”。在 Gmail 設(shè)置頁面中,點擊“POP/IMAP”標(biāo)簽頁,并選中“啟用 IMAPenable IMAP”,然后保存設(shè)置。
現(xiàn)在就可以在瀏覽器以外訪問你的 Gmail 電子郵件了。
配置 Mutt
Mutt 的配置過程相對簡單。和 .bashrc、.zshrc、.emacs 這些配置文件一樣,網(wǎng)絡(luò)上有很多優(yōu)秀的 .muttrc 配置文件可供參照。我自己的 .muttrc 配置文件則借鑒了 Kyle Rankin、Paul Frields 等人的配置項和想法。下面列出我的配置文件的一些要點:
- 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 將遠(yuǎn)程郵件服務(wù)器上的郵件同步到本地。在首次啟動的時候耗時可能會比較長,只需要讓它整晚運行直到同步完成就可以了。
在同步完成后,啟動 Mutt:
- $ mutt
Mutt 會提示你打開用于管理電子郵件的目錄權(quán)限,并展示收件箱的視圖。
學(xué)習(xí)使用 Mutt
在學(xué)習(xí)使用 Mutt 的過程中,你可以找到最符合你使用習(xí)慣的 .muttrc 配置。例如我的 .muttrc 配置文件集成了使用 Emacs 編寫郵件、使用 LDAP 搜索聯(lián)系人、使用 GnuPG 對郵件進行加解密、鏈接獲取、HTML 視圖等等一系列功能。你可以讓 Mutt 做到任何你想讓它做到的事情,你越探索,就能發(fā)現(xiàn)越多。