it-swarm.cn

如何使用linux'mail'命令发送HTML电子邮件?

mail -s "subject" [email protected] <test.html有效,但仅适用于纯文本电子邮件。

使用Linux命令mail发送HTML电子邮件的正确方法是什么?

71
pyth0ner

mail的版本很多。当您超出mail -s subject [email protected] [email protected] <body的要求(用于发送时,这就是 [〜#〜] posix [〜#〜] 保证–甚至-s过去的日子 中都不存在) ,它们往往具有不同的命令行选项。添加额外的标题并不总是那么容易。

  • 使用mailx个实现,例如 从Ubuntu上的mailutilsDebian的bsd-mailx ,这很容易,因为有一个选项。

    mailx -a 'Content-Type: text/html' -s "Subject" [email protected] <test.html
    
  • 使用 传家宝mailx ,没有便捷的方法。插入任意标头的一种可能性是设置editheaders=1并使用外部编辑器(可以是脚本)。

    ## Prepare a temporary script that will serve as an editor.
    ## This script will be passed to ed.
    temp_script=$(mktemp)
    cat <<'EOF' >>"$temp_script"
    1a
    Content-Type: text/html
    .
    $r test.html
    w
    q
    EOF
    ## Call mailx, and tell it to invoke the editor script
    EDITOR="ed -s $temp_script" heirloom-mailx -S editheaders=1 -s "Subject" [email protected] <<EOF
    ~e
    .
    EOF
    rm -f "$temp_script"
    
  • 使用一般的 POSIX mailx ,我不知道如何获取标头。

如果要使用任何mailmailx,请记住

  • 即使在给定的Linux发行版中,这也无法移植。例如,Ubuntu和Debian都有mailmailx的几种选择。
  • 编写消息时,mailmailx将以~开头的行视为命令。如果将文本输入mail,则需要安排该文本不包含以~开头的行。

如果仍然要安装软件,则最好安装比mail/_Mail/_mailx更可预测的工具。例如, mutt 。使用Mutt,您可以使用-H选项 但不是Content-Type 来提供输入中的大多数标头,这需要通过mutt选项设置。

mutt -e 'set content_type=text/html' -s 'hello' '[email protected]' <test.html

或者,您可以直接调用sendmail。那里有sendmail个版本,但它们都支持sendmail -t以最简单的方式发送邮件,并从邮件中读取收件人列表。 (我认为他们并不全都支持Bcc:。)在大多数系统上,sendmail不在通常的$PATH中,而是在/usr/sbin/usr/lib中。

cat <<'EOF' - test.html | /usr/sbin/sendmail -t
To: [email protected]
Subject: hello
Content-Type: text/html

EOF
65
#!/bin/sh

(
echo "To: [email protected]"
echo "Subject: hello"
echo "Content-Type: text/html"
echo
echo "<html><b><font size='7'>H</font>Ello</b></html>"
echo
) | /usr/sbin/sendmail -t
14
Code Improver

使用Heirloom Mailx,便捷的方法是

mailx -s "$(echo -e "Newsletter issue 3\nContent-Type: text/html")" [email protected] < /tmp/htmlmail.txt

谢谢 Dude
在Fedora 17上进行了测试,

7
daniel

您将必须添加Content-Type标头添加到您的电子邮件中以实现此目的。

echo "<html><b>Hello</b></html>" | mail -a "Content-type: text/html;" -s "Testing" [email protected]

将工作

5
Noufal Ibrahim

使用heirloom-mailx,您可以将sendmail程序更改为钩子脚本,在其中替换标头,然后使用sendmail。

我使用的脚本(~/bin/sendmail-mailx-hook):

#!/bin/bash

sed '1,/^$/{
s,^\(Content-Type: \).*$,\1text/html; charset=utf-8,g
s,^\(Content-Transfer-Encoding: \).*$,\18bit,g
}' | sendmail [email protected]

此脚本如下更改邮件头中的值:

  • Content-Type:text/html; charset=utf-8
  • Content-Transfer-Encoding:8bit(不确定是否确实需要)。

发送HTML电子邮件:

mailx -Ssendmail='~/bin/sendmail-mailx-hook' -s "subject" [email protected] < test.html

此方法比@Gilles提出的方法更有效,因为它不会创建临时文件,而只是即时修复流。

3
loentar

我已经使用以下脚本来发生

#!/bin/ksh

(
echo "To: [email protected]"
echo "Subject: Job Status"
echo "Content-Type: text/html"
echo
echo "<html>
<head>
<title>Status of the jobs during the day</title>
<style>
table, th, td {
    border: 1px solid blue;
    border-collapse: collapse;
}
th, td {
    padding: 5px;
}
</style>
</head>
<body>
<table style='width:100%'>
<tr bgcolor='#808080'>
    <th>Job Name</th>
    <th>System name</th>
    <th>Status</th>
  </tr>
  <tr>
    <td>Job-1</td>
    <td>Sys</td>
    <td>Sucess</td>
  </tr>
  <tr>
    <td>Job-2</td>
    <td>sys</td>
    <td>Failure</td>
  </tr>
  <tr>
    <td>Job-3</td>
    <td>sys</td>
    <td>Sucess</td>
  </tr>
 </table>
</body></html>"
echo
) | /usr/sbin/sendmail -t
1
Bhabatosh

对我来说,我需要指定一个变量,例如SMTP服务器,因此mail命令以以下方式工作。我搜索了许多帖子,发现以下属性将正文转换为text/html。现在,我收到的电子邮件为HTML格式。

内容处置:内联

Unix版本:Red Hat Enterprise Linux Server 6.6版(圣地亚哥)

第一。将所需的任何信息创建到脚本中(testSql.sh)

echo "<html><body><pre>"
mysql -u USERNAME -pPASSWORD -P PORTNUMBER -h HOSTNAME DBNAME --table -e "select columns from tablename where member in ('value1','value2')"
echo "</pre></body></html>"

第二。将该脚本通过管道发送到mail命令

./testSql.sh  | mail -v -S smtp=smtp://IP:PORTNUMBER -s "$(echo -e "This is the subject\nContent-Type: text/ht ml\nMIME-Version: 1.0\nContent-Disposition: inline")" [email protected]

通过这样做,我在电子邮件中获得以下信息:

内容处置:内联消息ID:用户代理:Heirloom mailx 12.4 7/29/08 MIME版本:1.0内容类型:text/plain; charset = us-ascii内容传输编码:7位
 
 Value1 Value2

根据在testSql.sh中完成的HTML标记的Value1和Value2

0
Vaibhav

发布在另一个线程中,但基本上在我们的mail/mailx(12.5+)版本中,邮件的-a参数不再起作用,因为它添加了附件,并且我找不到其他标头的替换参数,因此最简单的方法我当时是使用sendmail。

以下是我创建的一个简单的1衬板,可在对我们有用的bash脚本中运行。它基本上只是传递Content-Type:text/html,主题和正文并起作用。

printf "Content-Type: text/html\nSubject: Test Email\nHTML 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>
0
Miburi