侧边栏壁纸
Linux入门自学网博主等级

每日学一条Linux命令,终成Linux大神

  • 累计撰写 725 篇文章
  • 累计创建 143 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux sendmail命令教程:如何使用 sendmail 命令发送电子邮件(附实例详解和注意事项)

Linux sendmail 命令介绍

sendmail(发送邮件)是一个通用的电子邮件路由工具,支持多种邮件传输和投递方法,包括 SMTP(简单邮件传输协议),它用于在互联网上进行电子邮件传输¹。sendmail 可以根据地址的语法和内容,确定使用哪些网络来发送邮件。本地地址会在一个文件中查找并进行别名替换。如果要阻止别名替换,可以在地址前加上反斜杠。从 8.10 版本开始,sendmail 在进行别名扩展时,会包含发件人;例如,如果 "john" 发送邮件给 "group",而 "group" 在扩展中包含 "john",那么这封邮件也会投递给 "john"。

Linux sendmail 命令适用的 Linux 版本

sendmail 命令适用于大多数 Linux 发行版,但是不同的发行版可能需要不同的安装方法。以下是一些常见的 Linux 发行版的 sendmail 安装命令:

# 基于 apt 的发行版(如 Debian、Ubuntu、Raspbian、Kali Linux 等):
sudo apt-get install sendmail

# 基于 yum 的发行版(如 RedHat,CentOS 7 等):
sudo yum install sendmail

# 基于 dnf 的发行版(如 Fedora,CentOS 8 等):
sudo dnf install sendmail

# 基于 apk 的发行版(如 Alpine Linux):
sudo apk add --update sendmail

# 基于 pacman 的发行版(如 Arch Linux):
sudo pacman -S sendmail

# 基于 zypper 的发行版(如 openSUSE):
sudo zypper in sendmail

# 基于 pkg 的 FreeBSD 发行版
sudo pkg install sendmail

# 基于 pkg 的 OS X/macOS 发行版:
brew install sendmail

Linux sendmail 命令的基本语法

sendmail 命令的基本语法如下:

sendmail [选项] [地址...]

其中,选项可以是以下之一:

-Ac  使用 submit.cf,即使操作模式不是初始邮件提交
-Am  使用 sendmail.cf,即使操作模式是初始邮件提交
-Btype  设置正文类型为 type,当前合法值为 7BIT 或 8BITMIME
-ba  进入 ARPANET 模式,所有输入行必须以 CR-LF 结尾,所有消息都会以 CR-LF 结尾,同时检查 \"From:\" 和 \"Sender:\" 字段来确定发件人
-bd  以守护进程运行,sendmail 会在后台监听 25 端口,等待 SMTP 连接,这通常在 /etc/rc 中运行
-bD  与 -bd 相同,但是在前台运行
-bh  打印持久的主机状态数据库
-bH  清除过期的主机状态数据库条目
-bi  初始化别名数据库
-bm  以通常的方式投递邮件(默认)
-bp  打印队列的列表
-bP  打印队列中的条目数;只有在支持共享内存时才可用
-bs  使用 RFC 821 中描述的 SMTP 协议在标准输入和输出上进行通信,这个选项包含了与 SMTP 兼容的 -ba 选项的所有操作
-bt  进入地址测试模式,这个模式会读取地址并显示解析的步骤,用于调试配置表
-bv  只验证名称,不尝试收集或投递消息

Linux sendmail 命令的常用选项或参数说明

以下是 sendmail 命令的一些常用选项或参数的说明,按照字母顺序排序:

选项或参数说明
-F name设置发件人的全名为 name
-f address设置发件人的地址为 address
-i不将以点开头的行特殊处理
-n不使用别名
-oA file使用 file 作为别名文件
-oB bytes设置每行的最大字节数为 bytes
-oC file使用 file 作为配置文件
-odq将邮件放入队列,而不是立即投递
-oeq在出错时不发送回执
-oi不将以点开头的行特殊处理(与 -i 相同)
-om将本地邮件发送给发件人
-on不转换换行符
-op保留 BSD 行为
-oQ dir使用 dir 作为队列目录
-or name设置真实的发件人为 name
-os size设置每个消息的最大大小为 size
-ot使用旧的风格的头部
-t从消息头部读取收件人列表:TO, CC, BCC
-v使用详细模式(描述发生了什么)

Linux sendmail 命令实例详解

以下是一些 sendmail 命令的实例,结合了一些常见的搜索关键词,以帮助您更好地理解和使用这个命令。

实例1:发送一封简单的邮件

如果您只想发送一封简单的邮件,不需要任何选项或参数,只需要指定收件人的地址,然后在标准输入中输入邮件的内容,以一个单独的点结束。例如:

[linux@bashcommandnotfound.cn ~]$ sendmail user@example.com
From: john.doe@example.net
Subject: Hello
Hi, this is a test email.
.

实例2:使用 -t 选项从消息头部读取收件人列表

如果您想发送一封包含多个收件人的邮件,您可以使用 -t 选项,让 sendmail 从消息头部读取 TO, CC, BCC 等字段来确定收件人列表。您可以使用一个文件来存储邮件的内容,然后重定向到 sendmail 命令。例如,假设您有一个文件 email.txt,其内容如下:

Subject: Greeting
To: user1@example.com
Cc: user2@example.com
Bcc: user3@example.com

Hello, this is a greeting email.

那么您可以使用以下命令来发送这封邮件:

