web-dev-qa-db-fra.com

Comment envoyer des e-mails HTML à l'aide de la commande linux 'mail'?

mail -s "subject" [email protected] <test.html fonctionne, mais uniquement pour les e-mails en texte brut.

Quelle est la bonne façon d'envoyer des e-mails HTML à l'aide de la commande Linux mail?

71
pyth0ner

Il existe de nombreuses versions différentes de mail. Lorsque vous allez au-delà de mail -s subject to1@address1 to2@address2 <body (pour l'envoi, c'est tout POSIX garantit - et même -s n'existait pas dans le old days ), ils ont tendance à avoir différentes options de ligne de commande. Ajouter un en-tête supplémentaire n'est pas toujours facile.

  • Avec certaines implémentations mailx, par exemple de mailutils sur Ubunt ou Debian's bsd-mailx , c'est facile, car il y a une option pour ça.

    mailx -a 'Content-Type: text/html' -s "Subject" to@address <test.html
    
  • Avec le Heirloommailx , il n'y a aucun moyen pratique. Une possibilité d'insérer des en-têtes arbitraires consiste à définir editheaders=1 et utilisez un éditeur externe (qui peut être un 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"
    
  • Avec un général POSIX mailx , je ne sais pas comment accéder aux en-têtes.

Si vous allez utiliser n'importe quel mail ou mailx, gardez à l'esprit que

  • Ce n'est pas portable même dans une distribution Linux donnée. Par exemple, Ubuntu et Debian ont plusieurs alternatives pour mail et mailx.
  • Lors de la composition d'un message, mail et mailx traite les lignes commençant par ~ en tant que commandes. Si vous dirigez du texte dans mail, vous devez vous assurer que ce texte ne contienne pas de lignes commençant par ~.

Si vous souhaitez installer un logiciel de toute façon, vous pourriez tout aussi bien installer quelque chose de plus prévisible que mail/Mail/mailx. Par exemple, mutt . Avec Mutt, vous pouvez fournir la plupart des en-têtes en entrée avec le -H option, mais pas Content-Type , qui doit être défini via une option mutt.

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

Ou vous pouvez appeler directement sendmail. Il existe plusieurs versions de sendmail, mais elles prennent toutes en charge sendmail -t pour envoyer un mail de la manière la plus simple, en lisant la liste des destinataires du mail. (Je pense qu'ils ne supportent pas tous Bcc:.) Sur la plupart des systèmes, sendmail n'est pas dans l'habituel $PATH, c'est dedans /usr/sbin ou /usr/lib.

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

EOF
#!/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
14
Code Improver

Avec le Heirloom mailx, le moyen pratique est

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

Merci, Mec
Testé sur Fedora 17 et travaillé

7
daniel

Vous devrez ajouter Content-Type en-tête de votre e-mail pour que cela se produise.

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

marchera

5
Noufal Ibrahim

Avec heirloom-mailx, vous pouvez changer le programme sendmail en votre script hook, y remplacer les en-têtes et ensuite utiliser sendmail.

Le script que j'utilise (~/bin/sendmail-mailx-hook):

#!/bin/bash

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

Ce script modifie les valeurs de l'en-tête du courrier comme suit:

  • Content-Type: à text/html; charset=utf-8
  • Content-Transfer-Encoding: à 8bit (je ne sais pas si c'est vraiment nécessaire).

Pour envoyer un e-mail HTML:

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

Cette méthode est plus efficace que celle proposée par @Gilles car elle ne crée pas de fichiers temporaires et corrige simplement le flux à la volée.

3
loentar

J'ai utilisé les scripts ci-dessous pour arriver

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

Pour moi, je devais spécifier une variable telle que le serveur SMTP, donc la commande mail a fonctionné de la manière suivante. J'ai cherché dans de nombreux messages et j'ai trouvé la propriété ci-dessous pour convertir le corps en texte/html. Maintenant, l'e-mail que je reçois est au format HTML.

Disposition du contenu: en ligne

Version Unix: Red Hat Enterprise Linux Server version 6.6 (Santiago)

Première. Créez toutes les informations nécessaires dans un 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>"

Seconde. Dirigez ce script vers la commande de messagerie

./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]

En faisant cela, j'obtiens des informations comme ci-dessous dans l'e-mail:

Contenu-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 
 
 Valeur1 Valeur2

Value1 et Value2 selon le balisage HTML effectué dans le testSql.sh

0
Vaibhav

Publié dans un autre fil, mais essentiellement sur notre version de mail/mailx (12.5+), le paramètre -a pour le courrier ne fonctionne plus car il ajoute une pièce jointe et je n'ai trouvé aucun paramètre de remplacement pour les en-têtes supplémentaires, donc le moyen le plus simple pour je devais utiliser sendmail.

Ci-dessous est un simple liner que j'ai créé pour fonctionner dans notre script bash qui fonctionne pour nous. Il passe simplement le Content-Type: text/html, subject, et le corps et fonctionne.

printf "Content-Type: text/html\nSubject: Test Email\nHTML BODY<b>test bold</b>" | sendmail <Email Address To>

Si vous vouliez créer une page HTML entière à partir d'une variable, une méthode alternative que j'ai utilisée dans le script bash était de passer la variable comme ci-dessous.

emailBody="From: <Email Address From>
Subject: Test
Content-Type: text/html; charset=\"us-ascii\"
<html>
<body>
body
<b> test bold</b>

</body>
</html>
"
echo "$emailBody" | sendmail <Email Address To>
0
Miburi