Linux 命令行发送电子邮件完全指南

本文详细介绍了如何在 Linux 命令行中使用 mail、mailx、mutt、msmtp 等多种工具发送电子邮件,包括发送简单邮件、带附件邮件、通过 SMTP 认证,以及在 Bash 脚本中实现邮件自动化,帮助开发者高效管理系统通知与报告。

阅读时长: 9 分钟
共 4149字
作者: eimoon.com

引言

在 Linux 环境下,通过命令行(CLI)发送电子邮件是一项非常实用的技能,它不仅能帮助系统管理员自动化任务,如发送报告、系统警报或脚本执行结果,也能让开发者在无需图形界面的情况下便捷地进行通知。本指南将全面介绍如何在 Linux 命令行中使用各种工具发送电子邮件,涵盖从简单文本邮件到带附件邮件,以及通过 SMTP 认证发送邮件的方法,并演示如何在 Bash 脚本中实现邮件发送的自动化。

Linux 命令行邮件发送工具概览

本文将深入探讨以下用于在 Linux 命令行发送电子邮件的工具:

  1. mail
  2. mailx
  3. mutt
  4. mpack
  5. sendmail
  6. msmtp (尤其适用于 SMTP 认证)

接下来,我们将逐一详细介绍这些工具的安装与使用方法。

1. 使用 mail 命令

mail 命令是 Linux 系统中一个基础且常用的命令行邮件发送工具,它通常是 mailutils(Debian/Ubuntu)或 mailx(Red Hat/CentOS)软件包的一部分。

安装 mailutilsmailx

  • Debian/Ubuntu 系统:
    sudo apt install mailutils -y
    
    在安装过程中,系统可能会提示您配置邮件传输代理(Mail Transfer Agent, MTA),如 Postfix。您可以选择“OK”并配置为“Internet Site”以允许邮件外发。
  • CentOS/Red Hat 系统:
    sudo yum install mailx
    

测试 mail 命令:

  • 发送简单邮件(交互式):

    mail -s "测试邮件" recipient@example.com
    

    输入收件人地址后,按回车键,您可以选择是否添加抄送(Cc:)。接着输入邮件正文内容,输入完成后,同时按下 Ctrl + D 即可发送邮件。

  • 通过 echo 命令发送邮件(非交互式): 这种方式常用于脚本中,无需用户手动输入。

    echo "这是一封测试消息。" | mail -s "自动化测试邮件" recipient@example.com
    
  • 发送带附件的邮件: mail 命令可以通过 -A 标志来添加附件。

    mail -s "邮件主题 - 附带文件" -A attachment.txt recipient@example.com
    

    请注意,mail 命令对附件的支持可能不如 mutt 等专用工具稳定,尤其对于复杂文件类型。

  • 发送给多个收件人: 只需在命令后列出多个收件人地址即可。

    mail -s "多收件人测试" recipient1@example.com recipient2@example.com
    

2. 使用 mailx 命令

mailxmail 命令的一个现代化版本,通常提供相似甚至更丰富的功能,但在许多 Linux 发行版中,mail 命令实际上就是 mailx 的一个符号链接或包装。

安装 mailx

  • Debian/Ubuntu 系统:
    sudo apt install mailx
    
  • Red Hat/CentOS 系统:
    sudo yum install mailx
    

测试 mailx 命令:

  • 使用 echo 命令发送邮件: 用法与 mail 命令非常相似。
    echo "邮件正文内容。" | mailx -s "邮件主题" recipient@example.com
    

3. 使用 mutt 命令

mutt 是一款轻量级的 Linux 命令行邮件客户端,它不仅可以用于交互式地阅读和编写邮件,在处理 MIME 类型和附件方面也比 mail 命令更为可靠和强大。

安装 mutt

  • Debian/Ubuntu 系统:
    sudo apt install mutt
    
  • Red Hat/CentOS 系统:
    sudo yum install mutt
    

测试 mutt 命令:

  • 发送空邮件:

    mutt -s "测试邮件" recipient@example.com < /dev/null
    
  • 发送带附件的邮件: mutt 在处理附件时表现出色。使用 -a 标志指定附件路径,-- 分隔符用于表明选项的结束,以防止邮件地址被错误解释为命令行标志。

    echo "这是邮件正文。" | mutt -a "/path/to/your/file.to.attach" -s "主题:附带报告" -- recipient@example.com
    

4. 使用 mpack 命令

mpack 命令专门用于将文件编码为 MIME 消息,并将其发送给一个或多个收件人。它特别适合将二进制文件或非文本文件作为附件发送。

安装 mpack

  • Debian/Ubuntu 系统:
    sudo apt install mpack
    
  • Red Hat/CentOS 系统:
    sudo yum install mpack
    

测试 mpack 命令:

  • 发送带附件的邮件:
    mpack -s "这里是邮件主题" -a your_file.pdf recipient@example.com
    

5. 使用 sendmail

sendmail 是一个历史悠久且功能强大的邮件传输代理(MTA),它在许多 Linux 发行版中被广泛使用,负责邮件的路由和传递。通常,用户不会直接使用 sendmail 来发送单封邮件,而是通过 mailmutt 等前端工具来调用它。

