Mailx отправить HTML-сообщение

Я хочу отправить HTML-сообщение с Mailx. Когда я пытаюсь следующую команду

mailx -s "Subject"  user@gmail.com  < email.html 

Я получаю содержимое email.html в виде обычного текста. В сообщении заголовок Content-Type установлен на text/plain. Опция -a пытается отправить файл, поэтому я не узнал, как изменить заголовок. Этот ответ почти сработал, он хорошо устанавливает Content-Type на text/html, но не заменяет стандартный Content-Type, который является text/plain.

mailx -s "$(echo -e "This is the subject\nContent-Type: text/html")" user@gmail.com  < email.html

дает такой результат:

From: send@gmail.com
To: user@gmail.com
Subject: This is the subject
Content-Type: text/html
Message-ID: <538d7b66.Xs0x9HsxnJKUFWuI%maikeul06@gmail.com>
User-Agent: Heirloom mailx 12.4 7/29/08
MIME-Version: 1.0
 boundary="=_538d7b66.z5gaIQnlwb1f/AOkuuC+GwF1evCaG/XIHQMbMMxbY6satTjK"

This is a multi-part message in MIME format.

--=_538d7b66.z5gaIQnlwb1f/AOkuuC+GwF1evCaG/XIHQMbMMxbY6satTjK
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

<html>
<body>
<p>Helo wolrd</p>
</body>
</html>

PS: я тоже пробовал с помощью uuencode. Когда я пытаюсь отобразить сообщение в веб-почте, я получаю пустую страницу...

6 ответов

Это легко, если ваш mailx Команда поддерживает -a (добавить заголовок) опция:

$ mailx -a 'Content-Type: text/html' -s "my subject" user@gmail.com < email.html

Если это не так, попробуйте использовать sendmail:

# create a header file
$ cat mailheader
To: user@gmail.com
Subject: my subject
Content-Type: text/html

# send
$ cat mailheader email.html | sendmail -t

Есть много разных версий почты вокруг. Когда вы выходите за рамки почтовых сообщений, подверженных 1@address1 to2@address2

  • С некоторыми реализациями mailx, например, из mailutils в Ubuntu или 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"
    
  • С обычным POSIX mailx я не знаю, как добраться до заголовков.

Если вы собираетесь использовать любую почту или mailx, имейте в виду, что

  • Это не переносимо даже внутри данного дистрибутива Linux. Например, и Ubuntu, и Debian имеют несколько альтернатив для mail и mailx.

  • При составлении сообщения mail и mailx обрабатывают строки, начинающиеся с ~, как команды. Если вы перенаправляете текст в почту, вам нужно, чтобы этот текст не содержал строк, начинающихся с ~.

В любом случае, если вы собираетесь установить программное обеспечение, вы можете установить нечто более предсказуемое, чем 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

Я успешно использовал следующее в Arch Linux (где -a флаг используется для вложений) в течение нескольких лет:

mailx -s "The Subject $( echo -e "\nContent-Type: text/html" user@gmail.com < email.html

Это добавило заголовок Content-Type к заголовку темы, который прекрасно работал до недавнего обновления. Теперь новая строка отфильтрована из -s предмет. Предположительно, это было сделано для повышения безопасности.

Вместо того, чтобы взламывать строку темы, я теперь использую подоболочку bash:

(
    echo -e "Content-Type: text/html\n"
    cat mail.html
 ) | mail -s "The Subject" -t user@gmail.com

И так как мы действительно используем только mailxсубъект флага, похоже, нет причин не переходить на sendmail как предложено @dogbane:

(
    echo "To: user@gmail.com"
    echo "Subject: The Subject"
    echo "Content-Type: text/html"
    echo
    cat mail.html
) | sendmail -t

Использование Bash подоболочек избавляет от необходимости создавать временный файл.

Ну, "-a" mail и mailx в Centos7 - это "прикрепить файл", а не "добавить заголовок". Мой кратчайший путь к решению на Centos7 здесь: stackexchange.com

В принципе:

yum install mutt
mutt -e 'set content_type=text/html' -s 'My subject' me@my.com < msg.html
EMAILCC=" -c user1@dominio.cl,user2@dominio.cl"
TURNO_EMAIL="user@dominio.cl"

mailx $EMAILCC -s "$(echo "Status: Control Aplicactivo \nContent-Type: text/html")" $TURNO_EMAIL < tmp.tmp

Если вы используете AIX, попробуйте это. Это прикрепит текстовый файл и включит тело HTML. Если это не работает, перехватите вывод в /var/spool/mqueue

#!/usr/bin/kWh
if (( $# < 1 ))
 then
  echo "\n\tSyntax: $(basename) MAILTO SUBJECT BODY.html ATTACH.txt "
  echo "\tmailzatt"
  exit
fi
export MAILTO=${1-noreply@visweb.co.za}
MAILFROM=$(whoami)
SUBJECT=${2-"mailzatt"}
export BODY=${3-/apps/bin/attch.txt}
export ATTACH=${4-/apps/bin/attch.txt}
export HST=$(hostname)
#export BODY="/wrk/stocksum/report.html"
#export ATTACH="/wrk/stocksum/Report.txt"
#export MAILPART=`uuidgen` ## Generates Unique ID
#export MAILPART_BODY=`uuidgen` ## Generates Unique ID
export MAILPART="==".$(date +%d%S)."===" ## Generates Unique ID
export MAILPART_BODY="==".$(date +%d%Sbody)."===" ## Generates Unique ID
(
echo "To: $MAILTO"
 echo "From: mailmate@$HST "
 echo "Subject: $SUBJECT"
 echo "MIME-Version: 1.0"
 echo "Content-Type: multipart/mixed; boundary=\"$MAILPART\""
 echo ""
 echo "--$MAILPART"
 echo "Content-Type: multipart/alternative; boundary=\"$MAILPART_BODY\""
 echo ""
 echo ""
 echo "--$MAILPART_BODY"
 echo "Content-Type: text/html"
 echo "Content-Disposition: inline"
 cat $BODY
 echo ""
 echo "--$MAILPART_BODY--"
 echo ""
 echo "--$MAILPART"
 echo "Content-Type: text/plain"
 echo "Content-Disposition: attachment; filename=\"$(basename $ATTACH)\""
 echo ""
 cat $ATTACH
 echo ""
 echo "--${MAILPART}--"
  ) | /usr/sbin/sendmail -t
Другие вопросы по тегам