从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设置 为 on为msmtp启用 TLS, 使用tls_trust_file指定证书的路径 。 此外,我们使用字段 logfile指定 msmtp日志文件的路径。
最后,我们将使用 chmod 将该文件的权限设置为 600 :
$ chmod 600 ~/.msmtprc
3.3. 添加 SMTP 服务器帐户
在我们发送电子邮件之前,我们需要在 .msmtprc 配置文件。这些帐户是我们将用来发送电子邮件的公共 SMTP 服务。在本文中,我们将展示 Outlook SMTP 服务的配置示例。相同的配置也适用于其他 SMTP 服务。
对于此演示,假设我们已经使用以下凭据在 Outlook.com 上注册了自己的电子邮件帐户:
- 电子邮件地址: blogdemo@itcodingman.com
- 密码:blogdemo-linux
让我们通过向*.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 命令。然后,我们指定我们将 使用标志 -a与Outlook帐户一起发送。这是我们在 .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支持。