安装 sendmail

  • Debian/Ubuntu 系统:
    sudo apt install sendmail
    
  • Red Hat/CentOS 系统:
    sudo yum install sendmail
    

测试 sendmail 命令:

  • 通过文件内容发送邮件: sendmail 可以读取标准输入或文件内容作为邮件正文。如果要在邮件中包含主题,您需要在文件的开头添加 Subject: 行。 首先创建一个邮件内容文件,例如 email_content.txt
    Subject: 这是通过 Sendmail 发送的测试邮件
    From: sender@example.com
    To: recipient@example.com
    
    邮件的正文内容将从这里开始。
    您可以添加多行文本。
    
    然后发送:
    sendmail -t < email_content.txt
    
    这里的 -t 选项表示从邮件头中解析收件人信息。

通过 SMTP 认证发送邮件 (例如 Gmail)

当您需要向外部邮箱服务(如 Gmail、Yahoo Mail)发送邮件时,通常需要进行 SMTP 认证。mail 等传统命令通常不支持直接的 SMTP 认证,这需要借助 msmtp 这样的专用客户端或配置更复杂的 MTA(如 Postfix 或 Exim)作为中继。

本例将重点介绍轻量级且易于配置的 SMTP 客户端 msmtp

  • 安装 msmtp

    • Debian/Ubuntu 系统:
      sudo apt install msmtp msmtp-mta
      
    • Red Hat/CentOS 系统:
      sudo yum install msmtp
      
  • 配置 ~/.msmtprc 文件: msmtp 通过用户主目录下的 .msmtprc 文件进行配置。请务必使用应用专用密码(Application-Specific Password),而非您的常规账户密码,以增强安全性。

    创建或编辑 ~/.msmtprc 文件,并添加以下内容(请替换为您的实际信息):

    account gmail
    host smtp.gmail.com
    port 587
    from your_gmail_address@gmail.com
    auth on
    user your_gmail_address@gmail.com
    password your_application_specific_password # 重要:使用应用专用密码
    tls on
    tls_starttls on
    tls_trust_file /etc/ssl/certs/ca-certificates.crt # 路径可能因系统而异,确保路径正确
    logfile ~/.msmtp.log
    
    account default : gmail
    
  • 设置文件权限: 由于 ~/.msmtprc 文件包含敏感的账户密码,务必将其权限设置为只有文件所有者可读写(600)。

    chmod 600 ~/.msmtprc
    
  • 使用 msmtp 发送邮件: 配置完成后,您可以直接使用 msmtp 发送邮件,或者将其与 mail 等命令结合使用(mail 会自动调用配置好的 msmtp 作为其底层发送器)。

    方式一:作为 mail 命令的底层发送器

    echo "这是一封通过 msmtp 发送的测试邮件。" | mail -s "msmtp 测试邮件" -a attachment.txt recipient@example.com -r your_gmail_address@gmail.com
    

    请注意 -r 选项指定发件人地址,这通常会覆盖 .msmtprc 中的 from 配置。

    方式二:直接使用 msmtp 命令 这种方式更直接,通常用于脚本中。

    msmtp recipient@example.com <<EOF
    From: your_gmail_address@gmail.com
    Subject: 通过 msmtp 发送的邮件
    
    这是邮件的正文内容。
    EOF
    

在 Bash 脚本中发送电子邮件

将邮件发送功能集成到 Bash 脚本中,可以实现强大的自动化通知、报告和系统健康检查。

1. 基于条件发送邮件

以下是一个示例脚本,它检查根分区 / 的磁盘使用率。如果使用率超过 90%,则发送警告邮件给管理员。

#!/bin/bash

# 获取根分区 / 的磁盘使用率百分比
# awk 'NR==2 {print $5}' 提取第二行第五列(即使用率百分比)
disk_usage=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//g') # 去除百分号

# 如果磁盘使用率超过90%则发送邮件
if [[ ${disk_usage} -gt 90 ]]; then
  echo "警告:根分区 / 的磁盘使用率已超过 90% (${disk_usage}%)!" | mail -s "磁盘空间告警" admin@example.com
fi

注意: 确保 mail 命令在系统上已正确安装并能工作(如果需要,请配置 msmtp 进行外部 SMTP 发送)。

2. 发送带附件的邮件

以下脚本创建一个简单的日志文件,并将其作为附件发送。这里推荐使用 mutt,因为它对附件的处理更为健壮。

#!/bin/bash

LOG_FILE="/tmp/mylog_$(date +%Y%m%d%H%M%S).txt"
RECIPIENT="admin@example.com"
SUBJECT="每日报告 - $(date +%Y-%m-%d)"

# 创建一个示例日志文件
echo "这是脚本执行的示例日志消息。" > "${LOG_FILE}"
echo "更多内容..." >> "${LOG_FILE}"

# 将日志文件作为附件发送
# 使用 mutt 发送附件更可靠
if command -v mutt &> /dev/null; then
    echo "请查收附件中的报告。" | mutt -s "${SUBJECT}" -a "${LOG_FILE}" -- "${RECIPIENT}"
    echo "邮件已发送,附带文件:${LOG_FILE}"
