web-dev-qa-db-fra.com

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

Comment puis-je envoyer un email HTML en utilisant un script Shell?

46
Tree

Vous devez d’abord composer le message. Le strict minimum est composé de ces deux en-têtes:

MIME-Version: 1.0
Content-Type: text/html

... et le corps du message approprié:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><title></title>
</head>
<body>

<p>Hello, world!</p>

</body>
</html>

Une fois que vous l'avez, vous pouvez transmettre les informations appropriées à la commande mail :

body = '...'

echo $body | mail \
-a "From: [email protected]" \
-a "MIME-Version: 1.0" \
-a "Content-Type: text/html" \
-s "This is the subject" \
[email protected]

Ceci est un exemple trop simplifié, car vous devez également vous occuper des jeux de caractères, des encodages, de la longueur de ligne maximale ... Mais c'est fondamentalement l'idée.

Sinon, vous pouvez écrire votre script en Perl ou PHP plutôt que dans un shell.

Mettre à jour

Un script Shell est essentiellement un fichier texte avec des fins de ligne Unix commençant par une ligne appelée Shebang qui indique au shell à quel interpréteur il doit transmettre le fichier, suit certaines commandes dans la langue qu'il comprend et possède les droits d'exécution sous Unix, c’est un attribut de fichier). Par exemple, supposons que vous sauvegardiez ce qui suit en tant que hello-world:

#!/bin/sh

echo Hello, world!

Ensuite, vous attribuez une autorisation d'exécution:

chmod +x hello-world

Et vous pouvez enfin l'exécuter:

./hello-world

Quoi qu'il en soit, cela n'a aucun rapport avec la question initiale. Vous devez vous familiariser avec les scripts Shell de base avant d’effectuer des tâches avancées. Voici quelques liens sur bash, un shell populaire:

http://www.gnu.org/software/bash/manual/html_node/index.html

http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html

57
Álvaro González

Les tags incluent 'sendmail' alors voici une solution utilisant ceci:

(
echo "From: [email protected] "
echo "To: [email protected] "
echo "MIME-Version: 1.0"
echo "Content-Type: multipart/alternative; " 
echo ' boundary="some.unique.value.ABC123/server.xyz.com"' 
echo "Subject: Test HTML e-mail." 
echo "" 
echo "This is a MIME-encapsulated message" 
echo "" 
echo "--some.unique.value.ABC123/server.xyz.com" 
echo "Content-Type: text/html" 
echo "" 
echo "<html> 
<head>
<title>HTML E-mail</title>
</head>
<body>
<a href='http://www.google.com'>Click Here</a>
</body>
</html>"
echo "------some.unique.value.ABC123/server.xyz.com--"
) | sendmail -t

Un wrapper pour sendmail peut faciliter ce travail, par exemple, mutt :

mutt -e 'set content_type="text/html"' [email protected] -s "subject" <  message.html
44
mdma

Une autre option utilise msmtp.

Ce dont vous avez besoin est de configurer votre .msmtprc avec quelque chose comme ceci (par exemple, utilisez gmail):

account default
Host smtp.gmail.com
port 587
from [email protected]
tls on
tls_starttls on
tls_trust_file ~/.certs/equifax.pem
auth on
user [email protected]
password <password>
logfile ~/.msmtp.log

Alors appelez juste:

(echo "Subject: <subject>"; echo; echo "<message>") | msmtp <[email protected]>

dans votre script

Mise à jour: pour le courrier HTML, vous devez également mettre les en-têtes, vous pouvez donc créer un fichier comme celui-ci:

From: [email protected]
To: [email protected]
Subject: Important message
Mime-Version: 1.0
Content-Type: text/html

<h1>Mail body will be here</h1>
The mail body <b>should</b> start after one blank line from the header.

Et le poster comme

cat email-template | msmtp [email protected]

La même chose peut aussi être faite via la ligne de commande, mais cela peut être plus facile avec un fichier.

2
Ashaman

Une autre option est le script sendEmail http://caspian.dotconf.net/menu/Software/SendEmail/ , il vous permet également de définir le type de message en tant que html et d'inclure un fichier comme corps du message. Voir le lien pour plus de détails.

2
Matti Pastell

Les en-têtes MIME et from, to address peuvent également être inclus dans le fichier html lui-même.

Commander

cat cpu_alert.html | /usr/lib/sendmail -t

exemple de fichier cpu_alert.html.

From: [email protected]
To: [email protected]
Subject: CPU utilization heigh
Mime-Version: 1.0
Content-Type: text/html

