web-dev-qa-db-fra.com

Email HTML de Heirloom MailX sur Linux

J'essaie de travailler en envoyant un courrier électronique HTML de MailX sur un serveur Linux.

Peu de notes:

  • Je dois spécifier un serveur SMTP donc donc je ne peux pas utiliser sendmail (ce n'est pas quelque chose que je peux changer à ma fin)
  • Je ne peux pas installer des choses 3ème partie telles que MutT. Je vais devoir utiliser mail ou mailx
  • Étant donné que ma version mail/x est Heirloom, je n'ai pas le --append ou -a (attacher des options d'en-tête)
  • je ne sais pas si cela aide du tout sauf ma distribution Linux est 7.3 (Maipo)

Ce que j'ai vu dans la plupart des postes sur Stackoverflow pour mon cas:

mailx -v -S smtp=SERVER -s "$(echo -e "This is the subject\nContent-Type: text/html")" -r FROM TO < htmlmail.txt

Cela vient de retourner un e-mail de texte brut dans mon cas.

Voici donc ce que j'ai essayé jusqu'à présent:

Essayez 1:

J'ai vu dans un post pour ajouter une disposition de contenu: en ligne.

mailx -v -S smtp=SERVER -s "$(echo -e "This is the subject v1\nContent-Type: text/html\nMIME-Version: 1.0\nContent-Disposition: inline")" -r FROM TO < htmlmail.txt

Cela finit par l'envoi d'un email HTML, mais car les en-têtes sont inclus en ligne avec le corps, il diffuse en tant que telle:

Contenu-Disposition: Inline Message-ID: User-Agent: Heirloom MailX 12.5 7/5/10 MIME-Version: 1.0 Type de contenu: Texte/Plain; Charset = US-ASCII Content-Transfert-coding: 7 bits Bonjour le monde

Essayez 2:

Donc, je ne veux pas que les en-têtes soient imprimés dans le corps. J'ai donc essayé de supprimer la disposition du contenu: en ligne

mailx -v -S smtp=SERVER -s "$(echo -e "This is the subject v2\nContent-Type: text/html\nMIME-Version: 1.0")" -r FROM TO < htmlmail.txt

Cela finit par envoyer un e-mail de test simple en tant que tel:

<html> <b>Hello World</b> </html>

Essayez 3:

Essayé Flip Flopping Type de contenu et MIME-Version

mailx -v -S SERVER -s "$(echo -e "This is the subject v3\nMIME-Version: 1.0\nContent-Type: text/html")" -r FROM TO < htmlmail.txt

J'ai fini par recevoir aucun email de ce code

Essayez 4:

J'ai vu en ligne pour essayer un autre en-tête pour vous aider à trouver où la question réside. J'ai donc ajouté l'option d'en-tête pour définir la priorité de courrier.

mailx -v -S smtp=SERVER -s "$(echo -e "This is a subject v4\nContent-Type: text/html\nX-Priority: 1 (Highest)")" -r FROM TO < htmlmail.txt

Cela a fini par envoyer un email haut prioritaire mais tout en texte clair.

Essayez 5:

J'ai ajouté sur l'en-tête MIME à l'essai précédent

mailx -v -S smtp=SERVER -s "$(echo -e "This is a subject v5\nMIME-Version: 1.0\nContent-Type: text/html\nX-Priority: 1 (Highest)")" -r FROM TO < htmlmail.txt

Cela a fini par envoyer un email avec des en-têtes dans le corps et la priorité n'est pas réglée à High ... bizarre

X-Priorité: 1 (Le plus élevé) Message-ID: Agent utilisateur: Heirloom MailX 12.5 7/5/10 MIME-Version: 1.0 Type de contenu: Texte/Plain; Charset = US-ASCII Content-Transfert-coding: 7 bits Bonjour le monde

Après tout cela, j'ai essayé de nombreuses autres adaptations des essais ci-dessus, mais ils n'ont conduit à aucune nouvelle production.

Donc, toute suggestion ou idées sont volontiers acceptées! Veuillez garder à l'esprit mes contraintes énumérées ci-dessus ... Je sais qu'ils limitent mes options mais c'est hors de mon contrôle.

merci pour votre temps!

7
Blubaru14

D'abord un contexte: j'utilise la version Heirloom-MailX comme celle du thread suivant: https://serverfault.com/questions/136106/What-Package-a-Install-for-Sentre-mewr -Localhost-Ubunt

