使用 shell 脚本发送 HTML 邮件

2024-11-01 08:41:00
admin
原创
37
摘要:问题描述:如何使用 shell 脚本发送 HTML 电子邮件?解决方案 1:首先,您需要撰写邮件。邮件至少由以下两个标题组成:MIME-Version: 1.0 Content-Type: text/html ...以及相应的消息正文:<!DOCTYPE HTML PUBLIC &quo...

问题描述:

如何使用 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中有两种快捷方法

  1. 使用旧学校邮件

`mail -s "$(echo -e "This is Subject
Content-Type: text/html")" test@yahoo.com < mytest.html`

  1. 使用 mutt

mutt -e &quot;my_hdr Content-Type: text/html&quot; test@yahoo.com -s &quot;subject&quot; &lt; 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 &lt;password>
logfile ~/.msmtp.log

然后只需调用:

(echo &quot;Subject: &lt;subject>&quot;; echo; echo &quot;&lt;message>&quot;) | msmtp &lt;email@domain.tld>

在你的脚本中

更新:对于 HTML 邮件,您还必须添加标题,因此您可能需要创建如下文件:

From: sender@domain.tld
To: email@domain.tld
Subject: Important message
Mime-Version: 1.0
Content-Type: text/html

&lt;h1>Mail body will be here&lt;/h1>
The mail body &lt;b>should&lt;/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=&quot;000000000000f3b2130570186a0c&quot;

--000000000000f3b2130570186a0c
Content-Type: text/plain; charset=&quot;UTF-8&quot;

This is my plain text stuff here, in case the email client does not support HTML or is blocking it purposely

My Link Here &lt;http://www.example.com>

--000000000000f3b2130570186a0c
Content-Type: text/html; charset=&quot;UTF-8&quot;

&lt;div dir=&quot;ltr&quot;>
&lt;div>This is my HTML version of the email&lt;/div>
&lt;div>&lt;br>&lt;/div>
&lt;div>&lt;a href=&quot;http://www.example.com&quot;>My Link Here&lt;/a>&lt;br>&lt;/div>
&lt;/div>

--000000000000f3b2130570186a0c--
--000000000000f3b2150570186a0e
Content-Type: text/csv; charset=&quot;US-ASCII&quot;; name=&quot;test.csv&quot;
Content-Disposition: attachment; filename=&quot;test.csv&quot;
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 &quot;`cat test.txt; openssl base64 -e &lt; test.csv`
--000000000000f3b2150570186a0e--
&quot; | mailx -s &quot;Test 2 $( echo -e &quot;
Content-Type: multipart/mixed; boundary=\&quot;000000000000f3b2150570186a0e\&quot;&quot; )&quot; -r fromaddress@example.com toaddress@example.com

正如您在 mailx 主题行中看到的,我静态插入了多部分边界,这是电子邮件客户端将看到的第一个标题。

接下来是 test.txt 内容被转储。

关于附件,我使用 openssl(这在系统上非常标准)将文件附件转换为 base64。

另外,我在这个回声的末尾添加了边界关闭语句,以表示消息的结束。

这解决了 heirloom-mailx 问题并且实际上不需要脚本。

回声可以是一种反馈,或者任何其他方法。

解决方案 7:

cat > mail.txt &lt;&lt;EOL
To: &lt;email>
Subject: &lt;subject>
Content-Type: text/html

&lt;html>
$(cat &lt;report-table-*.html>)
This report in &lt;a href=&quot;&lt;url>&quot;>SVN&lt;/a>
&lt;/html>

EOL

进而:

sendmail -t &lt; 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

&lt;h1>Mail body will be here&lt;/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 &quot;You have new mail&quot; -a &quot;Content-type: text/html&quot; -a &quot;From: sender@xxx.com&quot; $1 &lt;&lt; EOF
&lt;html>
&lt;body>
Neues Dokument: $2&lt;br>
&lt;a href=&quot;https://xxx/index.php/apps/files/?dir=/Post&quot;>Hier anschauen&lt;/a>
&lt;/body>
&lt;/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 &quot;reciever@test.com&quot; -s \n smtp.test.com -u &quot;Title&quot; -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 &quot;Content-Type: text/html
Subject: Test Email
HTML BODY&lt;b>test bold&lt;/b>&quot; | sendmail &lt;Email Address To>

如果您想从变量创建整个 html 页面,我在 bash 脚本中使用的另一种方法是按如下所示传递变量。

emailBody=&quot;From: &lt;Email Address From>
Subject: Test
Content-Type: text/html; charset=\&quot;us-ascii\&quot;
&lt;html>
&lt;body>
body
&lt;b> test bold&lt;/b>

&lt;/body>
&lt;/html>
&quot;
echo &quot;$emailBody&quot; | sendmail &lt;Email Address To>

解决方案 12:

这个问题专门在 上提出shell script,问题标签中只提到了sendmail软件包。因此,如果有人正在寻找这个,这里有一个在 CentOS 8 上为我工作的带有 sendmail 用法的简单脚本:

#!/bin/sh
TOEMAIL=&quot;youremail@server.com&quot;
REPORT_FILE_HTML=&quot;$REPORT_FILE.html&quot;
echo &quot;Subject: EMAIL SUBJECT&quot; >> &quot;${REPORT_FILE_HTML}&quot;
echo &quot;MIME-Version: 1.0&quot; >> &quot;${REPORT_FILE_HTML}&quot;
echo &quot;Content-Type: text/html&quot; >> &quot;${REPORT_FILE_HTML}&quot;
echo &quot;&lt;html>&quot; >> &quot;${REPORT_FILE_HTML}&quot;
echo &quot;&lt;head>&quot; >> &quot;${REPORT_FILE_HTML}&quot;
echo &quot;&lt;title>Best practice to include title to view online email&lt;/title>&quot; >> &quot;${REPORT_FILE_HTML}&quot;
echo &quot;&lt;/head>&quot; >> &quot;${REPORT_FILE_HTML}&quot;
echo &quot;&lt;body>&quot; >> &quot;${REPORT_FILE_HTML}&quot;
echo &quot;&lt;p>Hello there, you can put email html body here&lt;/p>&quot; >> &quot;${REPORT_FILE_HTML}&quot;
echo &quot;&lt;/body>&quot; >> &quot;${REPORT_FILE_HTML}&quot;
echo &quot;&lt;/html>&quot; >> &quot;${REPORT_FILE_HTML}&quot;

sendmail $TOEMAIL &lt; $REPORT_FILE_HTML

解决方案 13:

除了可以用mdma来正确回答之外,还可以使用mail命令,如下:

mail person@email.com -s&quot;Subject Here&quot; -a&quot;Content-Type: text/html; charset=\&quot;us-ascii\&quot;&quot;

您将获得想要的内容。不要忘记在电子邮件中输入&lt;HTML>和。下面是我用来通过电子邮件发送 HTML 每日报告的快速脚本:&lt;/HTML>

#!/bin/sh
(cat /path/to/tomorrow.txt mysql -h mysqlserver -u user -pPassword Database -H -e &quot;select statement;&quot; echo &quot;&lt;/HTML>&quot;) | mail email@email.com -s&quot;Tomorrow&#039;s orders as of now&quot; -a&quot;Content-Type: text/html; charset=\&quot;us-ascii\&quot;&quot;
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用