Django के साथ ईमेल टेम्पलेट बनाना


206

मैं इस तरह से Django टेम्प्लेट का उपयोग करके HTML-ईमेल भेजना चाहता हूं:

<html>
<body>
hello <strong>{{username}}</strong>
your account activated.
<img src="mysite.com/logo.gif" />
</body>

मुझे send_mailडायनेमिक डेटा के बिना केवल HTML टेम्पलेट भेजने वाले django-mailer के बारे में और कुछ भी नहीं मिल रहा है ।

मैं ई-मेल उत्पन्न करने के लिए Django के टेम्पलेट इंजन का उपयोग कैसे करूं?


3
नोटिस Django stackoverflow.com/a/28476681/953553 में 1.7प्रदान करता html_messageहैsend_email
andilabs

हाय @anakin, मैं लंबे समय से इस समस्या से जूझ रहा हूं और उसके लिए एक पैकेज बनाने का फैसला किया है। : मैं आपकी प्रतिक्रिया प्राप्त करने के लिए बहुत खुशी होगी github.com/charlesthk/django-simple-mail
Charlesthk

जवाबों:


385

से डॉक्स , भेजने के लिए HTML ई-मेल आप वैकल्पिक सामग्री-प्रकार, इस तरह उपयोग करना चाहते हैं:

from django.core.mail import EmailMultiAlternatives

subject, from_email, to = 'hello', 'from@example.com', 'to@example.com'
text_content = 'This is an important message.'
html_content = '<p>This is an <strong>important</strong> message.</p>'
msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
msg.attach_alternative(html_content, "text/html")
msg.send()

आप शायद अपने ई-मेल के लिए दो टेम्प्लेट चाहते हैं - एक सादा पाठ जो कुछ इस तरह दिखता है, जो आपके टेम्प्लेट डायरेक्टरी में संग्रहीत है email.txt:

Hello {{ username }} - your account is activated.

और HTMLy एक, के तहत संग्रहीत email.html:

Hello <strong>{{ username }}</strong> - your account is activated.

फिर आप get_templateइस तरह का उपयोग करके उन दोनों टेम्प्लेट का उपयोग करके एक ई-मेल भेज सकते हैं :

from django.core.mail import EmailMultiAlternatives
from django.template.loader import get_template
from django.template import Context

plaintext = get_template('email.txt')
htmly     = get_template('email.html')

d = Context({ 'username': username })

subject, from_email, to = 'hello', 'from@example.com', 'to@example.com'
text_content = plaintext.render(d)
html_content = htmly.render(d)
msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
msg.attach_alternative(html_content, "text/html")
msg.send()

40
मुझे लगता है कि आप के साथ इस सरल बना सकते हैं render_to_string , जो आप अलग-अलग पंक्तियों को बताए टेम्पलेट्स खो दिया जाएगा plaintextऔर htmly, और जब आप को परिभाषित सिर्फ सेट टेम्पलेट्स और संदर्भों text_contentऔर html_content
cms_mgr

@cms_mgr क्या आप विस्तार से बता सकते हैं कि आप क्या कहना चाहते हैं और हम इसका कैसे उपयोग कर सकते हैं
akki

3
@akki देखें andi का उत्तर नीचे दिया गया है, जो html_message param के लिए वैकल्पिक भाग को सरल बनाता है, जोकि Django 1.7 में send_email () में जोड़ा जा रहा है
माइक एस

मुझे क्षमा करें लेकिन हम मेल के लिए एक ही समय में txt और htmly दोनों का उपयोग क्यों करते हैं। मुझे यह तर्क नहीं मिला
शशांक विवेक

वे विभिन्न प्रकार के तरीकों को दिखाने के लिए सिर्फ उदाहरण हैं, आप उनमें से किसी का उपयोग कर सकते हैं @ शशांकविवेक
erdemlal

241

लड़कों और लड़कियों!

जब से Django के 1.7 send_email विधि में html_messageपैरामीटर जोड़ा गया था।

html_message: यदि html_message प्रदान किया जाता है, तो परिणामी ईमेल संदेश / पाठ सामग्री / html सामग्री के रूप में HTML सामग्री के रूप में संदेश के साथ एक मल्टीपार्ट / वैकल्पिक ईमेल होगा।

तो आप बस:

from django.core.mail import send_mail
from django.template.loader import render_to_string


msg_plain = render_to_string('templates/email.txt', {'some_params': some_params})
msg_html = render_to_string('templates/email.html', {'some_params': some_params})

