web-dev-qa-db-fra.com

Mailx envoyer un message html

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 ...

19
user3580716

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
20
dogbane

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
11
Wakaru44

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.

5
Mark Grimes