J'utilise Ubuntu 16.04 xenial. Essayé également sur Ubuntu Server 16.04.

Pour envoyer des courriels, j'utilise la fonction suivante pour l'envoi de courrier à l'aide de MailX (Heirloom MailX à Bash):

sendmail() {
#Sending Report Email
heirloom-mailx -a $2 -v -s ""$(echo -e "subject 3\nContent-Type: text/html")"" \
-S smtp-use-starttls \
-S ssl-verify=ignore \
-S smtp-auth=login \
-S smtp=smtp://mail.mymailserver:port \
-S from="[email protected]" \
-S [email protected] \
-S smtp-auth-password='password' \
-S ssl-verify=ignore \
$1 < body.html
}

Où 2 $ est la pièce jointe et 1 $ est la destination. Remarques: 1. Les fichiers joints sont imprimés à l'intérieur du corps, mais cela pourrait vous être utile si vous souhaitez simplement envoyer un fichier HTML sans pièces jointes. 2. Utiliser l'option "-v" imprime Verbose afin que vous puissiez avoir un problème avec .mime.types qui peuvent être ignorés. Supprimez l'option si vous ne voulez pas Verbose sur MailX. 3. Vous obtiendrez toujours les éléments suivants dans le corps si vous utilisez l'option "-a": il s'agit d'un message multi-pièces au format MIME. - = - = FFPA7DLQOSF1TGJ-YDC2K8BDVMJPIX_4SKFT = - = Type de contenu: Texte/Plain; Charset = US-ASCII Contenu-Disposition: Inline

Dans ce cas, je joins un fichier texte brut. Supprimer "-A $ 2" de la commande et vous êtes tous définis pour imprimer le message HTML. Donc, le résultat final serait:

sendmail() {
    #Sending Report Email
    heirloom-mailx -s ""$(echo -e "subject 3\nContent-Type: text/html")"" \
    -S smtp-use-starttls \
    -S ssl-verify=ignore \
    -S smtp-auth=login \
    -S smtp=smtp://mail.mymailserver:port \
    -S from="[email protected]" \
    -S [email protected] \
    -S smtp-auth-password='password' \
    -S ssl-verify=ignore \
    $1 < body.html
    }

Essayez-le et laissez-moi savoir. J'ai testé à ma fin et ça marche.

3
Ivo Yordanov

Si vous êtes bloqué sur un serveur sur lequel vous ne pouvez pas installer de nouveaux logiciels, y compris un MTA approprié, peut-être que la solution de contournement la plus simple est d'écrire un script simple dans une langue qui a des bibliothèques pour SMTP incluse. Mon choix serait python. Voici une simple adaptation du code exemple de la documentation.

#!/usr/bin/env python3

import smtplib
from argparse import ArgumentParser
from email.message import EmailMessage


def main():
    parser = ArgumentParser(description="""\
Quick and dirty mailx replacement for sending a HTML message via a
specific SMTP server. Based on examples from
https://docs.python.org/3/library/email.examples.html#email-examples
""")
    parser.add_argument('-H', '--html-file', required=True,
                        help="The HTML body to send (required)")
    parser.add_argument('-S', '--smtp-server', required=True,
                        help='The SMTP server to use (required)')
    parser.add_argument('-s', '--subject', required=True,
                        help='Subject (required)')
    parser.add_argument('-r', '--return-path', required=True,
                        help='Return-Path / envelope sender (required)')
    parser.add_argument('recipients', nargs='+')
    args = parser.parse_args()

    msg = EmailMessage()
    msg['Subject'] = args.subject
    msg['To'] = ', '.join(args.recipients)
    msg['From'] = args.return_path
    # The examples suggest you should mess with the preamble, but you should not

    with open(args.html_file, 'r') as html:
        msg.set_content(html.read(), subtype='html')

    with smtplib.SMTP(args.smtp_server) as s:
        s.send_message(msg)


if __name__ == '__main__':
    main()

Usage:

python3 path/to/script.py -S SERVER -s "This is the subject" \
    -r FROM -H htmlmail.html TO

Cette citation Python version 3. Si vous êtes sur une plate-forme héritée, vous n'avez peut-être que Python 2; mais il devrait être assez évident comment adapter cela ( Utilisez principalement le email.message.Message classe hérité au lieu de la révision et de la modernisation EmailMessage introduite en 3.3 et a fait officiellement en 3.5).

0
tripleee