send_mail(
    'email title',
    msg_plain,
    'some@sender.com',
    ['some@receiver.com'],
    html_message=msg_html,
)

1
ध्यान दें कि अगर 'email.txt' और 'email.html' एक डायरेक्टरी टेम्प्लेट में हैं जैसा कि सेटिंग में परिभाषित किया गया है, बस रेंडर_टो_स्ट्रिंग ('email.txt', {'some_params': some_params} _
ब्रूनो

render_to_stringसंकेत के लिए धन्यवाद , बहुत आसान है।
फहराया

1
अच्छा समाधान! हालाँकि, send_mailकुछ कस्टम हेडर को सेट करना संभव नहीं है, जैसे Return-PathकिEmailMultiAlternatives's constructor header parameter
जिसे

26

मैंने इस समस्या को हल करने के प्रयास में django-templated-email बनाया है, जो इस समाधान से प्रेरित है (और कुछ बिंदु पर जरूरत है, django टेम्प्लेट का उपयोग करने से लेन-देन के लिए टेम्प्लेट, टेम्प्लेटेड ईमेल के लिए टेम्प्लेट के सेट आदि का उपयोग करने के लिए स्विच करें) मेरी अपनी परियोजना)। यह अभी भी एक काम में प्रगति है, लेकिन ऊपर के उदाहरण के लिए, आप करेंगे:

from templated_email import send_templated_mail
send_templated_mail(
        'email',
        'from@example.com',
        ['to@example.com'],
        { 'username':username }
    )

निम्न सेटिंग्स जोड़ने के साथ (उदाहरण पूरा करने के लिए):

TEMPLATED_EMAIL_DJANGO_SUBJECTS = {'email':'hello',}

यह स्वचालित रूप से सामान्य django टेम्पलेट dirs / लोडर (क्रमशः यह उन में से कम से कम एक मिल सकता है, तो शिकायत करते हुए) सादा और html भागों के लिए 'templated_email / email.txt' और 'templated_email / email.html' नाम के टेम्पलेट्स की तलाश करेगा। ।


1
मुझे ठीक लगता है। मैंने इसे नीचे ट्रिम कर दिया है और इसे जोड़ने के लिए एक टिकट में डाल दिया है django.shortcuts.send_templated_mail: code.djangoproject.com/ticket/17193
टॉम क्रिस्टी

कूल, यह देख कर खुशी हुई कि यह django कोर के लिए एक उपकरण के रूप में प्रस्तावित है। मेरा उपयोग-मामला / फ़र्म के लिए फ़ोकस केवल शॉर्टकट से थोड़ा बड़ा है, (मेल प्रदाताओं के बीच आसान स्विचिंग जो मेल भेजने के लिए कुंजी / मान एपी के लिए है), लेकिन यह कोर से एक लापता सुविधा की तरह महसूस करता है
दरब

15

दो वैकल्पिक टेम्प्लेट (एक सादे पाठ में और एक html में) का उपयोग करने के लिए EmailMultiAlternatives और render_to_string का उपयोग करें:

from django.core.mail import EmailMultiAlternatives
from django.template import Context
from django.template.loader import render_to_string

c = Context({'username': username})    
text_content = render_to_string('mail/email.txt', c)
html_content = render_to_string('mail/email.html', c)

email = EmailMultiAlternatives('Subject', text_content)
email.attach_alternative(html_content, "text/html")
email.to = ['to@example.com']
email.send()

5

मैंने Django सरल मेल बनाया है जिसमें आपके द्वारा भेजे जाने वाले प्रत्येक ट्रांजेक्शनल ईमेल के लिए एक सरल, अनुकूलन योग्य और पुन: प्रयोज्य टेम्पलेट है।

ईमेल और सामग्री को सीधे django के व्यवस्थापक से संपादित किया जा सकता है।

अपने उदाहरण के साथ, आप अपना ईमेल पंजीकृत करेंगे:

from simple_mail.mailer import BaseSimpleMail, simple_mailer


class WelcomeMail(BaseSimpleMail):
    email_key = 'welcome'

    def set_context(self, user_id, welcome_link):
        user = User.objects.get(id=user_id)
        return {
            'user': user,
            'welcome_link': welcome_link
        }


simple_mailer.register(WelcomeMail)

और इसे इस तरह भेजें:

welcome_mail = WelcomeMail()
welcome_mail.set_context(user_id, welcome_link)
welcome_mail.send(to, from_email=None, bcc=[], connection=None, attachments=[],
                   headers={}, cc=[], reply_to=[], fail_silently=False)

