জ্যাঙ্গো দিয়ে ইমেল টেমপ্লেট তৈরি করা


206

আমি এই জাতীয় জ্যাঙ্গো টেম্পলেট ব্যবহার করে এইচটিএমএল-ইমেলগুলি প্রেরণ করতে চাই:

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

আমি সম্পর্কে কিছুই খুঁজে পাচ্ছি না send_mailএবং জ্যাঙ্গো-মেলার কেবল গতিশীল ডেটা ছাড়াই এইচটিএমএল টেমপ্লেট প্রেরণ করে।

আমি কীভাবে ই-মেইলগুলি তৈরি করতে জাঙ্গোর টেম্পলেট ইঞ্জিন ব্যবহার করব?


3
লক্ষ্য করুন জ্যাঙ্গো 1.7অফার html_messageমধ্যে send_email stackoverflow.com/a/28476681/953553
andilabs

হাই @ আনাকিন, আমি দীর্ঘদিন ধরে এই সমস্যার সাথে লড়াই করেছি এবং সে জন্য একটি প্যাকেজ তৈরি করার সিদ্ধান্ত নিয়েছি। আপনার মতামত পেয়ে আমি খুব খুশি হব
Charlesthk

উত্তর:


385

দস্তাবেজগুলি থেকে , এইচটিএমএল ইমেল প্রেরণে আপনি বিকল্প সামগ্রী-প্রকার যেমন ব্যবহার করতে চান:

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 আপনি কী বলতে চান এবং কীভাবে আমরা এটি ব্যবহার করতে পারি তা আপনি কী ব্যাখ্যা করতে পারেন
আক্কি

3
@ ইয়াকির নীচে অ্যান্ডির উত্তর দেখুন, যা জেঙ্গো ১.7-তে সেন্ড_ইমেল () -তে যোগ করা HTML_message পরমকে বিকল্প অংশটি সহজ করার জন্য ধন্যবাদ
মাইক এস

আমাকে ক্ষমা করুন তবে কেন আমরা মেলের জন্য একই সময়ে txt এবং htmly ব্যবহার করি। আমি এই যুক্তিটি পাই নি
শশাঙ্ক বিবেক

বিভিন্ন ধরণের পদ্ধতি দেখানোর জন্য এগুলি কেবল উদাহরণ, আপনি তাদের মধ্যে যে কোনও একটি ব্যবহার করতে পারেন @
শশাঙ্ক

241

ছেলেদের এবং মেয়েশিশুদের!

জাজানো থেকে প্রেরণ - ইমেল পদ্ধতিতে 1.7html_message পরামিতি যুক্ত করা হয়েছিল।

এইচটিএমএল_মেসেজ: যদি এইচটিএমএল_মেসেজ সরবরাহ করা হয়, ফলস্বরূপ ইমেলটি পাঠ্য / সরল সামগ্রীর ধরণের হিসাবে বার্তা সহ একটি বহুগুণ / বিকল্প ইমেল এবং পাঠ্য / এইচটিএমএল সামগ্রী প্রকার হিসাবে html_message হবে age

সুতরাং আপনি ঠিক করতে পারেন:

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': কিছু_প্রেম ms _
ব্রুনো ভার্মিউলেন

render_to_stringইঙ্গিতটির জন্য ধন্যবাদ , খুব সহজ।
hoefling

1
ভাল সমাধান! তবে এর সাথে send_mailকিছু কাস্টম শিরোলেখ স্থাপন করা সম্ভব নয় যেমনReturn-PathEmailMultiAlternatives's constructor header parameter
Qlimax

26

আমি এই সমস্যার সমাধানের প্রয়াসে জ্যাঙ্গো-টেম্পলেটড-ইমেল তৈরি করেছি , এই সমাধানটি দ্বারা অনুপ্রাণিত হয়ে (এবং কোনও সময়ে জাজানো টেম্পলেটগুলি থেকে কোনও মেইলচিম্প ব্যবহার করা থেকে স্যুইচ করা, ট্রানজেকশনাল, টেম্প্লেটেড ইমেলগুলির জন্য টেমপ্লেটের সেট করা যেতে পারে) আমার নিজস্ব প্রকল্প)। এটি যদিও এখনও একটি কার্য-অগ্রগতি, তবে উপরের উদাহরণের জন্য, আপনি এটি করবেন:

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

