Contents

从Linux终端发送电子邮件

1. 概述

在本教程中,我们将研究在 Linux 中从终端发送电子邮件的方法。我们将从高级概述的电子邮件系统开始。然后,我们将学习如何通过将电子邮件中继到公共 SMTP 服务器来从终端发送电子邮件。最后,我们将了解电子邮件客户端如何允许我们发送带有附件的电子邮件。

2. 电子邮件系统的架构

在我们开始之前,必须很好地掌握电子邮件系统的架构。特别是,我们将尝试了解哪些组件协同工作以促进通过 Internet 发送电子邮件。

典型的电子邮件系统由以下组件组成:邮件用户代理 (MUA)、邮件传递代理 (MDA) 和邮件传输代理 (MTA)。

2.1.邮件用户代理 (MUA)

MUA 通常被称为电子邮件客户端。它是电子邮件系统中面向用户的部分。通常,当我们撰写或阅读电子邮件时,我们正在与 MUA 进行交互。一些常见的 MUA 包括 Linux 中的 Outlook、Gmail 和 mutt。

2.2. 邮件递送代理 (MDA)

MDA 是负责接受来自 MTA 的电子邮件并将其保存在收件人邮箱中的组件。它使用 IMAP 或 POP3 与 MUA 对话。

2.3. 邮件传输代理 (MTA)

 MTA 是使用电子邮件上的标头进行电子邮件转发和路由的组件。它也被称为 SMTP 服务器,因为它与 SMTP 中的其他组件进行通信。它在电子邮件系统中的作用包括(但不限于):

  • 接受来自其他 MTA 的电子邮件
  • 将电子邮件转发到适当的 MTA 以进行进一步路由
  • 将电子邮件传递给 MDA

3. msmtp

msmtp  是一个简单的 SMTP 客户端,它允许我们将正文作为电子邮件转发到其他 SMTP 服务器。在本教程中,我们将使用 Outlook 的 MTA 和msmtp从终端发送电子邮件,而不是设置我们自己的 MTA 服务器

3.1. 安装 msmtp

让我们  使用 包管理器  工具安装msmtp

$ apt-get install msmtp

3.2. 配置 msmtp

要配置 msmtp ,让我们 在当前用户主目录中创建一个文件 .msmtprc

$ cat - <<EOF > ~/.msmtprc
# Default settings
defaults
auth    on
tls    on
tls_trust_file    /etc/ssl/certs/ca-certificates.crt
logfile ~/.msmtp.log
EOF

该命令在当前用户主目录中创建一个 .msmtprc文件 ,其中包含一些用作全局设置的默认设置。

首先,  defaults 指令指示后面的配置行应该应用于 .msmtprc中的其他帐户。通过设置 auth 字段,我们启用了与 SMTP 服务器的身份验证。

然后,我们通过将 tls设置 为 onmsmtp启用 TLS, 使用tls_trust_file指定证书的路径 。 此外,我们使用字段 logfile指定 msmtp日志文件的路径。

最后,我们将使用 chmod 将该文件的权限设置为 600 :

$ chmod 600 ~/.msmtprc

3.3. 添加 SMTP 服务器帐户

在我们发送电子邮件之前,我们需要在 .msmtprc 配置文件。这些帐户是我们将用来发送电子邮件的公共 SMTP 服务。在本文中,我们将展示 Outlook SMTP 服务的配置示例。相同的配置也适用于其他 SMTP 服务。

对于此演示,假设我们已经使用以下凭据在 Outlook.com 上注册了自己的电子邮件帐户:

让我们通过向*.msmtprc*添加更多配置行来配置 Outlook SMTP 服务。最后,我们的 .msmtprc 文件应如下所示:

$ cat ~/.msmtprc
# Default settings
defaults
auth    on
tls    on
tls_trust_file    /etc/ssl/certs/ca-certificates.crt
logfile ~/.msmtsp.log
# outlook
account    outlook
host       smtp.office.365.com
port       587
from       blogdemo@itcodingman.com
user       blogdemo@itcodingman.com
password   blogdemo-linux
default outlook

首先,该 *account * 指定名称以标识特定的 SMTP 服务器配置。然后,我们将指定 SMTP 服务器的 host 和 port 。任何公共 SMTP 服务的主机和端口都可以通过在线快速搜索轻松获得。

此外,我们将凭据放在字段 user 和 password中。 字段 user 和 from 具有相同的值,它应该是我们在特定电子邮件服务提供商处注册的电子邮件地址

最后,我们还指定了一个 default 帐户,每当我们使用 msmtp发送电子邮件时都会使用该帐户。

有时 Outlook 会向我们发送一封验证电子邮件,要求帐户所有者先进行验证,然后该帐户才能发送任何电子邮件。我们可以按照 Outlook.com 发送到我们邮箱的说明来验证我们的帐户。