मैं कोई भी प्रतिक्रिया प्राप्त करना पसंद करूंगा।


यदि आप अपने रेपो पर अपने पैकेज का डेमो एप्लिकेशन अपलोड करते हैं तो यह बहुत मदद करेगा।
ans2human

हाय @ ans2human इस सुझाव के लिए धन्यवाद, मैं इसे सुधार की सूची में जोड़ता हूं!
Charlesthk

3

उदाहरण में एक त्रुटि है .... यदि आप इसे लिखित रूप में उपयोग करते हैं, तो निम्न त्रुटि होती है:

<प्रकार 'अपवाद। अपवाद'>: 'तानाशाह' वस्तु में कोई विशेषता नहीं है 'render_context'

आपको निम्नलिखित आयात जोड़ने की आवश्यकता होगी:

from django.template import Context

और शब्दकोश को बदल दें:

d = Context({ 'username': username })

Http://docs.djangoproject.com/en/1.2/ref/templates/api/#rendering-a-context देखें


धन्यवाद - यह अब तय हो गया है।
डोमिनिक रॉगर

3

Django मेल अस्थायी , Django टेम्प्लेट सिस्टम के साथ ईमेल भेजने के लिए एक सुविधा संपन्न Django एप्लिकेशन है।

स्थापना:

pip install django-mail-templated

विन्यास:

INSTALLED_APPS = (
    ...
    'mail_templated'
)

टेम्पलेट:

{% block subject %}
Hello {{ user.name }}
{% endblock %}

{% block body %}
{{ user.name }}, this is the plain text part.
{% endblock %}

अजगर:

from mail_templated import send_mail
send_mail('email/hello.tpl', {'user': user}, from_email, [user.email])

अधिक जानकारी: https://github.com/artemrizhov/django-mail-templated


यह वास्तव में उपयोग करने के लिए आसान था। धन्यवाद।
cheenbabes

नमस्ते, मैं बीसीसी को अपने सभी प्राप्तकर्ता कैसे सेट कर सकता हूं?
एलडेसिडो

@aldesabido यह सिर्फ Django के मानक EmailMessage वर्ग के चारों ओर एक आवरण है। तो आपको इस तरह की सुविधाओं की तलाश करते समय आधिकारिक दस्तावेज पढ़ना चाहिए: docs.djangoproject.com/en/1.10/topics/email इसके अलावा इसी तरह के प्रश्न पर एक नज़र डालें: stackoverflow.com/questions/3470172/…
rait

अधिक सटीक होने के लिए, मानक ईमेलमैसेज को लपेटा नहीं गया है, लेकिन विरासत में मिला है। यानी यह मानक वर्ग के लिए विस्तार है :)
raacer 11

टेम्पलेट में JS / CSS शामिल करना संभव है?
डैनियल शट्ज

3

मुझे पता है कि यह एक पुराना प्रश्न है, लेकिन मुझे यह भी पता है कि कुछ लोग मेरे जैसे ही हैं और हमेशा उत्तर की तलाश में रहते हैं , क्योंकि पुराने उत्तर कभी-कभी अद्यतन न किए जाने पर अपूरणीय जानकारी हो सकती है।

इसकी अब जनवरी 2020 है, और मैं Django 2.2.6 और पायथन 3.7 का उपयोग कर रहा हूं

नोट: मैं DJANGO REST FRAMEWORK का उपयोग करता हूं , ईमेल भेजने के लिए नीचे दिया गया कोड मेरे विचार में एक मॉडल व्यूसेट में थाviews.py

इसलिए कई अच्छे उत्तर पढ़ने के बाद, मैंने यही किया।

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)

जरूरी! तो कैसे करता render_to_stringमिलता है receipt_email.txtऔर receipt_email.html? मेरे में settings.py, मेरे पास है TEMPLATESऔर नीचे यह है कि यह कैसा दिखता है

ध्यान दें DIRS, यह रेखा है os.path.join(BASE_DIR, 'templates', 'email_templates') । यह रेखा वह है जो मेरे टेम्पलेट्स को सुलभ बनाती है। मेरे Project_dir में, मेरे पास एक फ़ोल्डर है templates, और एक उप_निर्देशिका जिसे email_templatesइस तरह कहा जाता है project_dir->templates->email_templates। मेरे टेम्पलेट receipt_email.txtऔर उप_निर्देशिका के receipt_email.htmlअंतर्गत हैं email_templates

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',
        ],
    },
},
]

