sendmail 是一个非常强大且复杂的工具,它主要有两个层面的使用方式:

(图片来源网络,侵删)
- 命令行模式:直接在终端执行,用于快速发送单封邮件,常用于脚本自动化。
- 邮件传输代理:作为系统后台服务,负责接收、路由和发送所有邮件(这是它最主要、最复杂的功能)。
下面我们主要聚焦于命令行模式的参数,因为这是最常被问到的,对于其作为 MTA 的配置,会简要提及。
核心命令行参数(用于发送邮件)
在命令行下,sendmail 的基本用法有两种:
交互式发送
这是最简单的方式,sendmail 会提示你输入收件人、主题和邮件正文。
sendmail -t
执行后,你需要依次输入:

(图片来源网络,侵删)
- 收件人:格式为
To: user@example.com,然后按回车。 - 抄送(可选):格式为
Cc: another@example.com,然后按回车。 - 主题(可选):格式为
Subject: This is a test email,然后按回车。 - 邮件正文:输入你的邮件内容,输入完成后,单独在一行输入一个点 ,然后按回车,邮件就会被发送。
示例:
$ sendmail -t To: recipient@example.com Cc: cc_user@example.com Subject: My First Test Email Hello, This is the body of my email. I hope you are doing well. .
命令行参数模式(非交互式)
这种方式更常用于脚本中,因为它允许你通过命令行参数直接指定所有信息,而无需手动输入。
常用参数详解
| 参数 | 全称 | 描述 | 示例 |
|---|---|---|---|
-t |
--to |
中提取收件人、抄送、密送等邮件头信息,这是最常用的参数之一。 | sendmail -t < email.txt |
-i |
--ignore-dot |
在交互模式下,将邮件正文中的单个点 视为普通字符,而不是邮件结束的标志。 | sendmail -it |
-i |
--init-file |
(注意:这个 -i 是 --init-file 的缩写,与 --ignore-dot 冲突,实际使用中 --ignore-dot 更常见) |
|
-f |
--from |
指定发件人地址,这通常是必须的,否则邮件可能被邮件服务器拒绝或被标记为垃圾邮件。 | sendmail -f my_email@mydomain.com -t < email.txt |
-F |
--full-name |
指定发件人的全名。 | sendmail -F "My Name" -f my_email@mydomain.com -t < email.txt |
-t |
--to |
(已列出) 从邮件内容中提取收件人。 | |
-s |
--subject |
在命令行直接指定邮件主题,如果邮件内容中也有 Subject: 头,这个参数会覆盖它。 |
sendmail -s "My Subject" -t < email.txt |
-a |
--append |
附加指定的邮件头,可以多次使用。 | sendmail -a "X-Custom-Header: Value" -t < email.txt |
-b |
--batch |
以批处理模式运行,从标准输入读取邮件,通常与 -t 一起使用。 |
sendmail -bt (用于测试配置,非发送) |
-bv |
--verify |
验证收件人地址,但不发送邮件,它会检查该用户是否存在或是否可以接收邮件。 | sendmail -bv user@example.com |
-v |
--verbose |
显示详细的发送过程,对于调试非常有用,可以看到与邮件服务器的交互过程。 | sendmail -v -t < email.txt |
-q |
--queue |
处理队列中的邮件,通常由系统定时任务调用,用于重试发送失败的邮件。 | sendmail -q |
-q |
--quit |
优雅地停止 sendmail 守护进程。 |
sendmail -q (在守护进程模式下) |
-bd |
--daemon |
以守护进程模式运行,监听网络连接,接收其他服务器的邮件,这是 sendmail 作为 MTA 的核心功能。 |
通常由系统服务脚本管理,不直接手动运行。 |
-bs |
--SMTP |
以 SMTP 协议模式运行,与 -t 类似,但它期望输入符合 SMTP 协议的命令(如 MAIL FROM:, RCPT TO:)。 |
sendmail -bs |
-C |
--config |
指定一个非默认的配置文件,用于测试不同的配置。 | sendmail -C /path/to/custom-config.cf |
-d |
--debug |
开启调试模式,后面可以跟一个数字来指定调试的详细级别和类型。 | sendmail -d0.1 -t (显示版本和配置文件路径) |
综合使用示例
假设你要发送一封 HTML 格式的邮件,内容保存在 report.html 文件中。
示例 1:使用邮件头文件
-
创建邮件头文件
headers.txt:To: boss@company.com Cc: team@company.com Subject: Daily Sales Report From: sales@mycompany.com Content-Type: text/html; charset=UTF-8 -
创建邮件正文
report.html:<h1>Daily Sales Report</h1> <p>Total sales today: <b>$10,000</b></p>
-
合并并发送:
# 将邮件头和正文合并,通过管道传递给 sendmail cat headers.txt report.html | sendmail -t
示例 2:使用命令行参数和文件重定向
已经包含了所有必要的邮件头(如 To:, Subject:),你可以直接发送文件。
# 假设 email_with_headers.txt 包含了 To, Subject, From 等所有信息 sendmail -t < email_with_headers.txt
示例 3:带调试和指定发件人
# 发送一个简单的文本邮件,并显示详细过程 ( echo "To: recipient@example.com" echo "From: me@mydomain.com" echo "Subject: Test with Debug" echo "" echo "This is a test message with verbose output." ) | sendmail -v -f me@mydomain.com
执行后,你会看到类似下面的输出,显示了与邮件服务器的握手、传输和断开过程:
>>> 220 ESMTP ...
>>> EHLO ...
>>> MAIL FROM:<me@mydomain.com>
>>> RCPT TO:<recipient@example.com>
>>> DATA
>>> .
>>> 250 ...
>>> 250 ...
>>> 250 ...
>>> 250 Message accepted for delivery
>>> QUIT
重要注意事项
-
本地邮件 vs. 远程邮件:
- 如果收件人是本地系统用户(如
root,john),sendmail会直接将邮件写入该用户的邮箱文件(通常是/var/spool/mail/username)。 - 如果收件人是外部邮箱地址(如
user@gmail.com),sendmail会将其提交到邮件队列,然后尝试通过配置的邮件服务器(如 postfix, exim, 或远程的 SMTP 服务器)发送出去。
- 如果收件人是本地系统用户(如
-
sendmailvs.mail/mailx:mail或mailx是一个更简单的邮件客户端,它底层也是调用sendmail或其替代品(如postfix的sendmail兼容包装器)来发送邮件,对于简单任务,mail命令可能更方便。
-
作为 MTA 的配置:
sendmail的核心功能是作为 MTA,它的行为由主配置文件/etc/mail/sendmail.cf(或更现代的/etc/mail/sendmail.mc)控制。- 现代系统上,
sendmail经常被 Postfix 或 Exim 等更易于配置的 MTA 替代,但为了兼容性,这些软件包通常会提供一个sendmail命令行工具,它实际上是调用它们自己的后端,你可以使用which sendmail查看你的系统使用的是哪个。
-
安全与垃圾邮件:
- 不要在脚本中硬编码发件人地址,特别是不要伪造发件人(除非你有充分理由并了解后果)。
- 使用
-f指定一个真实的、存在的发件人地址,可以大大提高邮件的送达率,避免被标记为垃圾邮件。 - 确保你的服务器没有配置为开放中继,否则会被垃圾邮件发送者利用。
希望这份详细的参数列表和示例能帮助你更好地理解和使用 sendmail!