এটি সাধারণ টেম্পলেট টেম্পলেট ডায়ার্স / লোডারগুলিতে যথাক্রমে প্লেইন এবং এইচটিএমএল অংশগুলির জন্য 'টেম্প্লেটেড_ইমেইল / ইমেল.টিএসটিএস' এবং 'টেম্প্লেটেড_ইমেইল / ইমেল এইচটিটিএমএল' নামক টেম্পলেটগুলি অনুসন্ধান করবে ( ।


1
আমার কাছে ভালই লাগছে. আমি এটিকে ছাঁটাই করেছি এবং এটি যুক্ত করার জন্য একটি টিকিটে ফেলে দিয়েছিdjango.shortcuts.send_templated_mail : Code.djangoproject.com/ticket/17193
টম ক্রিস্টি

শীতল, এটি জ্যাঙ্গো কোরের সরঞ্জাম হিসাবে প্রস্তাবিত হতে পেরে আনন্দিত। আমার ব্যবহারের ক্ষেত্রে / লিবেসের জন্য ফোকাসটি কেবল শর্টকাটের চেয়ে কিছুটা বড় (মেল সরবরাহকারীদের মধ্যে মেইল ​​প্রেরণের জন্য কী / মান এপিআই রয়েছে এমনগুলির মধ্যে সহজ স্যুইচিং) তবে এটি কোর থেকে অনুপস্থিত বৈশিষ্ট্যের মতো মনে হয় না
ডারব

15

দুটি বিকল্প টেম্পলেট (একটি সরল পাঠ্যে এবং একটি এইচটিএমএল মধ্যে) ব্যবহার করতে ইমেল মাল্টিএল্টিভ্যালটিস এবং রেন্ডার_ টু স্ট্রিং ব্যবহার করুন:

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

আপনি প্রেরণ করতে চান এমন প্রতিটি লেনদেনের ইমেলের জন্য একটি সাধারণ, কাস্টমাইজযোগ্য এবং পুনরায় ব্যবহারযোগ্য টেম্পলেট রাখতে আমি জ্যাঙ্গো সিম্পল মেল তৈরি করেছি।

ইমেল সামগ্রী এবং টেমপ্লেটগুলি সরাসরি জাঙ্গোর প্রশাসক থেকে সম্পাদনা করা যেতে পারে।

আপনার উদাহরণ সহ, আপনি আপনার ইমেল নিবন্ধন করতে হবে:

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

উদাহরণে একটি ত্রুটি রয়েছে .... আপনি যদি এটি লিখিত হিসাবে ব্যবহার করেন তবে নিম্নলিখিত ত্রুটি ঘটে:

<টাইপ 'ব্যাতিক্রম। এক্সেক্সশন'>: 'ডিক' অবজেক্টের কোনও 'রেন্ডার_কন্টেক্সট' নেই

আপনাকে নিম্নলিখিত আমদানি যুক্ত করতে হবে:

from django.template import Context

এবং অভিধানটি হ'ল:

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

Http://docs.djangoproject.com/en/1.2/ref/templates/api/#rendering-a-context দেখুন


ধন্যবাদ - এটি এখন ঠিক করা হয়েছে।
ডমিনিক রজার

3

জ্যাঙ্গো মেল টেম্প্লেটেড হ'ল জ্যাঙ্গো টেমপ্লেট সিস্টেমের সাথে ইমেল প্রেরণের জন্য একটি বৈশিষ্ট্য সমৃদ্ধ জ্যাঙ্গো অ্যাপ্লিকেশন।

স্থাপন:

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


এটি ব্যবহার করা সত্যিই সহজ ছিল। ধন্যবাদ।
চীনবাবে

হাই, আমি কীভাবে আমার সমস্ত প্রাপকদের বিসিসিতে সেট করতে পারি?
অলডেসবিডো

@ আলডেসবিডো এটি জ্যাঙ্গোর স্ট্যান্ডার্ড ইমেলমেসেজ ক্লাসের চারপাশে কেবল একটি মোড়ক। সুতরাং এই জাতীয় বৈশিষ্ট্যগুলি সন্ধান করার সময় আপনার সরকারী ডকুমেন্টেশনটি পড়া উচিত: ডকস.ডজ্যাঙ্গোপ্রজেক্ট /en/1.10/topics/email একই ধরণের প্রশ্নটিও একবার দেখুন : স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 3470172/…
raacer

আরও সুনির্দিষ্টভাবে বলতে গেলে, স্ট্যান্ডার্ড ইমেলম্যাসেজ মোড়ানো নয়, উত্তরাধিকার সূত্রে প্রাপ্ত। অর্থাৎ এটি স্ট্যান্ডার্ড ক্লাসের জন্য এক্সটেনশন :)
রেসারে

