Tôi biết đây là một câu hỏi cũ, nhưng tôi cũng biết rằng một số người cũng giống như tôi và luôn tìm kiếm câu trả lời lạc quan , vì câu trả lời cũ đôi khi có thể bị mất thông tin nếu không được cập nhật.
Bây giờ là tháng 1 năm 2020 và tôi đang sử dụng Django 2.2.6 và Python 3.7
Lưu ý: Tôi sử dụng DJANGO REST FRAMEWORK , mã bên dưới để gửi email nằm trong chế độ xem mô hình trong tôiviews.py
Vì vậy, sau khi đọc nhiều câu trả lời hay, đây là những gì tôi đã làm.
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)
Quan trọng! Vậy làm thế nào để render_to_string
có được receipt_email.txt
và receipt_email.html
? Trong tôi settings.py
, tôi có TEMPLATES
và bên dưới là nó trông như thế nào
Hãy chú ý DIRS
, có dòng os.path.join(BASE_DIR, 'templates', 'email_templates')
này. Dòng này là những gì làm cho mẫu của tôi có thể truy cập được. Trong project_dir của tôi, tôi có một thư mục được gọi templates
và thư mục con được gọi email_templates
như thế này project_dir->templates->email_templates
. Mẫu của tôi receipt_email.txt
và receipt_email.html
nằm dưới thư mục email_templates
con.
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',
],
},
},
]
Hãy để tôi thêm rằng, recept_email.txt
trông tôi như thế này;
Dear {{name}},
Here is the text version of the email from template
Và, receipt_email.html
ngoại hình của tôi như thế này;
Dear {{name}},
<h1>Now here is the html version of the email from the template</h1>
1.7
cung cấphtml_message
trongsend_email
stackoverflow.com/a/28476681/953553