<h1>Mail body will be here</h1>
The mail body should start after one blank line from the header.

Exemple de code disponible ici: http://sugunan.net/git/slides/Shell/cpu.php

0
sugunan
cat > mail.txt <<EOL
To: <email>
Subject: <subject>
Content-Type: text/html

<html>
$(cat <report-table-*.html>)
This report in <a href="<url>">SVN</a>
</html>

EOL

Et alors: 

sendmail -t < mail.txt
0
Mykhaylo Adamovych

En utilisant le mailx par défaut de CentOS 7 (il s’agit de heirloom-mailx), j’ai simplifié cela en utilisant simplement un fichier texte avec les en-têtes requis et une limite statique pour une configuration multipart/mixte et multipart/alternative.

Je suis sûr que vous pouvez comprendre multipart/related si vous voulez avec la même configuration.

test.txt:

--000000000000f3b2150570186a0e
Content-Type: multipart/alternative; boundary="000000000000f3b2130570186a0c"

--000000000000f3b2130570186a0c
Content-Type: text/plain; charset="UTF-8"

This is my plain text stuff here, in case the email client does not support HTML or is blocking it purposely

My Link Here <http://www.example.com>

--000000000000f3b2130570186a0c
Content-Type: text/html; charset="UTF-8"

<div dir="ltr">
<div>This is my HTML version of the email</div>
<div><br></div>
<div><a href="http://www.example.com">My Link Here</a><br></div>
</div>

--000000000000f3b2130570186a0c--
--000000000000f3b2150570186a0e
Content-Type: text/csv; charset="US-ASCII"; name="test.csv"
Content-Disposition: attachment; filename="test.csv"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_jj5qmzqz0

Les limites définissent des segments en plusieurs parties.

L'identifiant de limite sans tiret à la fin est le point de départ d'un segment.

Celui avec les deux tirets à la fin est le point final. 

Dans cet exemple, il existe une sous-partie dans la section principale multipart/mixed, pour multipart/alternative. 

La méthode multipart/alternative indique essentiellement "Retourner à ceci, SI la partie prioritaire n'aboutit pas" - dans cet exemple, HTML est normalement pris en priorité par les clients de messagerie. Si un client de messagerie n’affiche pas le code HTML, il revient au texte brut.

La méthode multipart/mixed qui encapsule tout le message, dit fondamentalement qu'il y a un contenu différent ici, affiche les deux. 

Dans cet exemple, j'ai placé une pièce jointe au format CSV sur l'e-mail. Vous verrez la pièce jointe se connecter à l'aide de base64 dans la commande ci-dessous.

J'ai jeté la pièce jointe à titre d'exemple, vous devrez définir votre type de contenu de manière appropriée pour votre pièce jointe et spécifier s'il est en ligne ou non. 

Le X-Attachment-Id est nécessaire pour certains fournisseurs. Choisissez l'ID que vous avez défini.

La commande pour envoyer ceci est:

echo -e "`cat test.txt; openssl base64 -e < test.csv`\n--000000000000f3b2150570186a0e--\n" | mailx -s "Test 2 $( echo -e "\nContent-Type: multipart/mixed; boundary=\"000000000000f3b2150570186a0e\"" )" -r [email protected] [email protected]

Comme vous pouvez le voir dans la ligne Subject de mailx, lorsque j'insère la limite en plusieurs parties de manière statique, il s'agit du premier en-tête visible par le client de messagerie.

Vient ensuite le contenu de test.txt en cours de vidage.

En ce qui concerne la pièce jointe, j'utilise openssl (ce qui est assez standard sur les systèmes) pour convertir le fichier en pièce jointe en base64. 

De plus, j'ai ajouté la déclaration de fin de frontière à la fin de cet écho, pour indiquer la fin du message.

Cela fonctionne autour des problèmes heirloom-mailx et est pratiquement sans script. 

L'écho peut être un flux à la place, ou n'importe quel autre nombre de méthodes. 

0
Shawn Q

Le mien Heres (étant donné que "mail" est configuré correctement):

scanuser @ owncloud: ~ $ vi sendMailAboutNewDocuments.sh

mail -s "You have new mail" -a "Content-type: text/html" -a "From: [email protected]" $1 << EOF
<html>
<body>
Neues Dokument: $2<br>
<a href="https://xxx/index.php/apps/files/?dir=/Post">Hier anschauen</a>
</body>
</html>

EOF

pour rendre exécutable:

chmod +x sendMailAboutNewDocuments.sh

puis appelez:

./sendMailAboutNewDocuments.sh [email protected] test.doc
0
fiffy