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

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

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

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

答案1

周围有很多不同的版本mail。当你超越mail -s subject to1@address1 to2@address2 <body(发送,仅此而已)POSIX保证 - 甚至-s不存在过去),他们往往有不同的命令行选项。添加额外的标头并不总是那么容易。

  • 通过一些mailx实现,例如来自mailutilsUbuntu或者Debian 的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 都有多种mail和 的替代方案mailx
  • 撰写消息时,mail将以mailx和 开头的行视为~命令。如果将文本通过管道输入mail,则需要安排该文本不包含以 开头的行~

如果您无论如何都要安装软件,您不妨安装比mail/ Mail/更可预测的东西mailx。例如,杂种狗。使用 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,而是/usr/sbin/usr/lib

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

EOF

答案2

#!/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

答案3

有了Heirloom mailx,方便的方法是

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

谢谢,伙计
在 Fedora 17 上测试并运行

答案4

使用 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" [email protected] < test.html

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

相关内容