mailx 实现邮件收发
本文介绍了在Linux系统中使用mailx命令行工具实现邮件发送和接收的完整流程。主要内容包括:1) 安装mailx或s-nail客户端;2) 配置外部SMTP服务(以QQ邮箱为例),设置发件人、SMTP服务器和授权信息;3) 实战邮件发送功能,涵盖文本邮件、多行内容、附件、HTML格式以及抄送/密送;4) 查看本地用户邮件的方法,包括交互模式和直接读取邮件文件;5) 通过本地MTA(postfi
mailx 是 Linux 下常用的命令行邮件客户端,支持发送邮件(通过 SMTP)和读取本地接收的邮件(存储在系统邮件目录)。以下是基于 mailx 实现邮件发送和接收的完整实战流程,涵盖 外部 SMTP 发送(如 QQ 邮箱、企业邮箱) 和 本地邮件接收 场景
1. 安装 mailx 或者 s-nail
不同 Linux 发行版的 mailx 包名略有差异,先确保已安装:
-
CentOS/RHEL:
sudo dnf install -y mailx sudo dnf install -y s-nail -
Ubuntu/Debian:
通常安装bsd-mailx或heirloom-mailx(功能更全):sudo apt install -y bsd-mailx # 或功能更全的版本: sudo apt install -y heirloom-mailx
验证安装:
mailx --version # 输出版本信息即安装成功
2. 配置外部 SMTP 发送邮件(QQ邮箱为例)
mailx 本身不直接提供邮件传输功能,发送邮件需依赖 SMTP 服务器(如 QQ 邮箱、163 邮箱、企业邮箱的 SMTP 服务)。以下以 QQ 邮箱 为例配置(其他邮箱步骤类似)。
a. 准备邮箱 SMTP 信息
需先在邮箱中开启 SMTP 服务并获取认证密码:
- QQ 邮箱:
- 登录 QQ 邮箱 → 设置 → 账号与安全 → 开启“POP3/IMAP/SMTP/Exchange/CardDAV 服务”。
- 生成“授权码”(非登录密码,用于第三方客户端认证),记录授权码。

- SMTP 服务器信息:
- 服务器地址:
smtp.qq.com - 端口:
465(SSL 加密,推荐)或587(TLS 加密)
- 服务器地址:
b. 配置 mailx
通过配置文件保存 SMTP 信息,避免每次发送邮件手动输入。
- 全局配置(所有用户生效):编辑
/etc/mail.rc - 用户级配置(仅当前用户生效):编辑
~/.mailrc(没有则创建)
示例(以 QQ 邮箱为例,替换为你的信息):
# 编辑配置文件(以用户级为例)
vim ~/.mailrc
# 添加以下内容(mailx 的配置)
set from="你的QQ邮箱@qq.com" # 发件人邮箱(必须与SMTP认证邮箱一致)
set smtp="smtps://smtp.qq.com:465" # SMTP服务器地址(smtps表示SSL加密)
set smtp-auth-user="你的QQ邮箱@qq.com" # SMTP认证用户名(即发件人邮箱)
set smtp-auth-password="你的授权码" # 邮箱授权码(非登录密码)
set smtp-auth=login # 认证方式(固定为login)
set ssl-verify=ignore # 忽略SSL证书验证(避免本地证书问题导致失败)
# 添加以下内容(s-nail的配置)
set smtp-auth=login
set smtp-use-starttls
set v15-compat
set from=你的QQ邮箱
set mta=smtps://QQ号%40qq.com:邮箱授权码@smtp.qq.com:465
保存退出,配置立即生效。
3. 用 mailx 发送邮件(实战示例)
配置完成后,可通过 mailx 发送各种类型的邮件(文本、附件、HTML 等)。
a. 发送简单文本邮件
格式:echo "邮件内容" | mailx -s "邮件主题" 收件人邮箱
示例:给 test@example.com 发送文本邮件:
echo "这是 mailx 发送的测试邮件内容" | mailx -s "mailx 测试邮件" test@example.com
b. 发送带多行内容的邮件
通过文件读取内容(适合长邮件):
# 1. 创建邮件内容文件
cat > mail_content.txt << EOF
标题:测试邮件
这是第一行内容
这是第二行内容
--
此致
测试人
EOF
# 2. 发送文件内容作为邮件正文
mailx -s "带多行内容的邮件" test@example.com < mail_content.txt
c. 发送带附件的邮件
用 -a 参数指定附件(可多个):
# 发送文件 report.pdf 作为附件,正文为"请查收报告"
echo "请查收今日报告" | mailx -s "每日报告" -a report.pdf test@example.com
- 注意:如果附件名含空格,需用引号包裹(如
-a "my report.pdf")。
d. 发送 HTML 格式邮件
通过 -a "Content-Type: text/html" 指定内容类型为 HTML:
echo "<h1>这是 HTML 邮件</h1><p>邮件内容支持 <b>加粗</b> 和 <i>斜体</i></p>" | mailx -s "HTML 测试邮件" -a "Content-Type: text/html" test@example.com
e. 抄送(CC)和密送(BCC)邮件
- 抄送(CC):
-c 抄送邮箱 - 密送(BCC):
-b 密送邮箱
示例:同时抄送和密送:
echo "这是一封抄送和密送测试邮件" | mailx -s "抄送测试" -c cc@example.com -b bcc@example.com recipient@example.com
4. 用 mailx 接收邮件(查看本地邮件)
mailx 接收的邮件通常存储在 系统邮件目录(本地用户邮件)或通过配置 POP3/IMAP 读取远程邮件(较少用,mailx 更擅长发送)。
a. 查看本地用户邮件
Linux 系统默认会将发送给本地用户的邮件存储在 /var/spool/mail/用户名 或 ~/Maildir 目录(取决于 MTA 配置,如 Postfix)
-
查看当前用户的邮件:直接输入
mailx进入交互模式:mailx # 进入邮件列表交互模式常用命令:
h:显示邮件列表(序号、发件人、日期、主题)数字:查看指定序号的邮件(如1查看第1封)d 数字:删除指定邮件(如d 1删除第1封)s 数字 文件名:保存邮件内容到文件(如s 1 mail1.txt)q:退出并保存更改(删除的邮件会被移动到垃圾箱)
b. 读取指定用户的邮件(需权限)
如果是 root 用户,可查看其他用户的邮件:
sudo mailx -u 用户名 # 如 sudo mailx -u testuser 查看 testuser 的邮件
c. 配置 POP3/IMAP 接收远程邮件(可选)
mailx 也支持通过 POP3/IMAP 从远程邮箱(如 QQ 邮箱)读取邮件,需在 ~/.mailrc 中添加配置:
# 接收 QQ 邮箱邮件(POP3 示例)
set pop3="pop.qq.com:995" # POP3 服务器(995 为 SSL 端口)
set pop3-auth-user="你的QQ邮箱@qq.com"
set pop3-auth-password="你的授权码"
set pop3-auth=login
然后通过 mailx -f pop3://pop.qq.com 读取远程邮件(实际用得较少,更推荐专用客户端如 mutt 或图形工具)。
5. 发送邮件给当前系统的其他用户
在 Linux 系统中,mailx(或 s-nail)发送邮件给本地系统用户(即服务器上已创建的用户,如 user1、test 等)非常简单,无需配置外部 SMTP 服务器,直接通过本地邮件传输代理(MTA,如 postfix)即可完成,邮件会存储在本地用户的邮件目录中。
a. 核心原理
本地用户的邮件由系统内置的 MTA(默认是 postfix)处理,发送后会保存在目标用户的专属邮件存储目录:/var/spool/mail/用户名(如 user1 的邮件存在 /var/spool/mail/user1)。接收方无需联网,直接通过 mailx 即可查看。
b. 确保本地 MTA 运行
# 检查 postfix 状态
systemctl status postfix
# 若未运行,启动并设置开机自启
systemctl start postfix
systemctl enable postfix
c. 用 mailx 发送邮件给本地用户
发送本地邮件的命令非常简单,无需配置外部 SMTP,直接指定目标用户名即可。
(1)交互式发送(手动输入内容)
mailx user1 # 发送给本地用户 user1
执行后进入交互模式:
- 首先输入 邮件主题(按回车确认)
- 然后输入 邮件内容(多行内容直接输入,空行也可)
- 输入完成后,按
Ctrl+D结束输入并发送
(2)非交互式发送(适合脚本)
通过管道 | 或输入重定向 < 发送,无需手动输入内容:
-
用
echo发送单行内容:echo "这是发给 user1 的本地测试邮件" | mailx -s "本地邮件主题" user1 -
用文件内容作为邮件正文:
# 先创建内容文件 cat > mail_content.txt << EOF 这是多行内容: 1. 第一行 2. 第二行 EOF # 发送文件内容给 user1 mailx -s "带多行内容的本地邮件" user1 < mail_content.txt
d. 目标用户接收邮件
目标用户(如 user1)登录系统后,有两种方式查看邮件:
(1)用 mailx 交互式查看
# 切换到目标用户(如 user1)
su - user1
# 直接执行 mailx 进入邮件列表
mailx
交互模式操作:
- 输入邮件序号(如
1)查看对应邮件 - 输入
d 序号(如d 1)删除邮件 - 输入
q退出并保存状态
(2)直接查看邮件存储文件
本地用户的邮件本质是文本文件,存储在 /var/spool/mail/用户名,可直接用 cat 或文本编辑器查看:
su - user1 # 切换到目标用户
cat /var/spool/mail/user1 # 查看所有邮件内容
e. 常见问题排查
-
邮件发送后目标用户看不到:
- 检查
postfix是否运行(systemctl status postfix); - 查看邮件日志
/var/log/maillog,搜索目标用户名(如user1),确认是否有投递失败信息(如权限问题)。
- 检查
-
提示“can’t send mail: no mail transport agent”:
- 未安装
postfix,需先安装:sudo dnf install -y postfix,然后启动服务。
- 未安装
-
目标用户邮件文件权限错误:
- 邮件文件
/var/spool/mail/user1需属于目标用户,权限应为600,若错误可修复:sudo chown user1:mail /var/spool/mail/user1 sudo chmod 600 /var/spool/mail/user1
- 邮件文件
6. 常见问题排查
-
发送失败:SMTP 认证错误
- 检查
~/.mailrc中的smtp-auth-password是否为邮箱授权码(非登录密码)。 - 确认 SMTP 服务器地址和端口正确(如 QQ 邮箱
smtps://smtp.qq.com:465)。
- 检查
-
发送失败:连接超时
- 检查防火墙是否放行 SMTP 端口(465/587):
sudo firewall-cmd --add-port=465/tcp --permanent sudo firewall-cmd --reload - 确认服务器能访问 SMTP 服务器(
ping smtp.qq.com或telnet smtp.qq.com 465)。
- 检查防火墙是否放行 SMTP 端口(465/587):
-
邮件发送成功但收件人未收到
- 查看垃圾邮件文件夹(可能被识别为垃圾邮件)。
- 检查发件人邮箱是否被收件人服务器拉黑。
-
本地邮件无法查看
- 确认本地 MTA(如 Postfix)已运行(
systemctl status postfix) - 邮件文件权限是否正确(
/var/spool/mail/用户名应属于对应用户)
- 确认本地 MTA(如 Postfix)已运行(
更多推荐

所有评论(0)