使用 shell 脚本发送 HTML 邮件
- 2024-11-01 08:41:00
- admin 原创
- 37
问题描述:
如何使用 shell 脚本发送 HTML 电子邮件?
解决方案 1:
首先,您需要撰写邮件。邮件至少由以下两个标题组成:
MIME-Version: 1.0
Content-Type: text/html
...以及相应的消息正文:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><title></title>
</head>
<body>
<p>Hello, world!</p>
</body>
</html>
一旦获得它,您就可以将适当的信息传递给邮件命令:
body = '...'
echo $body | mail \n-a "From: me@example.com" \n-a "MIME-Version: 1.0" \n-a "Content-Type: text/html" \n-s "This is the subject" \nyou@example.com
这是一个过于简单的例子,因为您还需要注意字符集、编码、最大行长度......但这基本上就是这个想法。
或者,您可以用 Perl 或 PHP 而不是普通 shell 编写脚本。
更新
Shell 脚本基本上是一个带有 Unix 行结尾的文本文件,以名为shebang 的行开头,该行告诉 shell 必须将文件传递给哪个解释器,并按照解释器理解的语言中的一些命令进行操作,并具有执行权限(在 Unix 中,这是文件属性)。例如,假设您将以下内容保存为hello-world
:
#!/bin/sh
echo Hello, world!
然后分配执行权限:
chmod +x hello-world
最后你就可以运行它了:
./hello-world
无论如何,这与原始问题无关。在执行高级任务之前,您应该熟悉基本的 shell 脚本。以下是一些有关bash(一种流行的 shell)的链接:
http://www.gnu.org/software/bash/manual/html_node/index.html
http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html
解决方案 2:
标签包括“sendmail”,因此这里有一个使用它的解决方案:
(
echo "From: me@xyz.com "
echo "To: them@xyz.com "
echo "MIME-Version: 1.0"
echo "Content-Type: multipart/alternative; "
echo ' boundary="some.unique.value.ABC123/server.xyz.com"'
echo "Subject: Test HTML e-mail."
echo ""
echo "This is a MIME-encapsulated message"
echo ""
echo "--some.unique.value.ABC123/server.xyz.com"
echo "Content-Type: text/html"
echo ""
echo "<html>
<head>
<title>HTML E-mail</title>
</head>
<body>
<a href='http://www.google.com'>Click Here</a>
</body>
</html>"
echo "------some.unique.value.ABC123/server.xyz.com--"
) | sendmail -t
sendmail 的包装器可以使这项工作更容易,例如mutt:
mutt -e 'set content_type="text/html"' me@mydomain.com -s "subject" < message.html
解决方案 3:
目前我发现在cmd linux中有两种快捷方法
使用旧学校邮件
`mail -s "$(echo -e "This is Subject
Content-Type: text/html")" test@yahoo.com < mytest.html`
使用 mutt
mutt -e "my_hdr Content-Type: text/html" test@yahoo.com -s "subject" < mytest.html
解决方案 4:
另一个选择是使用 msmtp。
您需要使用类似这样的方式设置您的 .msmtprc(例如使用 gmail):
account default
host smtp.gmail.com
port 587
from example@gmail.com
tls on
tls_starttls on
tls_trust_file ~/.certs/equifax.pem
auth on
user example@gmail.com
password <password>
logfile ~/.msmtp.log
然后只需调用:
(echo "Subject: <subject>"; echo; echo "<message>") | msmtp <email@domain.tld>
在你的脚本中
更新:对于 HTML 邮件,您还必须添加标题,因此您可能需要创建如下文件:
From: sender@domain.tld
To: email@domain.tld
Subject: Important message
Mime-Version: 1.0
Content-Type: text/html
<h1>Mail body will be here</h1>
The mail body <b>should</b> start after one blank line from the header.
然后邮寄
cat email-template | msmtp email@domain.tld
也可以通过命令行完成相同的操作,但使用文件可能会更容易。
解决方案 5:
另一个选项是 sendEmail 脚本http://caspian.dotconf.net/menu/Software/SendEmail/,它也允许您将消息类型设置为 html 并将文件包含为消息正文。有关详细信息,请参阅链接。
解决方案 6:
使用 CentOS 7 的默认 mailx(显示为 heirloom-mailx),我将其简化为仅使用带有所需标题的文本文件以及用于 multipart/mixed 和 multipart/alternative 设置的静态边界。
我确信如果您愿意,可以使用相同的设置找出 multipart/related 。
测试.txt:
--000000000000f3b2150570186a0e
Content-Type: multipart/alternative; boundary="000000000000f3b2130570186a0c"
--000000000000f3b2130570186a0c
Content-Type: text/plain; charset="UTF-8"
This is my plain text stuff here, in case the email client does not support HTML or is blocking it purposely
My Link Here <http://www.example.com>
--000000000000f3b2130570186a0c
Content-Type: text/html; charset="UTF-8"
<div dir="ltr">
<div>This is my HTML version of the email</div>
<div><br></div>
<div><a href="http://www.example.com">My Link Here</a><br></div>
</div>
--000000000000f3b2130570186a0c--
--000000000000f3b2150570186a0e
Content-Type: text/csv; charset="US-ASCII"; name="test.csv"
Content-Disposition: attachment; filename="test.csv"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_jj5qmzqz0
边界定义了多部分片段。
末尾没有虚线的边界 ID 是线段的起点。
末尾带有两个破折号的是终点。
在此示例中,multipart/mixed 主部分内有一个子部分,用于 multipart/alternative。
multipart/alternative 方法基本上是说“如果优先部分不成功,则返回此方法” - 在此示例中,电子邮件客户端通常将 HTML 视为优先。如果电子邮件客户端不显示 HTML,则返回纯文本。
封装整个消息的 multipart/mixed 方法基本上是说这里有不同的内容,同时显示两者。
在此示例中,我在电子邮件中放置了一个 CSV 文件附件。您将在下面的命令中看到使用 base64 插入附件。
我以附件为例,您必须为附件适当设置内容类型并指定是否内联。
X-Attachment-Id 对于某些提供商来说是必需的,请随机化您设置的 ID。
邮寄此邮件的命令是:
echo -e "`cat test.txt; openssl base64 -e < test.csv`
--000000000000f3b2150570186a0e--
" | mailx -s "Test 2 $( echo -e "
Content-Type: multipart/mixed; boundary=\"000000000000f3b2150570186a0e\"" )" -r fromaddress@example.com toaddress@example.com
正如您在 mailx 主题行中看到的,我静态插入了多部分边界,这是电子邮件客户端将看到的第一个标题。
接下来是 test.txt 内容被转储。
关于附件,我使用 openssl(这在系统上非常标准)将文件附件转换为 base64。
另外,我在这个回声的末尾添加了边界关闭语句,以表示消息的结束。
这解决了 heirloom-mailx 问题并且实际上不需要脚本。
回声可以是一种反馈,或者任何其他方法。
解决方案 7:
cat > mail.txt <<EOL
To: <email>
Subject: <subject>
Content-Type: text/html
<html>
$(cat <report-table-*.html>)
This report in <a href="<url>">SVN</a>
</html>
EOL
进而:
sendmail -t < mail.txt
解决方案 8:
Mime 标头和发件人、收件人地址也可以包含在 html 文件本身中。
命令
cat cpu_alert.html | /usr/lib/sendmail -t
cpu_alert.html 文件示例。
From: donotreply@example.com
To: admin@example.com
Subject: CPU utilization heigh
Mime-Version: 1.0
Content-Type: text/html
<h1>Mail body will be here</h1>
The mail body should start after one blank line from the header.
示例代码可在此处获取:http: //sugunan.net/git/slides/shell/cpu.php
解决方案 9:
这是我的(假设“邮件”配置正确):
scanuser@owncloud:~$ vi sendMailAboutNewDocuments.sh
mail -s "You have new mail" -a "Content-type: text/html" -a "From: sender@xxx.com" $1 << EOF
<html>
<body>
Neues Dokument: $2<br>
<a href="https://xxx/index.php/apps/files/?dir=/Post">Hier anschauen</a>
</body>
</html>
EOF
使可执行:
chmod +x sendMailAboutNewDocuments.sh
然后调用:
./sendMailAboutNewDocuments.sh recipient@xxx.com test.doc
解决方案 10:
您可以在 sendEmail 中使用选项 -o 来发送 html 电子邮件。
-o message-content-type=html 指定电子邮件的内容类型。
-o message-file 将 html 文件添加到电子邮件内容。
我已经在 shell 脚本中尝试了这个选项,并且它可以工作。
以下是完整命令:
/usr/local/bin/sendEmail -f sender@test.com -t "reciever@test.com" -s \n smtp.test.com -u "Title" -xu sender@test.com -xp password \n -o message-charset=UTF-8 \n -o message-content-type=html \n -o message-file=test.html
解决方案 11:
我一直在尝试编写一个简单的 bash 脚本,通过电子邮件发送 html 格式的内容类型,所有这些都很棒,但我不想在文件系统上创建本地文件传递到脚本中,并且在我们的 mailx 版本(12.5+)上,邮件的 -a 参数不再起作用,因为它添加了一个附件,我找不到任何替代参数来添加额外的标题,所以对我来说最简单的方法是使用 sendmail。
下面是我编写的最简单的 1 行代码,可以在我们的 bash 脚本中运行。它基本上只是传递了 Content-Type:text/html、主题和正文,然后就可以正常工作了。
printf "Content-Type: text/html
Subject: Test Email
HTML BODY<b>test bold</b>" | sendmail <Email Address To>
如果您想从变量创建整个 html 页面,我在 bash 脚本中使用的另一种方法是按如下所示传递变量。
emailBody="From: <Email Address From>
Subject: Test
Content-Type: text/html; charset=\"us-ascii\"
<html>
<body>
body
<b> test bold</b>
</body>
</html>
"
echo "$emailBody" | sendmail <Email Address To>
解决方案 12:
这个问题专门在 上提出shell script
,问题标签中只提到了sendmail
软件包。因此,如果有人正在寻找这个,这里有一个在 CentOS 8 上为我工作的带有 sendmail 用法的简单脚本:
#!/bin/sh
TOEMAIL="youremail@server.com"
REPORT_FILE_HTML="$REPORT_FILE.html"
echo "Subject: EMAIL SUBJECT" >> "${REPORT_FILE_HTML}"
echo "MIME-Version: 1.0" >> "${REPORT_FILE_HTML}"
echo "Content-Type: text/html" >> "${REPORT_FILE_HTML}"
echo "<html>" >> "${REPORT_FILE_HTML}"
echo "<head>" >> "${REPORT_FILE_HTML}"
echo "<title>Best practice to include title to view online email</title>" >> "${REPORT_FILE_HTML}"
echo "</head>" >> "${REPORT_FILE_HTML}"
echo "<body>" >> "${REPORT_FILE_HTML}"
echo "<p>Hello there, you can put email html body here</p>" >> "${REPORT_FILE_HTML}"
echo "</body>" >> "${REPORT_FILE_HTML}"
echo "</html>" >> "${REPORT_FILE_HTML}"
sendmail $TOEMAIL < $REPORT_FILE_HTML
解决方案 13:
除了可以用mdma来正确回答之外,还可以使用mail命令,如下:
mail person@email.com -s"Subject Here" -a"Content-Type: text/html; charset=\"us-ascii\""
您将获得想要的内容。不要忘记在电子邮件中输入<HTML>
和。下面是我用来通过电子邮件发送 HTML 每日报告的快速脚本:</HTML>
#!/bin/sh
(cat /path/to/tomorrow.txt mysql -h mysqlserver -u user -pPassword Database -H -e "select statement;" echo "</HTML>") | mail email@email.com -s"Tomorrow's orders as of now" -a"Content-Type: text/html; charset=\"us-ascii\""
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件