Envoyer du courrier HTML en utilisant un script shell

Comment puis-je envoyer un courriel HTML en utilisant un script shell?

45
demandé sur random 2010-07-23 14:06:35

10 réponses

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 de 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 commande:

body = '...'

echo $body | mail \
-a "From: me@example.com" \
-a "MIME-Version: 1.0" \
-a "Content-Type: text/html" \
-s "This is the subject" \
you@example.com

c'est un exemple trop simplifié, puisque vous devez également prendre soin des jeux de caractères, des encodages, de la longueur de ligne maximale... Mais c'est l'idée de base.

alternativement, vous pouvez écrire votre script en Perl ou en PHP plutôt qu'en shell.

mise à Jour

un script shell est essentiellement un fichier texte avec des fins de ligne Unix qui commence par une ligne appelée shebang qui dit à l'interpréteur de commande à quel interpréteur il doit passer le fichier, suivre certaines commandes dans la langue que l'interpréteur comprend et a la permission d'exécution (dans Unix c'est un attribut de fichier). Par exemple, disons que vous sauvegardez ce qui suit comme hello-world :

#!/bin/sh

echo Hello, world!

puis vous assignez la permission d'exécution:

chmod +x hello-world

Et vous pouvez enfin l'exécuter:

./hello-world

peu importe, c'est un peu sans rapport avec la question originale. Vous devriez vous familiariser avec les scripts shell de base avant de faire des tâches avancées avec elle. Voici quelques liens à propos de bash , un populaire shell:

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

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

56
répondu Álvaro González 2016-06-21 14:04:18

les étiquettes incluent 'sendmail' donc voici une solution en utilisant que:

(
echo "From: me@xyz.com "
echo "To: them@xyz.com "
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

une enveloppe pour sendmail peut faciliter ce travail, par exemple, mutt :

mutt -e 'set content_type="text/html"' me@mydomain.com -s "subject" <  message.html
43
répondu mdma 2013-12-25 15:00:23

Jusqu'à présent, j'ai trouvé deux moyens rapides dans cmd linux

  1. Use courrier de l'ancienne école

mail -s "$(echo -e "This is Subject\nContent-Type: text/html")" test@yahoo.com < mytest.html

  1. Utiliser mutt

mutt -e "my_hdr Content-Type: text/html" test@yahoo.com -s "subject" < mytest.html

37
répondu Kevin Zhu 2012-09-07 04:04:26

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 html et d'inclure un fichier comme le corps du message. Voir le lien pour plus de détails.

2
répondu Matti Pastell 2010-07-28 06:52:27

une autre option est d'utiliser msmtp.

ce dont vous avez besoin est de configurer votre .msmtprc avec quelque chose comme ceci (exemple utilise gmail):

account default
host smtp.gmail.com
port 587
from example@gmail.com
tls on
tls_starttls on
tls_trust_file ~/.certs/equifax.pem
auth on
user example@gmail.com
password <password>
logfile ~/.msmtp.log

alors il suffit d'appeler:

(echo "Subject: <subject>"; echo; echo "<message>") | msmtp <email@domain.tld>

dans votre script

mise à jour: pour le courrier HTML vous devez mettre les en-têtes ainsi, donc vous pourriez vouloir faire un fichier comme ceci:

From: sender@domain.tld
To: email@domain.tld
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 la poster comme

cat email-template | msmtp email@domain.tld

la même chose peut être faite via la ligne de commande, mais il pourrait être plus facile d'utiliser un fichier.

2
répondu Ashaman 2015-10-28 16:34:58

en-tête Mime et de, à l'adresse peut également être inclus dans le fichier html lui-même.

commande

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

cpu_alert.fichier html de l'échantillon.

From: donotreply@example.com
To: admin@example.com
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
répondu sugunan 2015-04-19 04:59:49

heres mine (é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: sender@xxx.com"  << EOF
<html>
<body>
Neues Dokument: <br>
<a href="https://xxx/index.php/apps/files/?dir=/Post">Hier anschauen</a>
</body>
</html>

EOF

pour rendre l'exécutable:

chmod +x sendMailAboutNewDocuments.sh

puis appelez:

./sendMailAboutNewDocuments.sh recipient@xxx.com test.doc
0
répondu fiffy 2018-06-29 13:14:15

en utilisant le mailx par défaut de CentOS 7 (apparaît comme heirloom-mailx), j'ai simplifié ceci en utilisant simplement un fichier texte avec vos en-têtes requis et une limite statique pour multipart/mixed et multipart/alternative setup.

je suis sûr que vous pouvez trouver 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 les segments multipartis.

La frontière ID n'a pas de tirets à la fin est un point de départ d'un segment.

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

dans cet exemple, il y a une sous-partie dans la section multipart/mixed main section, pour multipart/alternative.

la méthode multipart/alternative dit essentiellement "Reply To this, IF the priority part does not succeed" - dans cet exemple HTML est pris comme priorité normalement par les clients de courrier électronique. Si un client de messagerie n'affiche pas le code HTML, il revient à la forme de texte brut.

la méthode multipart / mixed qui encapsule tout ce message, est fondamentalement dire qu'il y a du contenu différent ici, afficher les deux.

dans cet exemple, j'ai placé une pièce jointe de fichier CSV sur le courriel. Vous verrez la pièce jointe se brancher en utilisant base64 dans la commande ci-dessous.

j'ai jeté dans la pièce jointe comme un exemple, vous aurez à définir votre type de contenu adapté à votre pièce jointe et précisez si en ligne ou non.

le x-Attachment-Id est nécessaire pour certains fournisseurs, Randomisez 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 fromaddress@example.com toaddress@example.com

comme vous pouvez le voir dans la ligne D'objet de mailx, j'insère statiquement la frontière multipartite, c'est le premier en-tête que le client de messagerie verra.

vient ensuite le test.le contenu txt est jeté.

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

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

cela fonctionne autour des problèmes heirloom-mailx et est virtuellement sans script.

l'écho peut être une alimentation à la place, ou n'importe quel autre nombre de méthodes.

0
répondu ShawnQ 2018-07-03 14:01:36
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 ensuite:

sendmail -t < mail.txt
0
répondu Mykhaylo Adamovych 2018-07-09 15:30:57

en plus de la réponse correcte de mdma, vous pouvez également utiliser la commande mail comme suit:

mail person@email.com -s"Subject Here" -a"Content-Type: text/html; charset=\"us-ascii\""

, vous obtiendrez ce que vous cherchez. N'oubliez pas de mettre <HTML> et </HTML> dans le courriel. Voici un script rapide que j'utilise pour envoyer un rapport quotidien en HTML:

#!/bin/sh
(cat /path/to/tomorrow.txt mysql -h mysqlserver -u user -pPassword Database -H -e "select statement;" echo "</HTML>") | mail email@email.com -s"Tomorrow's orders as of now" -a"Content-Type: text/html; charset=\"us-ascii\""
-1
répondu Joshua Gruber 2018-08-07 19:46:19