3.4. 从 Linux 终端发送一封简单的电子邮件

现在让我们尝试使用msmtp发送电子邮件 :

$ echo -e "\nSending regards from Terminal." | msmtp -a outlook recipient@mail.com

在上面的命令中,我们将电子邮件正文的输出通过管道传送到 msmtp 命令。然后,我们指定我们将  使用标志 -aOutlook帐户一起发送。这是我们在 .msmtprc配置文件。最后,收件人的电子邮件地址被指定为最后一个参数。

我们还在电子邮件正文之前添加了一个换行符“\n”,以将电子邮件正文与其标题分开。 如果没有该换行符,电子邮件正文将不会显示在收件人电子邮件客户端中。

一旦我们按回车,电子邮件将由  Outlook SMTP 服务器发送到recipient@mail.com

3.5. 向电子邮件添加主题

要为我们的电子邮件添加主题,我们可以指定电子邮件主题:

$ echo -e "Subject: Regards\n\Sending regards from Terminal." | msmtp -a outlook recipient@mail.com

在命令中,我们手动将电子邮件的主题标头添加为Subject: Regards。然后, 我们在其后添加两个换行符,将主题标头与电子邮件正文分开

3.6. 发送 HTML 邮件

要发送 HTML 邮件,我们需要创建一个sample.html文件并包含将输入解释为 HTML 文件的标题。 让我们使用Nano 编辑器创建sample.html文件:

$ nano sample.html

然后我们可以添加这个内容:

From: sender@mail.com
To: recipient@mail.com
Subject: This is the Subject
Mime-Version: 1.0
Content-Type: text/html
<html>
  <head>This is Email Head</head>
  <body>
    <h2>This is the Main Title</h2>
    <p>This is the body text</p> 
  </body>
</html>

让我们将此sample.html文件作为 HTML 邮件发送:

$ cat sample.html | msmtp recipient@mail.com

在这里,cat 命令输出sample.html文件的内容,然后我们将结果通过管道传送到msmtp命令。

我们使用Content-Type作为MIME 标头,以便将文件作为 HTML 文件处理。需要注意的是,我们需要在 HTML 文件中指定邮件头信息,才能用msmtp 处理。

4. mutt

在上一节中,我们已经了解了如何使用 msmtp从 Linux 终端发送电子邮件。虽然它适用于简单的电子邮件,但我们可以使用 MUA 做更多事情。例如, 单独使用 msmtp,我们无法将附件与电子邮件一起发送

下面我们来看看 mutt  命令,这是 Linux 中可以作为命令行工具使用的 MUA。

4.1. 安装 mutt

要安装 mutt,只需运行以下命令:

$ apt-get install mutt

4.2. 配置 mutt

接下来,我们将配置 mutt 以使用之前配置的msmtp发送电子邮件 。要在当前用户主目录中创建配置文件 .muttrc  ,我们将运行以下命令:

$ cat <<EOF > ~/.muttrc
set sendmail="/usr/bin/msmtp"
set use_from=yes
set blogdemo@itcodingman.com

首先,使用 set sendmail=/usr/bin/msmtp行,  mutt将使用 msmtp 命令发送电子邮件。接下来,我们还将 use_from设置为 true,并将 from 变量设置为我们的电子邮件地址。 此值必须与我们在 msmtp中配置的电子邮件地址相同。如果电子邮件不同,服务器将拒绝该电子邮件的传递。

4.3. 发送带附件的电子邮件

让我们创建一个虚拟附件文件 log.txt 来演示在电子邮件中发送附件的过程:

$ echo "Some log event" > log.txt

要将 log.txt 作为附件发送,我们可以运行 mutt 命令,如下所示:

$ echo "This is the email body" | mutt -a "./log.txt" -s "Email Subject" -- recipient@mail.com

首先,标志 -a 指定附件的路径。 然后,我们使用标志 -s将电子邮件的主题指定为 Email Subject。最后,我们将收件人的电子邮件地址作为最后一个参数传递。

请注意,双破折号“–-”必须在收件人的电子邮件地址之前,以防止该值被*-a*标志使用。

4.4. 发送 HTML 邮件

让我们创建一个虚拟 HTML 文件sample.html来演示发送 HTML 邮件的过程:

$ nano sample.html

然后,我们可以粘贴以下内容:

<html>
  <head>This is Email Head</head>
    <body>
      <h2>This is the Main Title</h2>
      <p>This is the body text</p>
    </body>
</html>

现在让我们使用这个sample.html文件发送一封 HTML 邮件:

$ mutt -e "set Content-Type: text/html" recipient@mail.com -s "Email Subject" < sample.html

我们使用Content-Type作为 MIME 标头来指示mutt将输入文件作为 HTML 文档处理。

我们需要确保我们安装了 mutt 版本 1.5.x 或更高版本,因为在以前的版本中不提供Content-Type支持。