2010-04-07 2 views
48

Je dois envoyer un e-mail au format html. Je n'ai que la ligne de commande linux et la commande "mail".Comment envoyer un e-mail HTML à l'aide de la ligne de commande linux

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 courrier agent que je reçois seulement clair/texte.

alt text

+0

Les lecteurs de réponses à cette question méfiez-vous: il existe plusieurs programmes différents appelés 'mail', par exemple' Heirloom-mailx' et 'bsd-mailx' sur Debian jessie . Si une commande 'mail' d'une réponse ne fonctionne pas pour vous, vous utilisez probablement le mauvais' mail'. Reportez-vous au gestionnaire de packages de votre distribution pour installer le package correct et utilisez le nom spécifique de ce binaire (par exemple 'bsd-mailx' sur Debian) pour résoudre ce problème. Plus de détails sur ceci ici: http://heirloom.sourceforge.net/mailx_history.html –

Répondre

1

vous devez utiliser la redirection de mode "ajouter" >> au lieu de >

+0

désolé, ceci est vieux code. Je l'ai réparé. –

+8

Je pense que cela aurait dû être un commentaire, pas une réponse. –

2

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 
+0

Cela ne fonctionne pas. $ lsb_release -a ID Distributeur: \t Ubuntu Description: \t Ubuntu 10.04.4 LTS sortie: \t 10,04 Codename: \t lucide – lrkwz

+0

@Simone, cela ne fonctionne pas parfaitement en raison de l'ordre de ** MIME-Version * * et ** Content-Tye **. Vous devez mettre cette information avant ** Subject ** pour travailler pour la plupart des saveurs unix/linux. –

5

Le problème est que lors de la redirection d'un fichier dans 'courrier' comme ça, 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 à la place.

Essayez:

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 à la poste, ce qui est l'endroit où vous devez spécifier le type de contenu et de disposition de contenu. Il n'est pas nécessaire d'intégrer les en-têtes To et Subject dans votre fichier, ou de les spécifier avec --append, puisque vous les avez déjà implicitement configurés sur la ligne de commande (-s est le sujet, et [email protected] devient automatiquement le To).

+1

n'ont pas cette option sur ma commande de courrier mail: option non valide - un Utilisation: mail [-iInv] [-s sujet] [-c cc-addr] [-b bcc-addr] à-addr .. [- options sendmail ...] mail [-iInNv] -f [nom] mail [-iInNv] [-u utilisateur] –

+0

Moi non plus, quelle version/unix supporte cette option? – nylund

+0

@nylund: 'mail (GNU Mailutils 2.2)'. ceci est hors d'Ubuntu 12.04, mais sera également dans les versions plus anciennes, étant donné que cette réponse a presque 3 ans maintenant. –

45

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] 
+5

ne fonctionne pas pour moi ... solutions plus propres ci-dessous – ftravers

+0

travaillé sur OS X 10.8.4 – jobwat

+0

Je dirais que c'est un bogue dans l'implémentation du courrier d'OSX, même si elle doit être combinée avec d'autres bogues pour être exploitable. Je suis sûr qu'il y aurait quelques scripts Web qui ne vérifient pas correctement les retours chariot dans ce qu'ils insèrent dans les lignes d'objet. – mc0e

35

Ma version du courrier n'a pas --append et trop intelligent pour le echo -e \n -trick (il remplace simplement \ n avec l'espace). Il, cependant, ont -a:

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

Travaux sur ubuntu 14.04.1 LTS, courrier à bsd-ensemble mailx – kidmose

+0

J'utilise de cette façon 'echo \' curl -L www.google.es \ '| mail -a "Content-type: texte/html" -s "contenu du site" email @ email.com "au lieu de" <". Pour ma commodité, je crée un script/usr/local/bin pour contourner la majeure partie de la commande. Je viens d'utiliser 'email wmail url' – erm3nda

16

Faire un fichier appelé tmp.html et mettre la ligne suivante dans le:

<b>my bold message</b> 

coller ensuite 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 expédié. Et le message est apparu en gras au lieu de avec les balises <b>.

Source:
How to send a html email with the bash command "sendmail"?

4

Sur OS X (10.9.4), cat œuvres et est plus facile si votre e-mail est déjà dans un fichier:

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

travail trouver dans le serveur debian –

2

Avec Heirloom-mailx vous pouvez changer de programme sendmail à votre script de crochet, remplacer les en-têtes là-bas et puis utilisez 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 [email protected] 

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

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

pour envoyer un courriel HTML:

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

Pour une raison quelconque, je ne peux pas obtenir ce pour travailler dans une fonction, mais vous pouvez en effet utiliser cela comme un fichier exécutable distinct. Cela a fonctionné quand d'autres suggestions sur cette page n'ont pas. – bgStack15

+0

Vous ne pouvez pas obtenir ce travail en tant que fonction car le processus de courrier engendré n'a pas accès aux fonctions de votre script bash – loentar

+0

[Impossible de comprendre comment utiliser cette fonction pour un chat ou un MP.] Puis-je utiliser ma commande mail? ? '. mail -Ssendmail = '~/bin/sendmail-hook' -s "Sujet" [email protected] bgStack15

0

je luttais avec le même problème (avec messagerie) dans l'un des crochets post_receive de mon git et enfin j'ai découvert que sendmail fonctionne mieux pour ce genre de choses, surtout si vous savez un peu comment les e-mails sont construits (et il semble que vous le sachiez). Je sais que cette réponse arrive très tard, mais peut-être qu'elle sera utile aux autres aussi. J'ai fait usage de l'opérateur heredoc et de l'utilisation de la fonctionnalité, qu'il développe des variables, de sorte qu'il peut également exécuter des scripts en ligne. Il suffit de vérifier cela (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 de backticks dans la partie MAIL pour générer une sortie et rappelez-vous que <<- bandes opérateur uniquement les onglets (et non des espaces) depuis le début de lignes, donc dans ce cas copier-coller ne fonctionnera pas (vous devez remplacer l'indentation par des onglets appropriés). Ou utilisez l'opérateur << et ne faites aucune indentation. J'espère que cela aidera quelqu'un. Bien sûr, vous pouvez utiliser des guillemets en dehors de la partie MAIL et enregistrer la sortie dans une variable, que vous pouvez ensuite utiliser dans la partie MAIL - question de goût et de lisibilité. Et je sais, #!/bin/bash ne fonctionne pas toujours sur tous les systèmes.

0

J'ai trouvé une solution très simple: ajouter à 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 
Questions connexes