Générer un fichier eml avec django

Il est possible de générer un fichier .eml en django: cela peut être utile si l’on souhaite créer des templates d’email à ouvrir un client mail afin de les envoyer manuellement.

On va utiliser la classe EmailMessage de from django.core.mail.

  email_msg = EmailMessage(...)
  email_msg.content_subtype = "html" # si on souhaite envoyer un email au format html

Pour ne pas avoir des problèmes de caractères (rencontré surtout avec Outlook), on doit modifier l’instance de Policy de l’e-mail. Par défaut j’ai remarqué que email.policy.Compat32 était utilisé (car une instance de email.mime.text.MIMEText est créée), on va le changer.

On récupère l’instance

  msg = email_msg.message()
  with open(filepath, "w") as f:
      gen = generator.Generator(f, policy=policy.SMTP)
      gen.flatten(msg)

Reste à renvoyer le fichier à l’utilisateur. Pour avoir un exemple concret, plaçons tout le code dans une requête de type fonction.

  def gen_email(request):
      filename = "email.eml"
      email_msg = EmailMessage(
          subject="Le sujet...",
          body="Le corps de l'email...",
          from_email="from@example.com",
          to=["to@example.com"],
          headers={"X-Unsent": "1"},
      )
      email_msg.content_subtype = "html"

      _, path = mkstemp(filename)

      msg = email_msg.message()

      with open(path, "w") as f:
          gen = generator.Generator(f, policy=policy.SMTP)
          gen.flatten(msg)

      return FileResponse(open(path, "rb"), as_attachment=True, filename=filename)