web-dev-qa-db-fra.com

Comment envoyer un email HTML en utilisant la ligne de commande linux

Je dois envoyer un email au format HTML. Je n'ai que la ligne de commande linux et la commande "mail".

Actuellement ont utilisé:

echo "To: [email protected]" > /var/www/report.csv
echo "Subject: Subject" >> /var/www/report.csv
echo "Content-Type: text/html; charset=\"us-ascii\"" >> /var/www/report.csv

echo "<html>" >> /var/www/report.csv
mysql -u ***** -p***** -H -e "select * from users LIMIT 20" dev >> /var/www/report.csv
echo "</html>" >> /var/www/report.csv

mail -s "Built notification" [email protected] < /var/www/report.csv

Mais dans mon agent de messagerie, je ne reçois que du texte en clair.

alt text

57
Oleh Herych

Cela a fonctionné pour moi:

echo "<b>HTML Message goes here</b>" | mail -s "$(echo -e "This is the subject\nContent-Type: text/html")" [email protected]
49
Dude

Ma version de mail n'a pas --append et trop intelligent pour le echo -e \n _ astuce (elle remplace simplement\n par de l’espace). Il a cependant -a:

mail -a "Content-type: text/html" -s "Built notification" [email protected] < /var/www/report.html
42
Ole Tange

Créez un fichier appelé tmp.html et mettez-y la ligne suivante:

<b>my bold message</b>

Ensuite, collez tout cela dans la ligne de commande: (avec la parenthèse et tout).

(
  echo To: [email protected]
  echo From: [email protected]
  echo "Content-Type: text/html; "
  echo Subject: a logfile
  echo
  cat tmp.html
) | sendmail -t

Le courrier sera envoyé. Et le message est apparu comme gras au lieu de avec le <b> Mots clés.

La source:
Comment envoyer un email en HTML avec la commande bash "sendmail"?

26
Eric Leschinski

Le problème est que lorsque vous redirigez un fichier dans un "courrier" comme celui-ci, il est utilisé uniquement pour le corps du message. Tous les en-têtes que vous intégrez dans le fichier iront dans le corps.

Essayer:

mail --append="Content-type: text/html" -s "Built notification" [email protected] < /var/www/report.csv

--append vous permet d'ajouter des en-têtes arbitraires au courrier, où vous devez spécifier le type de contenu et la disposition du contenu. Il n'est pas nécessaire d'incorporer les en-têtes To et Subject dans votre fichier, ni de les spécifier avec --append, car vous les configurez implicitement sur la ligne de commande (-s est l'objet et [email protected] devient automatiquement le To).

8
Marc B

Sur OS X (10.9.4), cat fonctionne et est plus facile si votre email est déjà dans un fichier:

cat email_template.html  | mail -s "$(echo -e "Test\nContent-Type: text/html")" [email protected]
7
jamesnotjim

Avec heirloom-mailx, vous pouvez remplacer le programme sendmail par votre script de raccordement, remplacer les en-têtes et utiliser sendmail.

Le script que j'utilise (~/bin/sendmail-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 _ (je ne sais pas si c'est vraiment nécessaire).

Pour envoyer un email HTML:

mail -Ssendmail='~/bin/sendmail-hook' \
    -s "Built notification" [email protected] < /var/www/report.csv
3
loentar

Très vieille question, cependant elle s'est classée haut lorsque j'ai cherché dans Google une question à ce sujet.

Trouvez la réponse ici:

Envoi de courrier HTML à l'aide d'un script Shell

2
Magge

vous devriez utiliser la redirection de mode "append" >> au lieu de >

2
ghostdog74

J'ai trouvé une solution très simple: ajoutez à la commande mail le modificateur -aContent-Type: text/html.

Dans votre cas serait:

mail -aContent-Type:text/html -s "Built notification" [email protected] < /var/www/report.csv
2
Muc

Essayez avec:

echo "To: [email protected]" > /var/www/report.csv
echo "Subject: Subject" >> /var/www/report.csv
echo "MIME-Version: 1.0" >> /var/www/report.csv
echo "Content-Type: text/html; charset=\"us-ascii\"" >> /var/www/report.csv
echo "Content-Disposition: inline" >> /var/www/report.csv

echo "<html>" >> /var/www/report.csv
mysql -u ***** -p***** -H -e "select * from users LIMIT 20" dev >> /var/www/report.csv
echo "</html>" >> /var/www/report.csv

mail -s "Built notification" [email protected] < /var/www/report.csv
1

Je me débattais avec un problème similaire (avec le courrier) dans l’un des hooks post_receive de mon git et, finalement, j’ai découvert que sendmail fonctionne mieux pour ce genre de choses, surtout si vous connaissez un peu la manière dont les e-mails sont construits. on dirait que tu sais). Je sais que cette réponse arrive très tard, mais elle sera peut-être utile à d’autres également. J'ai utilisé l'opérateur heredoc et l'utilisation de la fonctionnalité, qui étend les variables, de sorte qu'elle puisse également exécuter des scripts intégrés. Il suffit de vérifier ceci (script bash):

#!/bin/bash
recipients=(
    '[email protected]'
    '[email protected]'
#   '[email protected]'
);
sender='[email protected]';
subject='Oh, who really cares, seriously...';
sendmail -t <<-MAIL
    From: ${sender}
    `for r in "${recipients[@]}"; do echo "To: ${r}"; done;`
    Subject: ${subject}
    Content-Type: text/html; charset=UTF-8

    <html><head><meta charset="UTF-8"/></head>
    <body><p>Ladies and gents, here comes the report!</p>
    <pre>`mysql -u ***** -p***** -H -e "SELECT * FROM users LIMIT 20"`</pre>
    </body></html>
MAIL

Note des backticks dans la partie MAIL pour générer une sortie et se rappeler que <<- l'opérateur ne supprime que les tabulations (et non les espaces) depuis le début des lignes. Dans ce cas, le copier-coller ne fonctionnera pas (vous devez remplacer l'indentation par des tabulations appropriées). Ou utiliser << opérateur et ne faites aucune empreinte du tout. J'espère que cela aidera quelqu'un. Bien sûr, vous pouvez utiliser des cueillettes en dehors de la partie MAIL et enregistrer la sortie dans une variable que vous pourrez utiliser ultérieurement dans la partie MAIL - pour des raisons de goût et de lisibilité. Et je sais, #!/bin/bash ne fonctionne pas toujours sur tous les systèmes.

1
Cromax