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-mailxheirloom-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 邮箱
    1. 登录 QQ 邮箱 → 设置 → 账号与安全 → 开启“POP3/IMAP/SMTP/Exchange/CardDAV 服务”。
    2. 生成“授权码”(非登录密码,用于第三方客户端认证),记录授权码。
      在这里插入图片描述
  • 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. 常见问题排查

  1. 邮件发送后目标用户看不到

    • 检查 postfix 是否运行(systemctl status postfix);
    • 查看邮件日志 /var/log/maillog,搜索目标用户名(如 user1),确认是否有投递失败信息(如权限问题)。
  2. 提示“can’t send mail: no mail transport agent”

    • 未安装 postfix,需先安装:sudo dnf install -y postfix,然后启动服务。
  3. 目标用户邮件文件权限错误

    • 邮件文件 /var/spool/mail/user1 需属于目标用户,权限应为 600,若错误可修复:
      sudo chown user1:mail /var/spool/mail/user1
      sudo chmod 600 /var/spool/mail/user1
      

6. 常见问题排查

  1. 发送失败:SMTP 认证错误

    • 检查 ~/.mailrc 中的 smtp-auth-password 是否为邮箱授权码(非登录密码)。
    • 确认 SMTP 服务器地址和端口正确(如 QQ 邮箱 smtps://smtp.qq.com:465)。
  2. 发送失败:连接超时

    • 检查防火墙是否放行 SMTP 端口(465/587):
      sudo firewall-cmd --add-port=465/tcp --permanent
      sudo firewall-cmd --reload
      
    • 确认服务器能访问 SMTP 服务器(ping smtp.qq.comtelnet smtp.qq.com 465)。
  3. 邮件发送成功但收件人未收到

    • 查看垃圾邮件文件夹(可能被识别为垃圾邮件)。
    • 检查发件人邮箱是否被收件人服务器拉黑。
  4. 本地邮件无法查看

    • 确认本地 MTA(如 Postfix)已运行(systemctl status postfix
    • 邮件文件权限是否正确(/var/spool/mail/用户名 应属于对应用户)
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