【问题标题】:How to send HTML email using linux command line如何使用 linux 命令行发送 HTML 电子邮件
【发布时间】:2011-02-05 05:05:58
【问题描述】:

我需要发送 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

但在我的邮件代理中,我只能得到纯文本。

【问题讨论】:

  • 此问题答案的读者请注意:有几个不同的程序称为mail,例如Debian jessie 上的heirloom-mailxbsd-mailx。如果此处答案中的mail 命令对您不起作用,则您可能使用了错误的mail。请参阅您的发行版的包管理器以安装正确的包,并使用该二进制文件的特定名称(例如 Debian 上的 bsd-mailx)来解决该问题。更多细节在这里:heirloom.sourceforge.net/mailx_history.html

标签: html linux email send


【解决方案1】:

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

【讨论】:

  • 我认为这应该是评论,而不是答案。
【解决方案2】:

尝试:

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

【讨论】:

  • 这不起作用。 $ lsb_release -a 发行商 ID:Ubuntu 描述:Ubuntu 10.04.4 LTS 版本:10.04 代号:lucid
  • @Simone,由于 MIME-VersionContent-Tye 的顺序,这无法完美运行。您需要将此信息放在 Subject 之前,以适用于大多数 unix/linux 风格。
【解决方案3】:

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

试试:

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

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

【讨论】:

  • 在我的邮件命令中没有那个选项 mail: invalid option -- a Usage: mail [-iInv] [-s subject] [-c cc-addr] [-b bcc-addr ] to-addr ... [-- sendmail-options ...] 邮件 [-iInNv] -f [名称] 邮件 [-iInNv] [-u 用户]
  • @nylund:mail (GNU Mailutils 2.2)。这是关闭 ubuntu 12.04,但也将在旧版本中,因为这个答案现在已经快 3 年了。
【解决方案4】:

这对我有用:

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

【讨论】:

  • 我会说这是 OSX 邮件实现中的一个错误,尽管它需要与其他错误结合才能被利用。我敢肯定会有一些网络脚本无法正确检查它们插入主题行中的回车。
  • 适用于 AIX 7.1.0.0!哦,对聪明的人来说,反引号不起作用(在 ksh 中),但 $( ) 起作用。
  • 在 Debian Wheezy 上工作
  • 在 Godaddy 和 Amazon Linux 上工作
  • 在 Fedora 29 上工作
【解决方案5】:

非常老的问题,但是当我在谷歌上搜索一个关于此的问题时,它的排名很高。

在这里找到答案:

Sending HTML mail using a shell script

【讨论】:

    【解决方案6】:

    我的邮件版本没有--append,它对于echo -e \n-trick 来说太聪明了(它只是用空格替换\n)。但是,它确实有 -a:

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

    【讨论】:

    • 适用于 ubuntu 14.04.1 LTS,邮件设置为 bsd-mailx
    • 我用这种方式echo `curl -L www.google.es` | mail -a "Content-type: text/html" -s "website content" email@email.com而不是&lt;。为方便起见,我创建了一个 /usr/local/bin 脚本来绕过大部分命令。我只用wmail url email
    • 我试过了,但 SpamAssassin 给我的分数比没有 -a "Cont..." 时的分数要低,也许是因为我没有 html 格式的文本
    • 我没有得到带有 mail 和 mailx 的内容类型的此类文件或目录
    • 我也得到“内容类型:文本/html:没有这样的文件或目录”。你确定“-a”是对的吗?
    【解决方案7】:

    命令行

    创建一个名为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
    

    由于&lt;b&gt; 元素,邮件将在发送时包含粗体消息。

    Shell 脚本

    作为脚本,将以下内容另存为email.sh

    ARG_EMAIL_TO="recipient@domain.com"
    ARG_EMAIL_FROM="Your Name <you@host.com>"
    ARG_EMAIL_SUBJECT="Subject Line"
    
    (
      echo "To: ${ARG_EMAIL_TO}"
      echo "From: ${ARG_EMAIL_FROM}"
      echo "Subject: ${ARG_EMAIL_SUBJECT}"
      echo "Mime-Version: 1.0"
      echo "Content-Type: text/html; charset='utf-8'"
      echo
      cat contents.html
    ) | sendmail -t
    

    在与email.sh 脚本相同的目录中创建一个名为contents.html 的文件,类似于:

    <html><head><title>Subject Line</title></head>
    <body>
      <p style='color:red'>HTML Content</p>
    </body>
    </html>
    

    运行email.sh。当电子邮件到达时,HTML Content 文本将显示为红色。

    相关

    【讨论】:

    • echo | cat msg-headers - msg-body | sendmail -tmsg-headersmsg-body 分别作为包含标题和正文的文本文件)
    • 这对我有用,但是当我们使用 sendmail 时如何添加附件
    • @DileepGogula 见zedwood.com/article/bash-send-mail-with-an-attachment(通过两次点击从上面的“相关”部分链接)
    【解决方案8】:

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

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

    【讨论】:

      【解决方案9】:

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

      【讨论】:

      • 由于某种原因,我无法让它在函数中工作,但您确实可以将其用作单独的可执行文件。当此页面上的其他建议不起作用时,此方法有效。
      • 您无法将这项工作作为一个函数来完成,因为生成的邮件进程无法访问您的 bash 脚本中的函数
      • [无法弄清楚如何将其用于聊天或 PM。] 我可以获取我的邮件命令吗? . mail -Ssendmail='~/bin/sendmail-hook' -s "Subject" address@example.com &lt; inputfile
      • 你无法获取它,因为它是二进制的。您应该使用这些命令创建自己的 bash 脚本并(如果需要)获取它。
      【解决方案10】:

      我在我的 git 的一个 post_receive 挂钩中遇到了类似的问题(邮件),最后我发现,sendmail 实际上更适合这种事情,特别是如果你知道一些电子邮件是如何构建的(看起来你知道)。我知道这个答案来得很晚,但也许对其他人也有用。我使用了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 部分中的反引号以生成一些输出并记住,&lt;&lt;- 运算符仅从行首剥离制表符(而不是空格),因此在这种情况下复制粘贴将不起作用(您需要替换用适当的标签缩进)。或者使用&lt;&lt; 运算符并且根本不进行缩进。希望这会对某人有所帮助。当然,您可以在 MAIL 部分之外使用反引号并将输出保存到某个变量中,以便以后在 MAIL 部分中使用——这取决于品味和可读性。而且我知道,#!/bin/bash 并不总是适用于所有系统。

      【讨论】:

        【解决方案11】:

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

        你的情况是:

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

        【讨论】:

        • 但是我在使用这个时没有得到这样的文件或目录
        • @eightStacker:你的 /var/www 目录中有一个名为 report.csv 的文件吗?如果不是,则应将其替换为要发送的文件。 address@example.com 也是一个示例,您必须将其替换为消息的实际目的地
        • @Zafar 我跟八叠器说的一样 :)
        • -a 选项用于“附件”...我在 CentOS 7.4 服务器上使用版本“12.5 7/5/10”;在其他 cmets 中,他们谈论 --append,这甚至不是一个选择……为什么有这么多 (显然) mail 实现?
        猜你喜欢
        • 2015-03-19
        • 2010-11-22
        • 2019-12-16
        • 1970-01-01
        • 2010-09-07
        • 1970-01-01
        • 2023-03-10
        • 2015-01-24
        相关资源
        最近更新 更多