如何使用linux命令行发送HTML电子邮件

时间:2010-04-07 10:53:46

标签: html linux email send

我需要发送html格式的电子邮件。我只有linux命令行和命令“mail”。

目前已使用:

echo "To: address@example.com" > /var/www/report.csv
echo "Subject: Subject" >> /var/www/report.csv
echo "Content-Type: text/html; charset=\"us-ascii\"" >> /var/www/report.csv

echo "<html>" >> /var/www/report.csv
mysql -u ***** -p***** -H -e "select * from users LIMIT 20" dev >> /var/www/report.csv
echo "</html>" >> /var/www/report.csv

mail -s "Built notification" address@example.com < /var/www/report.csv

但是在我的邮件代理中我只得到普通文本。

alt text

11 个答案:

答案 0 :(得分:49)

这对我有用:

echo "<b>HTML Message goes here</b>" | mail -s "$(echo -e "This is the subject\nContent-Type: text/html")" foo@example.com

答案 1 :(得分:40)

我的邮件版本没有--append,而且echo -e \n - 技巧太聪明了(它只是用空格替换\ n)。但它确实有-a

mail -a "Content-type: text/html" -s "Built notification" address@example.com < /var/www/report.html

答案 2 :(得分:26)

创建一个名为tmp.html的文件,并在其中加入以下行:

<b>my bold message</b>

然后将所有这些粘贴到命令行中:(括号和全部)。

(
  echo To: youremail@blah.com
  echo From: el@defiant.com
  echo "Content-Type: text/html; "
  echo Subject: a logfile
  echo
  cat tmp.html
) | sendmail -t

将发送邮件。消息显示为粗体而不是<b>标记。

来源:
How to send a html email with the bash command "sendmail"?

答案 3 :(得分:8)

问题在于,当将文件重定向到“邮件”时,它仅用于邮件正文。您嵌入文件中的任何标题都会进入正文。

尝试:

mail --append="Content-type: text/html" -s "Built notification" address@example.com < /var/www/report.csv

- append允许您向邮件添加任意标头,您应该在其中指定内容类型和内容处置。不需要在文件中嵌入ToSubject标头,或者使用--append指定它们,因为您已经在命令行上隐式设置它们(-s是主题,并且address@example.com自动成为To

答案 4 :(得分:6)

在OS X(10.9.4)上,cat有效,如果您的电子邮件已经存在于文件中,则会更容易:

cat email_template.html  | mail -s "$(echo -e "Test\nContent-Type: text/html")" karl@marx.com

答案 5 :(得分:3)

使用heirloom-mailx,您可以将sendmail程序更改为您的钩子脚本,在那里替换头文件,然后使用sendmail。

我使用的脚本(~/bin/sendmail-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电子邮件:

mail -Ssendmail='~/bin/sendmail-hook' \
    -s "Built notification" address@example.com < /var/www/report.csv

答案 6 :(得分:2)

您应该使用“追加”模式重定向>>而不是>

答案 7 :(得分:2)

很老的问题,但当我搜索有关此问题的问题时它排名很高。

在这里找到答案:

Sending HTML mail using a shell script

答案 8 :(得分:2)

我找到了一个非常简单的解决方案:在邮件命令中添加修饰符-aContent-Type:text / html。

在你的情况下会是:

mail -aContent-Type:text/html -s "Built notification" address@example.com < /var/www/report.csv

答案 9 :(得分:1)

尝试:

echo "To: address@example.com" > /var/www/report.csv
echo "Subject: Subject" >> /var/www/report.csv
echo "MIME-Version: 1.0" >> /var/www/report.csv
echo "Content-Type: text/html; charset=\"us-ascii\"" >> /var/www/report.csv
echo "Content-Disposition: inline" >> /var/www/report.csv

echo "<html>" >> /var/www/report.csv
mysql -u ***** -p***** -H -e "select * from users LIMIT 20" dev >> /var/www/report.csv
echo "</html>" >> /var/www/report.csv

mail -s "Built notification" address@example.com < /var/www/report.csv

答案 10 :(得分:1)

我在git的一个post_receive挂钩中遇到类似的问题(用邮件),最后我发现,sendmail实际上对这类事情更有效,特别是如果你知道一些如何e - 邮件被构建(似乎你知道)。我知道这个答案来得很晚,但也许对其他人来说也会有所帮助。我使用了heredoc运算符并使用了该功能,它扩展了变量,因此它也可以运行内联脚本。只需检查一下(bash脚本):

#!/bin/bash
recipients=(
    'john@example.com'
    'marry@not-so-an.example.com'
#   'naah@not.this.one'
);
sender='highly-automated-reporter@example.com';
subject='Oh, who really cares, seriously...';
sendmail -t <<-MAIL
    From: ${sender}
    `for r in "${recipients[@]}"; do echo "To: ${r}"; done;`
    Subject: ${subject}
    Content-Type: text/html; charset=UTF-8

    <html><head><meta charset="UTF-8"/></head>
    <body><p>Ladies and gents, here comes the report!</p>
    <pre>`mysql -u ***** -p***** -H -e "SELECT * FROM users LIMIT 20"`</pre>
    </body></html>
MAIL

注意MAIL部分中的反引号以生成一些输出并记住,<<-运算符仅从行的开头剥离制表符(而不是空格),因此在这种情况下,复制粘贴将不起作用(您需要用适当的标签替换缩进)。或者使用<<运算符并且根本不进行缩进。希望这会对某人有所帮助。当然你可以在MAIL部分之外使用反引号并将输出保存到某个变量中,以后可以在MAIL部分使用 - 品味和可读性问题。我知道,#!/bin/bash并不总是适用于每个系统。