else
    echo "错误:mutt 未安装。无法发送带附件的邮件。"
    # 如果 mutt 不可用,可以尝试使用 mail(但附件支持可能有限)
    # echo "请查收附件中的报告。" | mail -s "${SUBJECT}" -A "${LOG_FILE}" "${RECIPIENT}"
fi

# 清理:可选,如果不需要保留日志文件则删除
# rm "${LOG_FILE}"

对于更复杂的文件类型或需要 MIME 类型正确识别的附件,mutt 是比 mail 更好的选择。

不同工具的易用性和兼容性比较

工具 主要用途 优点 缺点
mail / mailx 在预配置本地邮件系统(如 sendmail)上发送简单文本邮件。 • 在所有 Linux/UNIX 系统上普遍可用。
• 基本邮件语法极其简单,易于入门。
• 不支持内置 SMTP 认证(无法直接连接 Gmail 等外部服务)。
• 附件处理功能相对较弱且不可靠。
• 完全依赖本地邮件服务器(MTA)。
msmtp 通过任何需要认证的外部 SMTP 服务器(如 Gmail)安全发送邮件。 • 专为认证 SMTP 设计,支持 TLS/SSL 加密。
• 配置简单,能安全处理配置文件中的凭据。
• 自动化场景下灵活可靠。
• 需要一次性进行配置文件 (~/.msmtprc) 设置。
• 只能发送邮件,不能用于读取或管理邮箱。
mutt • 作为交互式终端客户端阅读/编写邮件。
• 用于脚本化发送带附件的邮件。
• 对 MIME 类型附件有出色、可靠的支持。
• 交互式使用高度可配置且功能强大。
• 可与 msmtp 配合实现现代 SMTP 认证发送。
• 配置可能相对复杂,尤其是用于交互式客户端。
• 自身不负责邮件的最终发送,仍需依赖其他工具(如 msmtp 或本地 MTA)。
mpack 将文件编码为 MIME 附件并创建基本邮件结构。 • 简单、轻量级,专门擅长将文件编码为邮件内容。
• 依赖本地 sendmail 或其他 MTA 来实际发送邮件。
• 无 SMTP 认证功能。
• 功能在 mutt 面前大部分冗余,因为 mutt 也能很好地处理 MIME 附件。
sendmail 作为系统范围的邮件传输代理 (MTA),路由和传递所有邮件。 • 历史悠久、功能强大且特性丰富的 MTA。
• 定义了许多当今邮件系统使用的标准。
• 不适用于普通用户发送单封邮件。
• 配置极其复杂,维护难度高。
• 大部分已被现代、更简单、更易于配置的 MTA(如 Postfix)所取代。

常见问题 (FAQs)

1. 从 Linux 终端发送电子邮件最简单的方法是什么?

最简单的方法是使用 mail 命令,它是 mailutilsmailx 包的一部分。

安装示例: sudo apt-get install mailutils (Debian/Ubuntu)

发送示例:

echo "这是邮件的正文。" | mail -s "邮件主题" recipient@example.com

2. 我可以从 Bash 脚本发送电子邮件吗?

完全可以。将邮件命令集成到 Bash Shell 脚本中可以实现自动化通知,例如脚本完成状态、Cron 作业运行结果、系统错误或特定事件警报。这在系统自动化和监控中非常有用。

3. 如何在 Linux 中发送带附件的电子邮件?

虽然基本的 mail 命令可以通过 -A 选项尝试发送附件,但其兼容性和稳定性有限。对于可靠地发送附件,mutt 是更好的选择,因为它对 MIME 类型附件有出色的支持。

安装示例: sudo apt-get install mutt (Debian/Ubuntu)

发送带附件邮件示例:

echo "请查收附件中的报告。" | mutt -s "报告已附加" -a /path/to/your/file.zip -- recipient@example.com

结论

在 Linux 命令行下发送电子邮件提供了极大的灵活性和自动化能力。选择合适的工具至关重要:

  • 对于简单的本地系统通知或脚本输出mailmailx 是快速便捷的选择,尤其当系统已配置本地 MTA 时。
  • 当需要通过外部邮箱服务(如 Gmail)发送邮件并进行 SMTP 认证时,msmtp 是一个轻量级且高效的解决方案。
  • 对于需要可靠地发送带附件的邮件,尤其是包含复杂文件类型时,mutt 结合 msmtp 是一个强大且推荐的组合。
  • mpack 专注于 MIME 编码,但其功能大部分已被 mutt 包含。
  • sendmail 作为底层的 MTA,通常不直接面向最终用户。

尽管图形用户界面(GUI)邮件客户端在日常邮件管理中不可或缺,但命令行方式在自动化通知、集成到系统管理工作流以及实现自定义警报方面具有无可比拟的优势,有助于构建健壮且高效的自动化运维体系。

关于

关注我获取更多资讯

公众号
📢 公众号
个人号
💬 个人号
使用 Hugo 构建
主题 StackJimmy 设计