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


66

mail -s "subject" xxxxx@gmail.com <test.html 有效,但仅适用于纯文本电子邮件。

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

Answers:


61

mail周围有许多不同版本。当您超出限制mail -s subject to1@address1 to2@address2 <body(用于发送时,这就是POSIX的所有保证,甚至-s过去并不存在),它们往往具有不同的命令行选项。添加额外的标题并不总是那么容易。

  • 对于某些mailx实现,例如mailutilsUbuntuDebian的实现bsd-mailx,这很容易,因为有一个选项。

    mailx -a 'Content-Type: text/html' -s "Subject" to@address <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" to@address <<EOF
    ~e
    .
    EOF
    rm -f "$temp_script"
    
  • 使用一般的POSIXmailx,我不知道如何获得标题。

如果您要使用mailmailx,请记住

  • 即使在给定的Linux发行版中,这也无法移植。例如,Ubuntu和Debian都有几个备选方案mailmailx
  • 在编写消息时,mail并且mailx开始与对待线~为命令。如果将文本输入管道mail,则需要安排该文本不包含以开头的行~

如果你要你一定要安装软件,你还不如安装的东西比更可预测mail/ Mail/ mailx。例如,mutt。使用Mutt,您可以在输入中为大多数标头提供-H选项,但不能通过Content-Type mutt选项设置此选项。

mutt -e 'set content_type=text/html' -s 'hello' 'to@address' <test.html

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

cat <<'EOF' - test.html | /usr/sbin/sendmail -t
To: to@address
Subject: hello
Content-Type: text/html

EOF

使用上面的mutt示例进行了尝试;用真实值代替文件名,电子邮件地址等,但得到“未指定收件人”我对mutt很陌生,@ Gilles您知道为什么会发生这种情况吗?(osx山狮,通过自制程序安装的mutt 1.5.21)
Chuck van der Linden

我的第二行是“收件人:myaddress@mycompany.com”(很抱歉,由于缺少格式,无法在响应中显示,实际文本为无引号),在放入EOF之前我添加了一个空白行。我需要做一些mutt配置吗?在尝试您给出的示例(替换为正确的值)之前,我所做的只是“酿造杂物”
Chuck van der Linden 2013年

@ChuckvanderLinden提出一个新问题。复制并粘贴您运行的确切命令和完整的错误消息。查看您是否可以使用交互式界面从mutt发送电子邮件。
吉尔斯2013年

我能够通过“交互”界面发送一些内容,最初它抱怨邮件目录丢失,并提出要创建它。提醒我有多讨厌vim ;-),但可以发送。我将开始一个新的问题,因为它更易于格式化等。确切的错误消息就是我所说的“未指定收件人”。
Chuck van der Linden


13
#!/bin/sh

(
echo "To: me@example.com"
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

5
那根本没有用mail

3
@ user16144否,但这是OP可能要考虑的一个不错的选择。
trusktr 2014年

是的,它不使用邮件,但在我尝试过的所有地方都可以使用,这比其他解决方案所能说的要多。
user1683793

在Mac上也能很好地工作。
阿西姆·贾利斯

7

使用Heirloom Mailx,便捷的方法是

mailx -s "$(echo -e "Newsletter issue 3\nContent-Type: text/html")" user@server.com < /tmp/htmlmail.txt

谢谢,Dude
在Fedora 17上进行了测试,并努力工作


1
厚脸皮。我喜欢。:-]
Alastair Irvine

1
请注意该解决方案可能会导致具有电子邮件 “的Content-Type:text / html的”和“的Content-Type:text / plain的”,和潜在的不一致,如果你用这种方式来指定字符集。
Skippy le Grand Gourou

5

您必须Content-Type在电子邮件中添加标题才能实现此目的。

echo "<html><b>Hello</b></html>" | mail -a "Content-type: text/html;" -s "Testing" me@example.com

将工作


2
邮件:非法选项
-a

你有mailx吗 那可能有选择。如果那不起作用。如果那行不通,您可以考虑使用mutt,尽管我不知道该如何切换命令行。
Noufal Ibrahim

1
如果邮件不能满足需求,请使用python ... docs.python.org/library/email-examples.html示例是适合您需求的第三个示例或#6。
sdolgy 2011年

Python将要求您编写(和维护)脚本。命令行一个衬里具有不同的优点。
Noufal Ibrahim 2011年

我有mailx,但是“ option -a”不起作用,仍然显示:mail:非法选项-a
pyth0ner 2011年

3

使用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 $@

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

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

发送HTML电子邮件:

mailx -Ssendmail='~/bin/sendmail-mailx-hook' -s "subject" xxxxx@gmail.com < test.html

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


1

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

#!/bin/ksh

(
echo "To: yourmail@domain.com"
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

0

对我来说,我需要指定一个变量,例如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")" userid@email.com

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

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

值1值2

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


-5
cat htmlfile.html | mail -s "subject" xx@example.com

5
不。这将在正文中发送带有HTML的文本电子邮件。
Noufal Ibrahim
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.