Skip to content
0

使用 NeoMutt, isync 和 msmtp 在 macOS 终端中管理邮件

本指南将引导你完成在 macOS 上配置邮件环境的整个过程,最终实现完全在终端中接收、阅读和发送邮件。

我们将使用以下三个核心工具:

  • NeoMutt: 邮件用户代理 (MUA),我们用它来阅读、编写和管理邮件。
  • isync (mbsync): 一个 IMAP 和 MailDir 同步工具,负责将远程邮件服务器上的邮件下拉并同步到本地计算机。
  • msmtp: 一个 SMTP 客户端,负责将我们在本地编写的邮件发送出去。

这个组合的优势在于:

  1. 速度快:所有邮件都在本地,索引和搜索速度极快。
  2. 安全:密码可以安全地存储在 macOS 的钥匙串中,而不是明文保存在配置文件里。
  3. 可定制性强:NeoMutt 和相关工具链的每一个环节都可以高度定制。
  4. 开放标准:使用 Maildir 格式存储邮件,不被任何单一供应商锁定。

第一步:安装工具

我们使用 Homebrew 来安装所有必要的软件。打开你的终端,运行以下命令:

bash
brew install neomutt isync msmtp

第二步:创建目录结构

我们需要为邮件和配置文件创建一些目录。

  1. 创建邮件存储目录: 我们将在 ~/.mail 目录下为每个邮箱账户创建一个独立的文件夹。这种结构清晰且易于管理。

    bash
    # 将 your-email@example.com 替换为你的真实邮箱地址
    mkdir -p ~/.mail/your-email@example.com
  2. 创建 msmtp 配置目录

    bash
    mkdir -p ~/.config/msmtp
  3. 创建 neomutt 配置目录

    bash
    mkdir -p ~/.config/neomutt

第三步:生成并存储应用专用密码 (App Password)

这是一个至关重要的安全步骤! 为了安全,不要在配置文件中使用你的主登录密码。几乎所有的主流邮件服务商(Gmail, Outlook, iCloud, 163等)都支持生成“应用专用密码”。

  1. 登录你的邮件提供商的网页版。
  2. 进入账户安全设置。
  3. 找到“应用专用密码”(App Passwords / App-Specific Passwords)选项并生成一个新的密码。给它起个名字,比如 "NeoMutt"。
  4. 复制这个生成的密码,我们马上会用到它。

现在,我们将这个专用密码安全地存储在 macOS 的钥匙串 (Keychain) 中。

bash
# 将 your-email@example.com 替换为你的邮箱
# 将 YOUR_APP_PASSWORD 替换为你刚刚生成的应用专用密码
security add-generic-password -a 'your-email@example.com' -s 'mail_password' -w 'YOUR_APP_PASSWORD'

这样做之后,我们的配置文件将通过命令从钥匙串中读取密码,而不是明文存储。


第四步:配置 isync (mbsync) - 同步邮件

isync 的配置文件是 ~/.mbsyncrc。创建这个文件并填入以下内容。请务必将所有占位符(例如 your-email@example.com, imap.example.com)替换为你的实际信息。

文件: ~/.mbsyncrc (更新版语法)

ini
# IMAP 账户配置
IMAPAccount my-account
Host imap.example.com
User your-email@example.com
# 使用命令从 macOS 钥匙串中获取密码
PassCmd "security find-generic-password -a 'your-email@example.com' -s 'mail_password' -w"
TLSType IMAPS
AuthMechs LOGIN

# 远程邮件服务器存储配置
IMAPStore my-account-remote
Account my-account

# 本地邮件存储配置
MaildirStore my-account-local
# 邮件将存储在这个路径下
Path ~/.mail/your-email@example.com/
# 收件箱路径
Inbox ~/.mail/your-email@example.com/Inbox
# 设置为 yes 会让 mbsync 自动处理目录分隔符的转换
Subfolders Verbatim

# 同步通道配置
Channel my-account-inbox
Far :my-account-remote:
Near :my-account-local:
# 同步所有文件夹
Patterns *
# 自动创建本地文件夹
Create Near
# 立即从本地删除已在服务器上删除的邮件
Expunge Near
# 同步
Sync Pull

第五步:配置 msmtp - 发送邮件

msmtp 的配置文件是 ~/.config/msmtp/config。创建这个文件并填入以下内容。

文件: ~/.config/msmtp/config

ini
# 默认账户
defaults
auth           on
tls            on
tls_starttls   off
tls_trust_file /etc/ssl/cert.pem
logfile        ~/.config/msmtp/msmtp.log

# 你的邮箱账户配置
account        my-account
host           smtp.example.com
port           465
from           your-email@example.com
user           your-email@example.com
# 同样,从钥匙串中获取密码
passwordeval   "security find-generic-password -a 'your-email@example.com' -s 'mail_password' -w"

# 设置 my-account 为默认发送账户
account default : my-account

重要:设置文件权限 为了保护你的配置,设置正确的权限,确保只有你自己可以读写这个文件。

bash
chmod 600 ~/.config/msmtp/config

第六步:配置 NeoMutt - 邮件客户端

现在我们来配置主角 NeoMutt。它的配置文件是 ~/.config/neomutt/neomuttrc

文件: ~/.config/neomutt/neomuttrc

muttrc
# =============================================================================
# 账户信息 (Account Info)
# =============================================================================
set realname = "你的名字"
set from = "your-email@example.com"

# =============================================================================
# 文件夹路径 (Folder Paths)
# =============================================================================
# 设置 Maildir 的根目录
set folder = "~/.mail/your-email@example.com"

# 定义标准文件夹
# mbsync 会自动创建这些文件夹,这里我们告诉 neomutt 它们的位置
set spoolfile = "+Inbox"      # 收件箱
set record = "+Sent"          # 已发送
set postponed = "+Drafts"     # 草稿箱