[linux@bashcommandnotfound.cn ~]$ sendmail -t < email.txt

实例3:使用 -F 和 -f 选项设置发件人的全名和地址

如果您想自定义发件人的全名和地址,您可以使用 -F 和 -f 选项,分别指定全名和地址。注意,这些选项可能会被邮件服务器覆盖,因此您应该确保您有权限使用这些选项。例如,如果您想使用 "zhang san" 作为全名,"john.doe@example.net" 作为地址,您可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ sendmail -F "John Doe" -f zhangSan@example.net user@example.com

实例4:使用 -v 选项使用详细模式

如果您想查看 sendmail 命令的执行过程,您可以使用 -v 选项,让 sendmail 以详细模式运行,显示每一步的信息。这对于调试和排除故障很有用。例如,如果您想发送一封简单的邮件,并查看详细的输出,您可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ sendmail -v user@example.com
Subject: Test
This is a test email with verbose mode
.
user@example.com... Connecting to [127.0.0.1] via relay...
220 localhost.localdomain ESMTP Sendmail 8.15.2/8.15.2; Fri, 26 Jan 2024 15:14:39 +0800
>>> EHLO localhost.localdomain
250-localhost.localdomain Hello
...
user@example.com... Sent (w0Q7EeZa012345 Message accepted for delivery)
Closing connection to [127.0.0.1]
>>> QUIT
221 2.0.0 localhost.localdomain closing connection

实例5:使用 -odq 选项将邮件放入队列

如果您不想立即投递邮件,而是想将邮件放入队列,等待后续处理,您可以使用 -odq 选项,让 sendmail 将邮件存储在队列目录中。这对于网络不稳定或邮件服务器不可用的情况很有用。例如,如果您想将一封简单的邮件放入队列,您可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ sendmail -odq user@example.com
Subject: Test
This is a test email with queue mode
.

这样,邮件就会被保存在 /var/spool/mqueue 目录中,等待下一次运行 sendmail -q 命令来处理队列中的邮件。

实例6:使用 -i 选项不将以点开头的行特殊处理

如果您想发送一封包含以点开头的行的邮件,您可以使用 -i 选项,让 sendmail 不将以点开头的行特殊处理,否则 sendmail 会认为这是邮件的结束标志。例如,如果您想发送一封包含以下内容的邮件:

Subject: Dot Test
This is a test email with dot lines.
.
This line starts with a dot.
.
This line ends with a dot.

那么您可以使用以下命令来发送这封邮件:

[linux@bashcommandnotfound.cn ~]$ sendmail -i user@example.com < dot.txt

实例7:使用 -n 选项不使用别名

如果您不想使用别名文件中定义的别名,您可以使用 -n 选项,让 sendmail 不进行别名替换。这对于测试或调试别名文件很有用。例如,如果您想发送一封简单的邮件,并不使用别名,您可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ sendmail -n user@example.com
Subject: Alias Test
This is a test email without alias.
.

实例8:使用 -oA 选项指定别名文件

如果您想使用一个自定义的别名文件,而不是默认的 /etc/mail/aliases 文件,您可以使用 -oA 选项,指定别名文件的路径。这对于使用不同的别名集合很有用。例如,如果您有一个别名文件 myaliases,其内容如下:

# myaliases file
admin: root
webmaster: user@example.com

那么您可以使用以下命令来发送一封邮件,并使用 myaliases 文件中的别名:

[linux@bashcommandnotfound.cn ~]$ sendmail -oA myaliases webmaster
Subject: Custom Alias Test
This is a test email with custom alias file.
.

这样,邮件就会被发送到 user@example.com,而不是默认的 webmaster 地址。

Linux sendmail 命令的注意事项

以下是一些使用 sendmail 命令时需要注意的事项:

  • sendmail 命令需要配置正确的 sendmail.cf 文件,才能正常工作。sendmail.cf 文件通常位于 /etc/mail 目录中,它包含了 sendmail 的各种参数和规则。您可以使用 m4 宏处理器来生成 sendmail.cf 文件,或者直接编辑 sendmail.cf 文件,但是这需要一定的专业知识。
  • sendmail 命令需要有足够的权限来读取和写入邮件文件和队列文件。通常,sendmail 命令需要以 root 用户或 mail 用户的身份运行,或者至少属于 mail 组。如果您没有相应的权限,您可能会遇到错误或拒绝的情况。
  • sendmail 命令可能会受到邮件服务器的限制或过滤,例如,邮件服务器可能会检查发件人的地址、域名、IP 地址等,以防止垃圾邮件或恶意邮件。因此,您应该确保您的邮件符合邮件服务器的要求,否则您的邮件可能会被拒绝或丢弃。
  • sendmail 命令可能会遇到网络或系统的故障,导致邮件无法投递或延迟投递。您可以使用 -v 选项来查看 sendmail 的输出,或者查看 /var/log/maillog 文件来检查邮件的状态和错误信息。如果您的邮件被放入队列,您可以使用 mailq 命令来查看队列中的邮件,或者使用 sendmail -q 命令来处理队列中的邮件。
  • 如果您在使用 sendmail 命令时遇到 bash: sendmail: command not found 的错误,那么可能是因为您没有安装 sendmail 或者 sendmail 不在您的 PATH 环境变量中。您可以根据您的 Linux 发行版,使用相应的安装命令来安装 sendmail,或者使用绝对路径来运行 sendmail,例如 /usr/sbin/sendmail。
0

评论区