سؤال

أريد إرسال HTML-Emails ، باستخدام قوالب Django مثل هذا:

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

لا يمكنني العثور على أي شيء send_mail, و Django-Mailer يرسل فقط قوالب HTML ، دون بيانات ديناميكية.

كيف يمكنني استخدام محرك قالب Django لإنشاء رسائل البريد الإلكتروني؟

هل كانت مفيدة؟

المحلول

من عند المستندات, ، لإرسال بريد إلكتروني 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()

نصائح أخرى

الأولاد والبنات!

منذ 1.7 دانغو ارسل بريد الكتروني طريقة html_message تمت إضافة المعلمة.

html_message: إذا تم توفير html_message ، فإن البريد الإلكتروني الناتج سيكون رسالة بريد إلكتروني متعددة/بديلة مع رسالة كنوع محتوى نص/عادي و html_message كنوع محتوى النص/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,
)

لقد صنعت Django-themail-email في محاولة لحل هذه المشكلة ، مستوحاة من هذا الحل (والحاجة ، في مرحلة ما ، تتحول من استخدام قوالب Django إلى استخدام MailChimp وما إلى ذلك. إنه لا يزال يعمل أثناء التقدم ، ولكن على سبيل المثال ، ستفعل:

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

مع إضافة ما يلي إلى الإعدادات .Py (لإكمال المثال):

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

سيبحث هذا تلقائيًا عن القوالب المسماة "TEMPLATED_EMAIL/البريد الإلكتروني. .

استخدم EmailMultialTeriats و Render_to_string للاستفادة من قالبين بديلين (واحد في نص عادي وواحد في HTML):

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()

لقد خلقت 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)

أحب الحصول على أي ملاحظات.

هناك خطأ في المثال .... إذا كنت تستخدمه كما هو مكتوب ، يحدث الخطأ التالي:

<اكتب "استثناءات

ستحتاج إلى إضافة الاستيراد التالي:

from django.template import Context

وتغيير القاموس ليكون:

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

يرى http://docs.djangoproject.com/en/1.2/ref/templates/api/#rendering-a-context

Django البريد templated هو تطبيق 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-temphated

كتبت أ مقتطف يتيح لك ذلك إرسال رسائل بريد إلكتروني يتم تقديمها باستخدام قوالب مخزنة في قاعدة البيانات. مثال:

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

إذا كنت تريد قوالب بريد إلكتروني ديناميكية للبريد الخاص بك ، فقم بحفظ محتوى البريد الإلكتروني في جداول قاعدة البيانات الخاصة بك. هذا ما قمت بحفظه كرمز 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.

أحب استخدام هذه الأداة للسماح بسهولة بإرسال HTML و TXT عبر البريد الإلكتروني مع معالجة السياق السهلة: https://github.com/divio/django-emailit

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top