টেম্পলেটে জেএস / সিএসএস অন্তর্ভুক্ত করা সম্ভব?
ড্যানিয়েল শ্যাটজ 12:48

3

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে আমি এটাও জানি যে কিছু লোক আমার মতই থাকে এবং সর্বদা আপোডেট উত্তর খুঁজতে থাকে , যেহেতু পুরানো উত্তরগুলি আপডেট না করা হলে মাঝে মাঝে তথ্য যেতে পারে।

এটি এখন 2020 জানুয়ারী, এবং আমি জ্যাঙ্গো ২.২..6 এবং পাইথন ৩.7 ব্যবহার করছি

নোট: আমি ব্যবহার জ্যাঙ্গো বিশ্রাম ফ্রেমওয়ার্ক , ইমেল পাঠানোর জন্য নিচের কোড একটি ছিল মডেল viewset আমার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.txtreceipt_email.htmlsettings.pyTEMPLATES এবং নীচে এটি দেখতে কেমন দেখাচ্ছে

মনোযোগ দিন DIRS, এই লাইন আছেos.path.join(BASE_DIR, 'templates', 'email_templates') .এই লাইনটি আমার টেমপ্লেটগুলিকে অ্যাক্সেসযোগ্য করে তুলেছে। আমার project_dir, আমি একটি ফোল্ডার নামক আছে templates, এবং একটি sub_directory নামক 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

আপনি যদি নিজের মেইলের জন্য গতিশীল ইমেল টেম্পলেটগুলি চান তবে ইমেল সামগ্রীটি আপনার ডাটাবেস সারণিতে সংরক্ষণ করুন। এটিই আমি ডাটাবেস = এইচটিএমএল কোড হিসাবে সংরক্ষণ করেছি

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

এটি আপনাকে ডিবিতে যা সঞ্চয় করেছে তা ডায়নামিক এইচটিএমএল টেমপ্লেট প্রেরণ করবে।


0

send_emai()আমার পক্ষে কাজ করেনি তাই আমি EmailMessage এখানে জ্যাঙ্গো ডক্সে ব্যবহার করেছি ।

আমি এ্যান্সারের দুটি সংস্করণ অন্তর্ভুক্ত করেছি:

  1. শুধুমাত্র এইচটিএমএল ইমেল সংস্করণ সহ
  2. সাধারণ পাঠ্য ইমেল এবং এইচটিএমএল ইমেল সংস্করণ সহ
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()

আমার প্লেইন এবং এইচটিএমএল সংস্করণগুলি এর মতো দেখাচ্ছে: প্লেইন_ভার্সন এইচটিএমএল:

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

আমি সহজেই প্রসঙ্গত প্রক্রিয়াকরণ সহ ইমেল এইচটিএমএল এবং টিএক্সটি প্রেরণের জন্য সহজেই অনুমতি পেতে এই সরঞ্জামটি ব্যবহার করতে চাই: https://github.com/divio/django-emailit

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.