Como faço para enviar email em HTML usando o comando linux 'mail'?

64

mail -s "subject" [email protected] <test.html funciona, mas apenas para o email em texto simples.

Qual é a maneira correta de enviar email em HTML usando o comando Linux mail ?

    
por pyth0ner 22.06.2011 / 06:15

8 respostas

59

Existem muitas versões diferentes de mail ao redor. Quando você for além de mail -s subject to1@address1 to2@address2 <body (para envio, isso é tudo que garante POSIX - e até -s não existiam nos dias antigos ), eles tendem a ter opções de linha de comando diferentes. Adicionar um cabeçalho adicional nem sempre é fácil.

  • Com algumas implementações de mailx , por ex. de mailutils no Ubuntu ou Debian bsd-mailx , é fácil, porque há uma opção para isso.

    mailx -a 'Content-Type: text/html' -s "Subject" to@address <test.html
    
  • Com o Herança mailx , não há maneira conveniente. Uma possibilidade de inserir cabeçalhos arbitrários é definir editheaders=1 e usar um editor externo (que pode ser um script).

    ## 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"
    
  • Com um POSIX mailx geral, não sei como nos cabeçalhos.

Se você for usar qualquer mail ou mailx , lembre-se de que

  • Isso não é portátil nem dentro de uma determinada distribuição do Linux. Por exemplo, tanto o Ubuntu quanto o Debian possuem várias alternativas para mail e mailx .
  • Ao compor uma mensagem, mail e mailx tratam as linhas que começam com ~ como comandos. Se você canalizar o texto para mail , será necessário que esse texto não contenha linhas que comecem com ~ .

Se você for instalar o software mesmo assim, é melhor instalar algo mais previsível que mail / Mail / mailx . Por exemplo, mutt . Com o Mutt, você pode fornecer a maioria dos cabeçalhos na entrada com a opção -H , mas não Content-Type , que precisa ser definido por meio de uma opção mutt.

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

Ou você pode invocar sendmail diretamente. Existem várias versões de sendmail por aí, mas todas elas suportam sendmail -t para enviar um e-mail da maneira mais simples, lendo a lista de destinatários pelo correio. (Acho que nem todos suportam Bcc: .) Na maioria dos sistemas, sendmail não está no usual $PATH , em /usr/sbin ou /usr/lib .

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

EOF
    
por 23.06.2011 / 01:03
12
#!/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
    
por 17.10.2012 / 20:47
6

Com o Heirloom mailx, a maneira conveniente é

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

Obrigado, Cara
Testado no Fedora 17 e trabalhado

    
por 29.07.2014 / 15:01
5

Você precisará adicionar Content-Type header ao seu e-mail para que isso aconteça.

echo "<html><b>Hello</b></html>" | mail -a "Content-type: text/html;" -s "Testing" [email protected]

funcionará

    
por 22.06.2011 / 08:39
3

Com o heirloom-mailx você pode alterar o programa sendmail para o seu script de gancho, substituir os cabeçalhos lá e então usar o sendmail.

O script que eu uso ( ~/bin/sendmail-mailx-hook ):

#!/bin/bash

sed '1,/^$/{
s,^\(Content-Type: \).*$,text/html; charset=utf-8,g
s,^\(Content-Transfer-Encoding: \).*$,bit,g
}' | sendmail $@

Este script altera os valores no cabeçalho da mensagem da seguinte forma:

  • Content-Type: to text/html; charset=utf-8
  • Content-Transfer-Encoding: to 8bit (não tenho certeza se isso é realmente necessário).

Para enviar email em HTML:

mailx -Ssendmail='~/bin/sendmail-mailx-hook' -s "subject" [email protected] < test.html

Este método é mais eficaz do que o proposto por @Gilles porque não cria arquivos temporários e apenas corrige o fluxo on-the-fly.

    
por 17.09.2014 / 08:47
1

Eu usei os scripts abaixo para acontecer

#!/bin/ksh

(
echo "To: [email protected]"
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
    
por 27.06.2016 / 16:00
0

Para mim, eu precisava especificar uma variável como o servidor SMTP, então o comando mail funcionava da maneira abaixo. Eu pesquisei em muitos posts, e encontrei abaixo a propriedade para converter o corpo em text / html. Agora o email que recebo está no formato HTML.

Content-Disposition: inline

Versão Unix: Servidor Red Hat Enterprise Linux versão 6.6 (Santiago)

Primeiro. Crie todas as informações necessárias em um script (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>"

Segundo. Pipe esse script para o comando 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")" [email protected]

Ao fazer isso, recebo as informações abaixo no e-mail:

Content-Disposition: inline Message-ID: User-Agent: Heirloom mailx 12.4 7/29/08 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit 

Value1 Value2

Valor1 e Valor2 conforme a marcação HTML feita no testSql.sh

    
por 22.06.2015 / 13:26
-5
cat htmlfile.html | mail -s "subject" [email protected]
    
por 22.06.2011 / 07:07