Como envio email em HTML usando o comando linux 'mail'?

66

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

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

pyth0ner
fonte

Respostas:

61

Existem muitas versões diferentes de mailao redor. Quando você vai além mail -s subject to1@address1 to2@address2 <body(para o envio, são todas as garantias POSIX - e até -snão existiam antigamente ), elas tendem a ter diferentes opções de linha de comando. Adicionar um cabeçalho adicional nem sempre é fácil.

  • Com algumas mailximplementações, por exemplo, a partir mailutilsde Ubuntu ou Debian debsd-mailx , é fácil, porque não há uma opção para isso.

    mailx -a 'Content-Type: text/html' -s "Subject" to@address <test.html
    
  • Com o Heirloom mailx , não há maneira conveniente. Uma possibilidade de inserir cabeçalhos arbitrários é definir editheaders=1e 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 POSIXmailx geral , não sei como chegar aos cabeçalhos.

Se você vai usar algum mailou mailx, lembre-se de que

  • Isso não é portátil, mesmo dentro de uma determinada distribuição Linux. Por exemplo, o Ubuntu e o Debian têm várias alternativas para maile mailx.
  • Ao escrever uma mensagem, maile mailxtrata linhas começando com ~como comandos. Se você inserir texto no texto mail, será necessário organizar esse texto para não conter linhas começando por ~.

Se você deseja instalar o software de qualquer maneira, é melhor instalar algo mais previsível que mail/ Mail/ mailx. Por exemplo, vira-lata . Com o Mutt, você pode fornecer a maioria dos cabeçalhos da entrada com a -Hopção, mas nãoContent-Type , que precisa ser definida através de uma opção mutt.

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

Ou você pode invocar sendmaildiretamente. Existem várias versões sendmaildisponíveis, mas todas suportam o sendmail -tenvio de um email da maneira mais simples, lendo a lista de destinatários do email. (Eu acho que eles não suportam todos Bcc:.) Na maioria dos sistemas, sendmailnão está no habitual $PATH, está em /usr/sbinou /usr/lib.

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

EOF
Gilles 'SO- parar de ser mau'
fonte
Tentei usar o exemplo de vira-lata acima; substituindo valores reais pelo nome do arquivo, pelo endereço de e-mail etc. etc., mas obtive "Nenhum destinatário foi especificado" Sou muito novo em silenciar, @Gilles, você sabe por que isso pode ter acontecido? (OSX leão de montanha, vira-lata 1.5.21 instalado via homebrew)
Chuck van der Linden
minha segunda linha era "Para: [email protected]" (desculpe pela falta de formatação, não é possível em uma resposta, o texto real era sem aspas) e incluí uma linha em branco antes de colocar o EOF. haveria configuração que preciso fazer para silenciar? antes de tentar o exemplo que você deu (com valores adequados substituído) tudo que fiz foi 'bebida instalar vira-lata'
Chuck van der Linden
@ChuckvanderLinden Faça uma nova pergunta. Copie e cole o comando exato que você executou e a mensagem de erro completa. Veja se você pode enviar um email do mutt usando a interface interativa.
Gilles 'SO- stop be evil'
Consegui enviar algo através da interface 'interativa', que inicialmente se queixava de um diretório de correio ausente e se ofereceu para criá-lo. lembrei o quanto eu odeio vim ;-) mas consegui enviar. Iniciarei uma nova pergunta, pois é mais fácil de formatar etc. A mensagem de erro exata foi exatamente o que eu disse: "Nenhum destinatário foi especificado".
Chuck van der Linden
Nova pergunta unix.stackexchange.com/questions/83137/…
Chuck van der Linden
13
#!/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
Melhorador de código
fonte
5
Isso não usa de verdade mail.
3
@ user16144 Não, mas é uma boa alternativa que o OP gostaria de considerar.
trusktr
Sim, ele não usa correio, mas funciona em todos os lugares em que o experimentei, o que é mais do que posso dizer para as outras soluções.
User1683793
Funciona muito bem no Mac também.
Asim Jalis 28/02
7

Com o Heirloom mailx, é conveniente

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

Obrigado, Cara
Testado no Fedora 17, e trabalhou

daniel
fonte
11
Insolente. Eu gosto disso. : -]
Alastair Irvine
11
Tenha em atenção que esta solução pode levar ao e-mail tendo ambos "Content-Type: text / html" e "Content-Type: text / plain", e potenciais inconsistências se você usar essa maneira de especificar charset.
Skippy le Grand Gourou
5

Você precisará adicionar um Content-Typecabeçalho 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]

vai funcionar

Noufal Ibrahim
fonte
2
mail: opção ilegal - a
pyth0ner
Você tem mailx? Isso pode ter a opção. Se isso não funcionar. Se isso não funcionar, você pode considerar o uso de mutt, embora eu não saiba de imediato o que a linha de comando alterna para fazer.
Noufal Ibrahim
11
se o correio não estiver cortando a mostarda, use python ... docs.python.org/library/email-examples.html examples é o terceiro ou o nº 6 que atende às suas necessidades.
sdolgy
O Python exigirá que você escreva (e mantenha) um script. Um liner de uma linha de comando tem vantagens diferentes.
Noufal Ibrahim
Eu tenho mailx, mas "opção -a" não funcionam, ainda mostram: mail: opção ilegal - um
pyth0ner
3

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

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

#!/bin/bash

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

Este script altera os valores no cabeçalho do email da seguinte maneira:

  • Content-Type: para text/html; charset=utf-8
  • Content-Transfer-Encoding:para 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

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

loentar
fonte
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
Bhabatosh
fonte
0

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

Disposição de conteúdo: 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. Canalize 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, obtenho informações como abaixo no e-mail:

Disposição de conteúdo: inline ID da mensagem: Agente do usuário: Heirloom mailx 12.4 29/07/08 Versão MIME: 1.0 Tipo de conteúdo: texto / sem formatação; charset = us-ascii Codificação de transferência de conteúdo: 7 bits

Valor1 Valor2

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

Vaibhav
fonte
-5
cat htmlfile.html | mail -s "subject" [email protected]

fonte
5
Não. Isso enviará um email de texto com HTML no corpo.
Noufal Ibrahim