मुझे बस जोड़ने दो, मेरे recept_email.txtइस तरह दिखता है;

Dear {{name}},
Here is the text version of the email from template

और, मेरी receipt_email.htmlशक्ल कुछ ऐसी है;

Dear {{name}},
<h1>Now here is the html version of the email from the template</h1>

0

मैंने एक स्निपेट लिखा है जो आपको डेटाबेस में संग्रहीत टेम्पलेट्स के साथ प्रदान किए गए ईमेल भेजने की अनुमति देता है। एक उदाहरण:

EmailTemplate.send('expense_notification_to_admin', {
    # context object that email template will be rendered with
    'expense': expense_request,
})

0

अगर आप अपने मेल के लिए डायनामिक ईमेल टेम्प्लेट चाहते हैं तो अपने डेटाबेस टेबल में ईमेल कंटेंट को सेव करें। यह वही है जो मैंने डेटाबेस में HTML कोड के रूप में सहेजा है =

<p>Hello.. {{ first_name }} {{ last_name }}.  <br> This is an <strong>important</strong> {{ message }}
<br> <b> By Admin.</b>

 <p style='color:red'> Good Day </p>

आपके विचारों में:

from django.core.mail import EmailMultiAlternatives
from django.template.loader import get_template

def dynamic_email(request):
    application_obj = AppDetails.objects.get(id=1)
    subject = 'First Interview Call'
    email = request.user.email
    to_email = application_obj.email
    message = application_obj.message

    text_content = 'This is an important message.'
    d = {'first_name': application_obj.first_name,'message':message}
    htmly = FirstInterviewCall.objects.get(id=1).html_content #this is what i have saved previously in database which i have to send as Email template as mentioned above HTML code

    open("partner/templates/first_interview.html", "w").close() # this is the path of my file partner is the app, Here i am clearing the file content. If file not found it will create one on given path.
    text_file = open("partner/templates/first_interview.html", "w") # opening my file
    text_file.write(htmly) #putting HTML content in file which i saved in DB
    text_file.close() #file close

    htmly = get_template('first_interview.html')
    html_content = htmly.render(d)  
    msg = EmailMultiAlternatives(subject, text_content, email, [to_email])
    msg.attach_alternative(html_content, "text/html")
    msg.send()

यह डायनामिक HTML टेम्प्लेट भेजेगा जिसे आपने Db में सेव किया है।


0

send_emai()मेरे लिए काम नहीं किया तो मैं EmailMessage यहाँ django डॉक्स में इस्तेमाल किया ।

मैंने aser के दो संस्करणों को शामिल किया है:

  1. केवल html ईमेल संस्करण के साथ
  2. सादे पाठ ईमेल और HTML ईमेल संस्करणों के साथ
from django.template.loader import render_to_string 
from django.core.mail import EmailMessage

# import file with html content
html_version = 'path/to/html_version.html'

html_message = render_to_string(html_version, { 'context': context, })

message = EmailMessage(subject, html_message, from_email, [to_email])
message.content_subtype = 'html' # this is required because there is no plain text email version
message.send()

यदि आप अपने ईमेल का सादा पाठ संस्करण शामिल करना चाहते हैं, तो उपरोक्त को इस तरह संशोधित करें:

from django.template.loader import render_to_string 
from django.core.mail import EmailMultiAlternatives # <= EmailMultiAlternatives instead of EmailMessage

plain_version = 'path/to/plain_version.html' # import plain version. No html content
html_version = 'path/to/html_version.html' # import html version. Has html content

plain_message = render_to_string(plain_version, { 'context': context, })
html_message = render_to_string(html_version, { 'context': context, })

message = EmailMultiAlternatives(subject, plain_message, from_email, [to_email])
message.attach_alternative(html_message, "text/html") # attach html version
message.send()

मेरे सादे और HTML संस्करण इस तरह दिखते हैं: plain_version.html:

Plain text {{ context }}

html_version.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
 ...
 </head>
<body>
<table align="center" border="0" cellpadding="0" cellspacing="0" width="320" style="border: none; border-collapse: collapse; font-family:  Arial, sans-serif; font-size: 14px; line-height: 1.5;">
...
{{ context }}
...
</table>
</body>
</html>

-1

मैं इस टूल का उपयोग करना आसान ईमेल प्रोसेसिंग के साथ आसानी से ईमेल HTML और TXT भेजने की अनुमति देता हूं: https://github.com/divio/django-emailit

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.