Sèkun blog

Générer un fichier eml avec django

Sekun 15/04/2021, 13:15:00

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)