Je sais que c'est une vieille question, mais je sais aussi que certaines personnes sont comme moi et recherchent toujours des réponses actualisées, car les anciennes réponses peuvent parfois avoir des informations obsolètes si elles ne sont pas mises à jour.
C'est maintenant janvier 2020, et j'utilise Django 2.2.6 et Python 3.7
Remarque: J'utilise DJANGO REST FRAMEWORK , le code ci-dessous pour envoyer des e-mails était dans un ensemble de vues de modèle dans monviews.py
Donc, après avoir lu plusieurs belles réponses, c'est ce que j'ai fait.
from django.template.loader import render_to_string
from django.core.mail import EmailMultiAlternatives
def send_receipt_to_email(self, request):
emailSubject = "Subject"
emailOfSender = "email@domain.com"
emailOfRecipient = 'xyz@domain.com'
context = ({"name": "Gilbert"}) #Note I used a normal tuple instead of Context({"username": "Gilbert"}) because Context is deprecated. When I used Context, I got an error > TypeError: context must be a dict rather than Context
text_content = render_to_string('receipt_email.txt', context, request=request)
html_content = render_to_string('receipt_email.html', context, request=request)
try:
#I used EmailMultiAlternatives because I wanted to send both text and html
emailMessage = EmailMultiAlternatives(subject=emailSubject, body=text_content, from_email=emailOfSender, to=[emailOfRecipient,], reply_to=[emailOfSender,])
emailMessage.attach_alternative(html_content, "text/html")
emailMessage.send(fail_silently=False)
except SMTPException as e:
print('There was an error sending an email: ', e)
error = {'message': ",".join(e.args) if len(e.args) > 0 else 'Unknown Error'}
raise serializers.ValidationError(error)
Important! Alors, comment render_to_stringobtient-on receipt_email.txtet receipt_email.html? Dans mon settings.py, j'ai TEMPLATESet voici à quoi ça ressemble
Faites attention à DIRS, il y a cette ligne os.path.join(BASE_DIR, 'templates', 'email_templates')
.Cette ligne est ce qui rend mes modèles accessibles. Dans mon project_dir, j'ai un dossier appelé templateset un sous-répertoire appelé email_templatescomme ça project_dir->templates->email_templates. Mes modèles receipt_email.txtet receipt_email.htmlsont sous le sous- email_templatesrépertoire.
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates'), os.path.join(BASE_DIR, 'templates', 'email_templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
Permettez-moi d'ajouter cela, mon recept_email.txtapparence ressemble à ceci;
Dear {{name}},
Here is the text version of the email from template
Et, mon receipt_email.htmlressemble à ceci;
Dear {{name}},
<h1>Now here is the html version of the email from the template</h1>
1.7offreshtml_messageàsend_emailstackoverflow.com/a/28476681/953553