# =============================================================================
# 发送邮件 (Sending Mail)
# =============================================================================
# 将发送邮件的任务交给 msmtp
set sendmail = "msmtp -a my-account"

# =============================================================================
# 编辑器 (Editor)
# =============================================================================
# 设置你喜欢的终端编辑器,例如 vim, neovim, emacs, nano
set editor = "nvim"

# =============================================================================
# 界面和体验优化 (UI & UX)
# =============================================================================
set sort = threads             # 按线索排序
set sort_aux = reverse-date    # 辅助排序为倒序日期
set pager_index_lines = 10     # 在邮件阅读界面显示10行索引
set arrow_cursor               # 在当前行前显示箭头 ">"
set sidebar_visible = yes      # 显示侧边栏
set sidebar_width = 20         # 侧边栏宽度

# =============================================================================
# 宏和快捷键 (Macros & Bindings)
# =============================================================================
# 按 F5 键来调用 mbsync 同步邮件
macro index,pager <F5> "<shell-escape>mbsync -a my-account<enter>" "Sync Mailbox"

第七步:首次同步和启动

一切准备就绪!

  1. 首次同步邮件: 打开终端,运行 mbsync-a 参数表示同步所有配置的通道。

    bash
    mbsync -a

    根据你的邮箱大小,第一次同步可能会花费一些时间。耐心等待它完成。

  2. 启动 NeoMutt: 同步完成后,直接在终端输入 neomutt 启动程序。

    bash
    neomutt

你现在应该能看到你的收件箱了!


附录:常见邮件服务商配置

以下是一些常见邮件服务商的 IMAP 和 SMTP 服务器信息。请在配置 ~/.mbsyncrc~/.config/msmtp/config 时使用。

服务商IMAP 主机 (Host)SMTP 主机 (host)
Gmailimap.gmail.comsmtp.gmail.com
Outlookoutlook.office365.comsmtp.office365.com
iCloudimap.mail.me.comsmtp.mail.me.com
163 (网易)imap.163.comsmtp.163.com

钥匙串(Keychain)问题排查

如果你在运行 mbsync -a 时遇到 The specified item could not be found in the keychain 的错误,请按照以下步骤操作:

  1. 直接测试密码获取: 在终端里直接运行 PassCmd 中的命令,看看能否成功取回密码。记得替换成你的邮箱。

    bash
    security find-generic-password -a 'your-email@example.com' -s 'mail_password' -w
    • 如果这个命令成功返回了你的应用专用密码,那么问题可能出在 mbsync 的配置上。请仔细检查 ~/.mbsyncrc 文件中的 PassCmd 行是否有拼写错误。
    • 如果这个命令失败并提示 The specified item could not be found in the keychain,说明当初存储密码时可能有误。请继续下一步。
  2. 删除并重新添加密码: 我们先删除可能存在的错误条目,然后重新添加一次。

    bash
    # 删除旧的(可能会提示找不到,没关系)
    security delete-generic-password -a 'your-email@example.com' -s 'mail_password'
    
    # 重新添加,这一次请格外小心,确保 -a 和 -s 的值完全正确
    # 将 YOUR_APP_PASSWORD 替换为你的应用专用密码
    security add-generic-password -a 'your-email@example.com' -s 'mail_password' -w 'YOUR_APP_PASSWORD'
  3. 再次测试: 重新添加后,再次运行第一步的 find-generic-password 命令。如果现在可以成功返回密码,那么再次运行 mbsync -a 应该就能正常工作了。

关键在于,add-generic-password 命令中的 -a '...'-s '...' 的内容,必须和 ~/.mbsyncrc 以及 ~/.config/msmtp/config 文件中 find-generic-password 命令里的 -a '...'-s '...' 完全一致


基本使用

  • j / k上下方向键:在邮件列表中移动。
  • Enter: 阅读邮件。
  • q: 退出当前视图或程序。
  • m: 写新邮件。
  • r: 回复邮件。
  • c: 切换文件夹 (按 Tab 可以看到所有文件夹)。
  • $:保存更改(例如,删除邮件后需要保存)。
  • <F5>: (根据我们的配置) 手动触发邮件同步。

恭喜!你已经成功在 macOS 终端上搭建了一套强大、高效的邮件管理系统。

配置签名

  1. 创建 ~/.config/neomutt/signature,并在文件内添加签名内容。

  2. 在 NeoMutt 配置文件内添加签名的引用位置:

    # .config/neomutt/neomuttrc
    set signature = "./sigature

这样,每次撰写新邮件时,NeoMutt 会自动地在邮件正文和签名之间插入一个 Unix 风格的邮件签名分隔符 -- 。暂时还没有良好的解决方案将 -- 去除。

配置联系人

  1. 安装 khard

    bash
    brew install khard
  2. 在 NeoMutt 配置文件内添加关于 khard 的配置:

    # =============================================================================
    # 通讯录 (Address Book)
    # =============================================================================
    # 设置 khard 为地址查询命令
    set query_command = "khard email --parsable --search-in-source-files '%s'"
    
    bind editor <Tab> complete-query
    
    # 在邮件列表或邮件内容界面按 "A" 键,将发件人添加到 khard
    macro index,pager A "<pipe-message>khard add-email<enter>" "Add sender to khard"

    这个配置成功之后,在撰写邮件、添加收件人时,只需先简单敲入几个字符,例如 mich,然后使用 Tab 可以自动补全收件人 Michael 的电邮地址 mchui@example.com(当仅有一个搜索匹配时),或弹出下拉列表供选择多个待选电邮(当存在多个搜索匹配时)。

最近更新