Comment envoyer un email HTML en utilisant la commande 'mail' de linux?

66

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 un courrier électronique HTML à l'aide de la commande Linux mail?

python
la source

Réponses:

61

Il existe de nombreuses versions différentes mailautour. Lorsque vous allez au-delà mail -s subject to1@address1 to2@address2 <body(pour l’envoi, c’est toutes les garanties POSIX - et -sn’existait même pas à l’ époque ), ils ont généralement des options de ligne de commande différentes. Ajouter un en-tête supplémentaire n'est pas toujours facile.

  • Avec certaines mailximplémentations, par exemple à partir mailutilssur Ubuntu ou Debian debsd-mailx , il est facile, car il y a une option pour cela.

    mailx -a 'Content-Type: text/html' -s "Subject" to@address <test.html
    
  • Avec le Heirloom mailx , il n'y a pas de moyen pratique. Une possibilité d'insérer des en-têtes arbitraires est de définir editheaders=1et d'utiliser 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 POSIXmailx général , je ne sais pas comment accéder aux en-têtes.

Si vous voulez utiliser mailou mailx, gardez à l’esprit que

  • Ce n'est pas portable, même au sein d'une distribution Linux donnée. Par exemple, Ubuntu et Debian proposent plusieurs alternatives pour mailet mailx.
  • Lors de la rédaction d'un message, mailil mailxtraite les lignes commençant par des ~commandes. Si vous faites suivre le texte mail, vous devez vous assurer que ce texte ne contient pas de lignes commençant par ~.

De toute façon, si vous souhaitez installer un logiciel, vous pouvez également 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 de l'entrée avec l' -Hoption, mais pas celle-ciContent-Type , qui doit être définie via une option mutt.

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

Ou vous pouvez invoquer sendmaildirectement. Il existe plusieurs versions de sendmaillà-bas, mais ils prennent tous en charge l' sendmail -tenvoi d'un courrier de la manière la plus simple, en lisant la liste des destinataires à partir du courrier. (Je pense qu'ils ne supportent pas tous Bcc:.) Sur la plupart des systèmes, ce sendmailn'est pas comme d'habitude $PATH, c'est dans /usr/sbinou /usr/lib.

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

EOF
Gilles, arrête de faire le mal
la source
J'ai essayé d'utiliser l'exemple de mutt ci-dessus; substituer de vraies valeurs pour le nom de fichier, adresse email, etc., mais "Aucun destinataire n'a été spécifié" Je suis très nouveau sur mutt, @Gilles savez-vous pourquoi cela aurait pu se produire? (osx mountain lion, mutt 1.5.21 installé via homebrew)
Chuck van der Linden
ma deuxième ligne était "To: [email protected]" (désolée pour le manque de formatage, impossible dans une réponse, le texte réel étant sans guillemets) et j'ai inclus une ligne vierge avant de mettre l'EOF. y a-t-il une configuration que je dois faire pour Mutt? avant d'essayer l'exemple que vous avez donné (avec les valeurs appropriées remplacées), tout ce que je faisais était "brasser installer mutt"
Chuck van der Linden
@ChuckvanderLinden Posez une nouvelle question. Copiez-collez la commande exacte que vous avez exécutée et le message d'erreur complet. Voyez si vous pouvez envoyer un email de Mutt en utilisant l'interface interactive.
Gilles, arrête de faire le mal
J'ai pu envoyer quelque chose via l'interface "interactive", il s'est d'abord plaint d'un répertoire de courrier manquant et m'a proposé de le créer. rappelé à quel point je déteste vim ;-) mais je l’ai envoyé. Je vais commencer une nouvelle question car il est plus facile de formater, etc. Le message d'erreur exact était exactement ce que j'avais dit: "Aucun destinataire n'a été spécifié."
Chuck van der Linden
Nouvelle question 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
Code Improver
la source
5
Cela n'utilise pas réellement mail.
3
@ user16144 Non, mais c'est une alternative intéressante que l'OP pourrait envisager.
trusktr
Oui, il n’utilise pas le courrier, mais cela fonctionne partout où je l’ai essayé, ce qui est plus que ce que je peux dire pour les autres solutions.
user1683793
Fonctionne aussi bien sur Mac.
Asim Jalis
7

Heirloom mailx est un moyen pratique de

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

Merci, Dude
Testé sur Fedora 17, et a travaillé

Daniel
la source
1
Effronté. Je l'aime. : -]
Alastair Irvine
1
Attention, cette solution peut conduire à un courrier électronique contenant à la fois "Content-Type: text / html" et "Content-Type: text / plain", ainsi que d'éventuelles incohérences si vous utilisez cette méthode pour spécifier un jeu de caractères.
Skippy le Grand Gourou
5

Pour ce faire, vous devrez ajouter un en- Content-Typetête à votre courrier électronique.

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

marchera

Noufal Ibrahim
la source
2
mail: option illégale - a
pyth0ner
Avez - vous mailx? Cela pourrait avoir l'option. Si ça ne marche pas. Si cela ne fonctionne pas, vous pouvez envisager d'utiliser mutt bien que je ne sache pas ce que la ligne de commande permet de faire.
Noufal Ibrahim
1
Si le courrier ne coupe pas la moutarde, utilisez python ... docs.python.org/library/email-examples.html .
Sdolgy
Python vous demandera d’écrire (et de maintenir) un script. Une ligne de commande une ligne a des avantages différents.
Noufal Ibrahim Le
J'ai mailx, mais "option -a" ne fonctionne pas, affiche toujours: mail: option illégale - a
pyth0ner
3

Avec heirloom-mailx, vous pouvez remplacer le programme sendmail par votre script de hook, remplacer les en-têtes et 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 dans l'en-tête du courrier comme suit:

  • Content-Type: à text/html; charset=utf-8
  • Content-Transfer-Encoding:à 8bit(pas sûr si cela est vraiment nécessaire).

Pour envoyer un email 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 ne fait que réparer le flux à la volée.

loentar
la source
1

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
Bhabatosh
la source
0

Pour moi, je devais spécifier une variable telle que le serveur SMTP, la commande mail fonctionnait ainsi. J'ai cherché dans de nombreux articles et j'ai trouvé ci-dessous une propriété permettant de convertir le corps en texte / html. Maintenant, l'email que je reçois est au format HTML.

Contenu-Disposition: inline

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. Pipe ce script à la commande 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]

En faisant cela, je reçois les informations ci-dessous dans le courrier électronique:

Content-Disposition: in-line Message-ID: Utilisateur-Agent: Heirloom mailx 12.4 29/07/08 MIME-Version: 1.0 Content-Type: text / plain; jeu de caractères = us-ascii Content-Transfer-Encoding: 7bit

Valeur1 valeur2

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

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

la source
5
Nan. Cela enverra un email texte avec HTML dans le corps.
Noufal Ibrahim