使用 Bash 脚本发送邮件
通过命令行发送电子邮件可能是一个非常棒的功能,尤其是在 Linux 上,这将允许一些用户避免使用 GUI 并安装所有依赖项。我们将研究以下关于如何编写 BASH(shell)脚本的文章,该脚本可以使用 SMTP 服务器将自定义电子邮件发送到任何其他电子邮件。
创建谷歌应用
发件人的电子邮件必须是 Gmail 帐户。应在此帐户上启用 2FA。您必须在您的 Gmail id 上创建一个应用程序,该应用程序将为您处理电子邮件发送、权限和其他事情。这样做非常简单,请访问 Google 应用密码页面。
- 从上述链接使用您的凭据登录
- 创建一个 App类别-> 其他给它任何名称(你喜欢的任何名称,例如 mailterminal、bashmail)
- 现在复制密码并将其安全地存储在某个地方。
复制从应用程序生成的代码并将其保存在安全的地方,稍后我们将需要此密码,
创建 Google 应用程序后,我们终于可以进入脚本创建部分了。我们将使用 cURL 获取服务器并将电子邮件内容发布到 SMTP 服务器提供的特定路由上。
用户输入
我们将首先从输入中输入要求,这些将是发件人电子邮件、收件人电子邮件、谷歌应用程序密码、主题、正文和附件(如果有)。所以在 BASH 中接受输入非常简单 我们将使用 read 命令连同 -p 作为参数,以提示用户使用信息消息提示,以便更好地理解。
#!usr/bin/env bash
# Input for sender email
read -p "Enter your email : " sender
# Input for recipient email
read -p "Enter recipient email : " receiver
# Input for google app password
read -p "Enter your Google App password : " gapp
# Input for subject of the mail
read -p "Enter the subject of mail : " sub
在文件中输入正文文本
所以发件人电子邮件、收件人电子邮件、谷歌应用程序密码和主题都得到了处理,但我们将如何输入正文和附件。好吧,为此我们将使用 cat 命令首先输入一个文件并将该文件中的所有内容复制到一个变量中,如下所示:
# Using cat command to input multiline text to a variable (from file)
echo "Enter the body of mail : "
cat > tempfile.txt
body=$(cat tempfile.txt)
与 > 一起使用的 cat 命令可以将输入重定向到运算符之后提供的文件。您必须按 CTRL + D 保存您编写的多行内容并退出 cat 命令。最后,我们将 cat 命令的输出存储到一个变量中。我们使用 cat 命令两种方式写入文件和读取文件。因此,我们可以稍后使用 body 变量。
添加附件文件
现在是附件部分,我们需要提供位置参数作为文件名来指定附件。
# set file variable to the 1st positional parameter
file="$1"
# MIME type for multiple type of input file extensions
MIMEType=`file --mime-type "$file" | sed 's/.*: //'`
这将存储文件的名称,接下来,我们还需要文件的类型。我们使用文件中的 mime 字段提取文件扩展名或其类型。我们正在使用 set 编辑器对文件名进行管道传输,并在 file 命令的输出中过滤 ':' 之后的文本。代码演示如下图所示:
因此,文件名存储在文件变量中,文件类型存储在 MIMEType 变量中。在此之后,我们继续执行 cURL 命令。
卷曲命令
就其功能而言,CURL 命令是最有用和最流行的命令之一。我们将使用命令来获取 SMTP 服务器,即smtps://smtp.gmail.com:465。我们基本上是在特定端口打开到 Gmail 服务器的连接,然后我们将传递一些参数和变量来制作电子邮件的正文。
SMTP 服务器的 SSL 要求
我们将 URL 作为 SMTP 服务器传递,即 smtps://smtp.gmail.com:465,我们将使用 SSL 连接发送电子邮件,因为通过 google 服务器发送邮件是安全的。为此,我们将通过–ssl-reqd允许使用 google 帐户电子邮件。
添加邮件发件人、收件人和用户信息
我们将通过添加来自在我们的案例中将成为发件人的字段的邮件来开始邮件正文,因此我们将使用--mail-from 作为变量 sender 的值,即$sender 。我们在 shell 脚本中使用 \ 来忽略该行中它之后的所有内容,然后转到下一行,以提高可见性和可读性。处理完邮件发件人参数后,我们就有了邮件收件人参数,它接收收件人邮件地址。我们将使用–mail-rcpt将变量接收者的值分配为$receiver 。
# cURL command to send requests to SMTP server with arguments of given credentials
curl -s --url 'smtps://smtp.gmail.com:465' --ssl-reqd \
--mail-from $sender \
--mail-rcpt $receiver\
--user $sender:$gapp \
下一点信息是我们之前生成的应用程序的用户电子邮件和密码。我们必须将参数作为–user 传递,该参数接受两个由:分隔的值:作为电子邮件和密码,我们将简单地传递用户电子邮件,即sender 和gapp 变量。
邮件主体
此后,我们传递参数-T 来上传文件,但这里我们不上传邮件中的任何内容文件,我们将简单地手动添加它,然后用户键入格式化文件以简化用户操作。
在文件的参数中,我们将 Header 信息写入发件人、To 字段、主题,最后是邮件的内容,即正文。
# Creating the structure of mail using previously defined variables
-T <(echo -e "From: ${sender}
To: ${receiver}
Subject:${sub}
${body}")
文件附件
我们还需要传入文件附件,我们现在需要独立处理,但是如果用户没有指定任何文件,那么我们需要注意不要弄乱 curl 命令。我们可以稍微更改附件的 cURL 命令,标题部分保持不变,即直到用户输入密码。我们需要使用-F 属性来获得附件和正文的形式。我们将使用multipart 选项初始化表单,这将允许我们以简单的方式嵌入正文和文件。然后我们将指定表单中的内容,首先我们将正文包含为纯文本,然后将附件文件添加到提供的文件选项中,并根据作为变量初始化为 MIMEType 的文件类型对其进行编码。这结束了表单的一部分,我们现在可以将元数据添加到邮件中,例如收件人、表单和主题。
对于元数据,我们将简单地使用 -H 作为标题来输入变量中的 To、From 和 Subject 字段。因此,我们在邮件中添加了一个附件,邮件附件的要点如下所示:
# cURL command for attachment file with extra parameters
curl -s --url 'smtps://smtp.gmail.com:465' --ssl-reqd \
--mail-from $sender \
--mail-rcpt $receiver\
--user $sender:$gapp \
-H "Subject: $sub" -H "From: $sender" -H "To: $receiver" -F \
'=(;type=multipart/mixed' -F "=$body;type=text/plain" -F \
"file=@$file;type=$MIMEType;encoder=base64" -F '=)'
使脚本合乎逻辑
现在为了避免在没有传递附件时破坏脚本,如果没有分配值,我们需要检查位置参数,我们将不添加表单,如果存在,我们将添加表单并相应地更改流程。
要检查位置参数是否已分配,我们可以在 if 语句中使用 -z 条件。这将检查任何 NULL 或空值,如果该值为空,我们将使用简单的 cURL 命令,否则,我们将在 cURL 命令中包含一个表单。
完整的脚本如下所示:
脚本
#!usr/bin/env bash
# User input
read -p "Enter your email : " sender
read -p "Enter recipient email : " receiver
read -p "Enter your Google App password : " gapp
read -p "Enter the subject of mail : " sub
echo "Enter the body of mail : "
cat > tempfile.txt # using cat command for multiline input
body=$(cat tempfile.txt) # storing the content of file in a variable
rm tempfile.txt
# check for provided attachment file as a positional parameter
# -z indicating an empty positional parameter
# attachment doesn't exist condition
if [ -z "$1" ]; then
# curl command for accessing the smtp server
curl -s --url 'smtps://smtp.gmail.com:465' --ssl-reqd \
--mail-from $sender \
--mail-rcpt $receiver\
--user $sender:$gapp \
-T <(echo -e "From: ${sender}
To: ${receiver}
Subject:${sub}
${body}")
# attachment exists condition
else
file="$1" # set file as the 1st positional parameter
# MIME type for multiple type of input file extensions
MIMEType=`file --mime-type "$file" | sed 's/.*: //'`
curl -s --url 'smtps://smtp.gmail.com:465' --ssl-reqd \
--mail-from $sender \
--mail-rcpt $receiver\
--user $sender:$gapp \
-H "Subject: $sub" -H "From: $sender" -H "To: $receiver" -F \
'=(;type=multipart/mixed' -F "=$body;type=text/plain" -F \
"file=@$file;type=$MIMEType;encoder=base64" -F '=)'
fi
在此脚本中,您只能附加一个文件,并且邮件只能发送给一个收件人。您也可以通过添加多个收件人来扩展功能。我们能够使用 cURL、sed、BASH 编程语言和 SMTP 服务器等工具从 Gmail 帐户的终端发送电子邮件。