mail 命令是一个在 Linux/Unix 终端中发送和接收邮件的经典命令行工具,它非常适用于自动化脚本、系统通知或简单的邮件发送任务。

mail 命令简介
mail 命令主要有两个功能:
- 发送邮件:作为邮件客户端,将文本内容作为邮件发送给指定的收件人。
- 读取邮件:作为邮件用户代理,读取用户的收件箱中的邮件(较少用于此目的,现在更常用
mutt或thunderbird)。
在 Postfix 环境下,当你使用 mail 命令发送邮件时,它实际上会调用系统的邮件传输代理,也就是 Postfix,将邮件传递出去,Postfix 负责处理邮件的路由、中继和投递。
发送邮件 (最常用)
这是 mail 命令最核心的用法,基本语法如下:
mail [-s "邮件主题"] [-a "附件文件"] [-c "抄送地址"] [-b "密送地址"] 收件人地址
参数说明:

-s "Subject": 指定邮件的主题,这是一个非常重要的参数,建议始终使用。-a "filename": 添加附件,可以多次使用-a来添加多个附件。-c "address": 指定抄送 收件人。-b "address": 指定密送 收件人。收件人地址: 邮件的主要接收者。
基本用法示例
发送一个简单的邮件
mail user@example.com
执行后,终端会进入邮件正文输入模式,你需要输入邮件内容,并以 Ctrl+D (表示文件结束符 EOF) 结束输入。
# 在终端中输入以下命令 mail user@example.com # 然后输入邮件正文 Hi there, This is a test email sent from the command line using the mail command. Best regards, Your Name # 按下 Ctrl+D 结束输入 # (此时可能会提示你输入抄送人 Cc:,直接回车跳过) EOT
发送带有主题的邮件
强烈建议始终使用 -s 参数指定主题,否则收件人看到的邮件主题可能是空白的或 "No Subject"。

mail -s "System Update Notification" admin@yourdomain.com
在命令行中直接指定正文 很短,可以使用 加上引号的方式直接在命令行中指定,而不用进入交互模式。
mail -s "Quick Status Check" dev-team@company.com <<EOF Hi Team, Just a quick note to confirm that the nightly build has completed successfully. Regards, Build System EOF
这里使用了 Here Document (<<EOF) 的方式,可以方便地输入多行文本。
发送带附件的邮件
使用 -a 参数可以轻松添加附件,附件可以是任意文件。
# 发送一个日志文件作为附件 mail -s "Server Log Attached" support@yourdomain.com -a /var/log/syslog.1 <<EOF Hi Support Team, Please find the server log from yesterday attached for your review. Thanks, Admin EOF
抄送 和密送
# 发送给 primary@example.com,并抄送给 secondary@example.com,密送给 hidden@example.com mail -s "Project Update" primary@example.com -c secondary@example.com -b hidden@example.com <<EOF Hello everyone, Here is the latest project update... EOF
邮件正文中的特殊命令
在 mail 命令的交互模式下(即你输入完 mail 命令并按下回车后),除了输入邮件正文,你还可以使用一些特殊命令来编辑邮件。
| 命令 | 功能 | 示例 |
|---|---|---|
~h |
编辑邮件的头信息(To, Subject, Cc, Bcc) | ~h |
~t address |
添加新的收件人 | ~t another_user@example.com |
~s new subject |
修改邮件主题 | ~s New Important Subject |
~c address |
添加抄送人 | ~c manager@company.com |
~b address |
添加密送人 | ~b ceo@company.com |
~a text |
在邮件正文末尾追加文本 | ~a Regards, |
~i text |
在邮件正文开头插入文本 | ~i Dear Team, |
~d |
将草稿文件 ($HOME/dead.letter) 的内容读入到当前邮件中 |
~d |
~w filename |
将当前邮件正文写入到一个文件中(保存草稿) | ~w my_draft.txt |
~q |
退出编辑模式,但不发送邮件,邮件内容会保存到 dead.letter 文件中。 |
~q |
| 发送邮件并退出编辑模式。 |
示例:在发送前编辑邮件头
mail user@example.com # 进入交互模式后,先编辑邮件头 ~h # 系统会提示你输入 To, Subject, Cc, Bcc To: [user@example.com] Subject: [My Custom Subject] Cc: [] Bcc: [] # 按回车确认 # 然后输入邮件正文 This is the body of my email. # 按下 Ctrl+D 发送 EOT
接收邮件
虽然 mail 命令也可以用来读取收件箱,但它比较基础,功能有限,它通常用于快速查看最新的几封邮件。
执行此命令后,你会看到收件箱的邮件列表,格式如下:
"/var/spool/mail/$(whoami)": 2 messages 2 new
>N 1 root@localhost.local Wed Dec 6 10:30 15/513 "System Update"
N 2 admin@yourdomain.com Wed Dec 6 11:05 120/4502 "Urgent: Check Server"
列表符号说明:
>: 表示当前选中的邮件。N: 表示新邮件。n: 表示已读邮件。
常用操作:
- 输入邮件的数字,然后按回车,可以阅读该邮件。
- 在阅读邮件时,输入
h可以返回邮件列表。 - 输入
q可以退出mail客户端。
与 Postfix 相关的常见问题排查
当你使用 mail 命令发送邮件失败时,通常问题出在 Postfix 的配置上,以下是一些排查步骤:
-
检查 Postfix 服务状态 确保服务正在运行。
sudo systemctl status postfix
-
查看邮件日志 Postfix 的所有活动都会被记录在日志中,这是排查问题的首要步骤。
# 实时查看日志 sudo tail -f /var/log/mail.log # 或者查看系统日志 sudo tail -f /var/log/syslog | grep postfix
常见的错误信息有:
Relay access denied: 表示 Postfix 拒绝转发邮件,这通常是由于main.cf中的mynetworks或smtpd_relay配置问题,或者你尝试从不受信任的网络发送邮件。Recipient address rejected: 表示收件人地址不存在或格式错误。connect to Milter service unix:/var/spool/postfix/spamass/spamass.sock: No such file or directory: 如果你集成了 SpamAssassin 等过滤器,可能是服务未启动或配置路径错误。
-
检查 DNS 记录 对于外发邮件,确保你的域名有正确的 A 记录 和 MX 记录,其他服务器需要通过这些记录找到你的邮件服务器。
-
测试本地发送 先尝试发送邮件到本地用户,以排除网络和外部域名解析问题。
mail your_local_username
-
使用
telnet手动测试 SMTP 这是最底层的测试方法,可以精确判断 Postfix 的 SMTP 服务是否正常工作。# 连接到本地的 SMTP 端口 25 telnet localhost 25 # 如果连接成功,会返回类似 "220 ESMTP Postfix" 的欢迎信息 # 然后依次输入 SMTP 命令 helo yourdomain.com mail from: <sender@example.com> rcpt to: <recipient@example.com> data Subject: Test from Telnet This is a test body. . (注意:单独一行的 "." 表示邮件正文结束) quit
mail 命令是一个强大而简洁的工具,非常适合在服务器上进行自动化邮件发送,在 Postfix 环境下,它作为前端与 MTA 交互,其核心在于正确使用 -s、-a 等参数来构建邮件,并学会利用日志来排查 Postfix 可能出现的配置问题。
