Je veux envoyer un message html avec Mailx. Lorsque j'essaie la commande suivante
mailx -s "Subject" [email protected] < email.html
J'obtiens le contenu de email.html en texte brut. Dans le message, l'en-tête Content-Type est défini sur text/plain. L'option -a essaie d'envoyer un fichier, donc je n'ai pas trouvé comment modifier l'en-tête. Cette réponse a presque fonctionné, elle définit bien le Content-Type sur text/html mais ne remplace pas le Content-Type par défaut qui est text/plain.
mailx -s "$(echo -e "This is the subject\nContent-Type: text/html")" [email protected] < email.html
donne ce résultat:
From: [email protected]
To: [email protected]
Subject: This is the subject
Content-Type: text/html
Message-ID: <538d7b66.Xs0x9HsxnJKUFWuI%[email protected]>
User-Agent: Heirloom mailx 12.4 7/29/08
MIME-Version: 1.0
boundary="=_538d7b66.z5gaIQnlwb1f/AOkuuC+GwF1evCaG/XIHQMbMMxbY6satTjK"
This is a multi-part message in MIME format.
--=_538d7b66.z5gaIQnlwb1f/AOkuuC+GwF1evCaG/XIHQMbMMxbY6satTjK
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
<html>
<body>
<p>Helo wolrd</p>
</body>
</html>
PS: j'ai aussi essayé avec uuencode. Lorsque j'essaie d'afficher le message dans le webmail, j'obtiens une page vierge ...
C'est simple, si votre commande mailx
prend en charge -a
(ajouter un en-tête):
$ mailx -a 'Content-Type: text/html' -s "my subject" [email protected] < email.html
Si ce n'est pas le cas, essayez d'utiliser sendmail
:
# create a header file
$ cat mailheader
To: [email protected]
Subject: my subject
Content-Type: text/html
# send
$ cat mailheader email.html | sendmail -t
Il existe de nombreuses versions différentes du courrier. Lorsque vous allez au-delà des e-mails soumis à1 @ adresse1 à2 @ adresse2
Avec certaines implémentations mailx, par exemple depuis mailutils sur Ubuntu ou bsd-mailx de Debian, c'est facile, car il y a une option pour cela.
mailx -a 'Content-Type: text/html' -s "Subject" to@address <test.html
Avec le mailirl Heirloom, il n'y a aucun moyen pratique. Une possibilité d'insérer des en-têtes arbitraires consiste à définir editheaders = 1 et à 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 mailx POSIX général, je ne sais pas comment accéder aux en-têtes.
Si vous allez utiliser du courrier ou mailx, n'oubliez pas que
Ce n'est pas portable même dans une distribution Linux donnée. Par exemple, Ubuntu et Debian ont plusieurs alternatives pour mail et mailx.
Lors de la rédaction d'un message, mail et mailx traitent les lignes commençant par ~ en tant que commandes. Si vous canalisez du texte dans le courrier, vous devez faire en sorte que ce texte ne contienne pas de lignes commençant par ~.
Si vous souhaitez installer un logiciel de toute façon, vous pourriez tout aussi bien 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 en entrée avec l'option -H, mais pas Content-Type, qui doit être défini via une option mutt.
mutt -e 'set content_type=text/html' -s 'hello' 'to@address' <test.html
Ou vous pouvez appeler directement sendmail. Il existe plusieurs versions de sendmail, mais elles prennent toutes en charge sendmail -t pour envoyer un courrier de la manière la plus simple, en lisant la liste des destinataires du courrier. (Je pense qu'ils ne supportent pas tous Bcc :.) Sur la plupart des systèmes, sendmail n'est pas dans le $ PATH habituel, il est dans/usr/sbin ou/usr/lib.
cat <<'EOF' - test.html | /usr/sbin/sendmail -t
To: to@address
Subject: hello
Content-Type: text/html
EOF
J'avais utilisé avec succès les éléments suivants sur Arch Linux (où le -a
le drapeau est utilisé pour les pièces jointes) pendant plusieurs années:
mailx -s "The Subject $( echo -e "\nContent-Type: text/html" [email protected] < email.html
Cela a ajouté l'en-tête Content-Type à l'en-tête du sujet, ce qui fonctionnait très bien jusqu'à une récente mise à jour. Maintenant, la nouvelle ligne est filtrée hors du -s
sujet. Vraisemblablement, cela a été fait pour améliorer la sécurité.
Au lieu de compter sur le piratage de la ligne d'objet, j'utilise maintenant un sous-shell bash:
(
echo -e "Content-Type: text/html\n"
cat mail.html
) | mail -s "The Subject" -t [email protected]
Et comme nous n'utilisons vraiment que l'indicateur de sujet de mailx
, il semble qu'il n'y ait aucune raison de ne pas passer à sendmail
comme suggéré par @dogbane:
(
echo "To: [email protected]"
echo "Subject: The Subject"
echo "Content-Type: text/html"
echo
cat mail.html
) | sendmail -t
L'utilisation de sous-coquilles bash évite d'avoir à créer un fichier temporaire.