كيفية إرسال رسائل بريد إلكتروني باستخدام Django

في هذا البرنامج التعليمي، سنرشدك خلال عملية إرسال رسائل البريد الإلكتروني باستخدام Django. سنتطرق إلى كيفية تكوين اتصالات SMTP في Django، وكيفية إعداد كلمة مرور تطبيق لمزود بريدك الإلكتروني، وكيفية إرسال رسائل البريد عبر جرس Django. سنلقي أيضًا نظرة على كيفية إعداد نموذج اتصال لتطبيق Django الخاص بك، والذي سيسمح لعملائك بالاتصال بك.

تستخدم معظم تطبيقات الويب البريد الإلكتروني لإدارة العمليات الحيوية، مثل إعادة تعيين كلمات المرور، تفعيل الحسابات، تلقي ملاحظات العملاء، إرسال النشرات الإخبارية والحملات التسويقية. معظم هذه المهام تتطلب خدمة مخصصة مثل SendGrid أو Mailgun. ولكن إذا لم تكن تتوقع أن يزداد عدد الزوار إلى موقعك بشكل كبير، فيمكنك فعلاً أن تنجز الكثير من خلال مزود بريدك الإلكتروني الشخصي.

إرسال رسائل البريد باستخدام بريدك الإلكتروني الشخصي هو خيار معقول للمشاريع الصغيرة أو المشاريع الاختبارية، لذا سنتبع هذا الأسلوب هنا لتبسيط الأمور. ومع ذلك، ليس من الجيد استخدام خدمة بريدك الإلكتروني الشخصي لموقع الإنتاج الخاص بك. يمكنك معرفة المزيد عن قيود إرسال Gmail، أو الرجوع إلى قيود مزود بريدك الإلكتروني.

ملاحظة: الكود الكامل لهذا البرنامج التعليمي متاح على GitHub.

فهم SMTP

SMTP (أو بروتوكول نقل البريد البسيط) هو مجموعة من القواعد التي تحدد كيفية نقل رسائل البريد الإلكتروني من المرسلين إلى المستلمين. تستخدم خوادم SMTP هذا البروتوكول لإرسال وتحويل الرسائل الخارجية. (لاحظ أن بروتوكولات أخرى تحكم كيفية استلام رسائل البريد الإلكتروني.)

تمتلك خادم SMTP دائمًا عنوان فريد، ومنفذ محدد لإرسال الرسائل، وهو في معظم الحالات 587. سنرى كيف يكون المنفذ ذو صلة عند إرسال رسائل البريد باستخدام Django.

نظرًا لأننا سنستخدم Gmail، فإن العنوان الذي سنعمل معه هو smtp.gmail.com، وستكون المنفذ 587.

الآن دعونا نرى كيف يمكننا إرسال رسائل البريد باستخدام Django.

إنشاء مشروع Django

يجب أن يكون لكل مشروع Django بيئة افتراضية، حيث لا نرغب في إفساد تبعيات المشروع. لإنشاء واحدة، قم بتنفيذ ما يلي:

python -m venv .venv

ملاحظة: إذا كنت غير مألوف بالبيئات الافتراضية، تأكد من having a look at our دليل البيئات الافتراضية لبايثون.

الأمر أعلاه يخلق بيئة افتراضية بالاسم .venv. لتنشيط هذه البيئة الافتراضية، يمكنك استخدام ما يلي:

source .venv/bin/activate

نظرًا أن Django هو حزمة طرف ثالث، يجب تثبيتها باستخدام pip:

pip install django

سيثبت هذا أحدث إصدار من Django، والذي يمكنك التحقق منه باستخدام pip freeze.

لإنشاء مشروع Django، تستدعي سطر الأوامر المستخدم django-admin:

django-admin startproject EmailProject

باستخدام الأمر أعلاه، تقوم بإنشاء مشروع Django باسم EmailProject، لكن يمكنك إنشاء المشروع بأي اسم تريد.

الآن، أدخل إلى دليل المشروع وقم بتشغيل الخادم:

cd EmailProject
python manage.py runserver

بعد تشغيل خادم Django، زر http://localhost:8000 في متصفحك. سترى صفحة مولدة تلقائيًا بملاحظات إصدار Django الأخيرة.

تعديل الإعدادات

ستحتاج إلى تعديل ملف الإعدادات قبل إرسال البريد الإلكتروني، فلنجد ذلك الملف باستخدام الأمر tree:

ملاحظة: من أجل البساطة، سنستخدم أوامر نظام UNIX (macOS أو Linux) فقط.

tree

الأمر tree يعطي توضيحًا لهيكل الملفات في دليل معين. في هذه الحالة، نظرًا لعدم توفير مسار دليل محدد، سنحصل على شيء مشابه لما يلي إذا كنا في المجلد الجذري للمشروع:

├── EmailProject
│   ├── asgi.py
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

1 directory, 6 files

الملف الذي سنقوم بتعديله باستمرار خلال هذا البرنامج التعليمي هو settings.py داخل مجلد EmailProject.

settings.py يحتوي على جميع تكوينات المشروع التي ستحتاجها، ويسمح لك بتعيين متغيرات مخصصة. كما تقول وثائق Django، “ملف الإعدادات هو مجرد ماكرو مع متغيرات على مستوى الماكرو”.

لنلقي نظرة على الإعدادات المطلوبة لإرسال بريد إلكتروني باستخدام Django. افتح ملف EmailProject/settings.py والصق الإعدادات التالية في أسفل الملف:

# EmailProject/settings.py

# Bottom of the file
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = ''
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = ''
EMAIL_HOST_PASSWORD = ''

لنحلل الكود أعلاه من خلال تحليل كل من هذه الإعدادات.

خلفية البريد

تعلن الإعداد EMAIL_BACKEND عن الخلفية التي ستستخدمها مشروع Django للاتصال بخادم SMTP.

هذه المتغير تشير إلى فئة smtp.EmailBackend التي تستقبل جميع المعلمات اللازمة لإرسال بريد إلكتروني. أوصي بشدة بإلقاء نظرة على مُنشئ الفئة مباشرة في كود Django المصدر. ستتفاجأ بقابلية قراءة هذا الكود.

ملاحظة: على الرغم من أن هذه الفئة هي الخيار الافتراضي لـ EMAIL_BACKEND ، إلا أنه من المعتاد أن يكون واضحًا في إعدادات Django.

جميع الإعدادات الأخرى للبريد ستعتمد على مُنشئ فئة EmailBackend.

مُضيف البريد

الإعداد EMAIL_HOST يشير إلى ضمن مجال خادم SMTP الذي ستستخدمه. يعتمد هذا على مزود البريد الإلكتروني الخاص بك. إليك جدولًا بموقع خادم SMTP المقابل لثلاثة مزودين شائعين:

Email provider SMTP server host
Gmail smtp.gmail.com
Outlook/Hotmail smtp-mail.outlook.com
Yahoo smtp.mail.yahoo.com

نحن نترك هذا الإعداد فارغًا الآن لأننا سنستخدم ملف .env لاحقًا لتجنب ترميز المفاتيح الحساسة أو الإعدادات الخاصة بالموقع. يجب ألا تضع بيانات الاعتماد مباشرة في الكود.

سنستخدم Django Environ لحل هذه المشكلة.

منفذ البريد

يجب تعيين الإعداد EMAIL_PORT إلى 587 لأنه المنفذ الافتراضي لمعظم خوادم SMTP. هذا لا يزال صحيحًا بالنسبة لمزودي البريد الشخصي.

يتم استخدام هذا المنفذ جنبًا إلى جنب مع تشفير TLS لضمان أمان إرسال البريد.

استخدام البريد TLS

Transport Layer Security (TLS) هو بروتوكول أمان يُستخدم في جميع أنحاء الويب لتشفير الاتصال بين تطبيقات الويب (Django) وخوادم (خادم SMTP).

في الأصل، قمنا بتعيين متغير EMAIL_USE_TLS إلى True. هذا يعني أن Django سيستخدم Transport Layer Security للاتصال بخادم SMTP وإرسال الرسائل الإلكترونية. (إنه إجباري بالنسبة لمزودي البريد الشخصي.)

مستخدم خادم البريد

الإعداد EMAIL_HOST_USER هو عنوان بريدك الإلكتروني الشخصي. اتركه فارغًا الآن، لأننا سنستخدم django-environ لإعداد كل هذه البيانات المصغرة.

كلمة مرور خادم البريد

تحديد EMAIL_HOST_PASSWORD هو كلمة المرور التطبيقية التي ستحصل عليها من حساب البريد الإلكتروني — العملية التي سنقوم بها مباشرة بعد هذا القسم.

القصة ذاتها: اترك هذا الإعداد فارغًا، حيث سنستخدم المتغيرات البيئية لاحقًا.

إعداد كلمة المرور التطبيقية في Gmail

لاستخدام تحديد EMAIL_HOST_PASSWORD ستحتاج إلى تنشيط وصول التطبيقات أقل أمانًا وامتلاك كلمة مرور تطبيقية من حساب البريد الإلكتروني الشخصي.

إذا لم تقم بتنشيط وصول التطبيقات أقل أمانًا، ستحصل على على الأرجح خطأ SMTPAuthenticationError، لأن Django ليس لديها وسيلة لتلبية بروتوكولات أمان Google.

قد تختار استخدام كلمة المرور العادية، لكنها ستكون أكثر خطورة من استخدام كلمة مرور تطبيقية. نصيحتي هي إنشاء حساب Gmail جديد أو استخدام حساب بريد “تجريبي”.

بالنظر إلى ذلك، يمكنك الحصول على كلمة مرور تطبيق Gmail باتباع الخطوات التالية. لاحظ أنه إذا كنت تستخدم حساب موجود وقمت بتمكين التحقق بنصفين، يمكنك تجاهل الخطوات 2 و 3:

  1. إنشاء أو تسجيل الدخول إلى حساب Gmail
  2. التوجه إلى myaccount.google.com/lesssecureapps وتشغيل خيار التطبيقات أقل أمان.
  3. قم بتمكين المصادقة الثنائية العاملة، حيث يتطلب ذلك الحصول على كلمة مرور للتطبيق.
  4. بمجرد تمكين المصادقة الثنائية العاملة، حان الوقت للحصول على كلمة مرور للتطبيق. يمكنك القيام بذلك عن طريق الذهاب إلى قسم الأمان من حسابك في Google، والتنقل إلى قسم تسجيل الدخول إلى Google، ثم النقر على كلمات مرور التطبيقات.

ستحتاج إلى إعادة التأكيد بكلمة المرور الخاصة بحسابك (كلمة المرور الأساسية)، قبل أن يتم توجيهك إلى صفحة كلمات مرور التطبيقات.

بمجرد دخولك، انقر على اختر التطبيق، حيث ستختار اسم مخصص لتلك كلمة مرور التطبيق — مثل “إرسال بريد إلكتروني Django” — ثم انقر على توليد.

A new window will show up with a sixteen-character password. Copy it, because we’ll need it to configure our Django project.

إذا كنت تستخدم مزودي خدمة البريد الإلكتروني الآخرين، تأكد من قراءة الأدلة التالية:

استخدام Django Environ لإخفاء المفاتيح الحساسة

حتى لو كنت ترسل بريدًا إلكترونيًا فقط في التطوير، يجب ألا تكتب كلمات المرور مباشرة في الكود المصدر. تصبح هذه النقطة أكثر أهمية عند استخدام نظام ضبط الإصدار جنبًا إلى جنب مع GitHub لتضمين مشروعك. لا ترغب في السماح للآخرين بالوصول إلى بياناتك.

دعونا نرى كيف يمكننا منع هذا من خلال استخدام Django-environ.

أنشئ ملف .env داخل الدليل EmailProject (حيث يوجد ملف settings.py) باستخدام الأمر التالي:

cd EmailProject/
ls

settings.py # يجب أن يكون ملف الإعدادات هنا

touch .env

الآن، افتح ذلك الملف .env وأدخل الأزواج المفتاحية التالية:

EMAIL_HOST=smtp.gmail.com
EMAIL_HOST_USER=YourEmail@address
EMAIL_HOST_PASSWORD=YourAppPassword
RECIPIENT_ADDRESS=TheRecieverOfTheMails

تحليل محتويات هذا الملف:

  • EMAIL_HOST: عنوان خادم SMTP موفر البريد الخاص بك. راجع جدول خادم البريد أعلاه للحصول على التوجيه السريع. في هذه الحالة، أستخدم smtp.gmail.com، عنوان SMTP Gmail.
  • EMAIL_HOST_USER: عنوان بريدك الإلكتروني.
  • EMAIL_HOST_PASSWORD: كلمة المرور التطبيقية التي أنشأتها للتو. تذكر أنها لا تحتوي على أي مسافات.
  • RECIPIENT_ADDRESS: عنوان البريد الإلكتروني الذي ستستلم فيه الرسائل. هذا إعداد مخصص سنقوم بإنشائه لاحقًا لإرسال جميع الرسائل إلى نفس المتلقي.

للاستفادة من هذه المتغيرات البيئية، سنحتاج إلى تثبيت Django-environ:

pip install django-environ

ملاحظة: تأكد من تنشيط بيئتك الافتراضية.

الآن، افتح ملف settings.py الموجود في دليل EmailProject واستخدم الكود التالي:

# EmailProject/settings.py
# يجب أن يكون في بداية الملف
import environ

env = environ.Env()
environ.Env.read_env()

# الإعدادات السابقة ...
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = env('EMAIL_HOST')
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = env('EMAIL_HOST_USER')
EMAIL_HOST_PASSWORD = env('EMAIL_HOST_PASSWORD')

# إعدادات مخصصة. للبريد الإلكتروني
RECIPIENT_ADDRESS = env('RECIPIENT_ADDRESS')

أولاً، نقوم باستيراد حزمة environ في أعلى ملف الإعدادات. تذكر أن جميع الاستيرادات يجب أن تكون في بداية.

ثم نقوم بإنشاء متغير env الذي سيحتوي على جميع أزواج القيم المفتاحية المتاحة على .env.

عبارة env('KEY') تعني أننا نبحث عن قيمة هذا المفتاح. تأكد من إعداد ملف .env الخاص بك قبل المتابعة، لأنك ستواجه خطأ Django ImproperlyConfigured إذا لم يتم تعيين بعض المتغيرات البيئية.

لاحظ أن RECIPIENT_ADDRESS هو إعداد مخصص سنستخدمه لإرسال الرسائل البريدية إلى عنوان يمكننا الوصول إليه.

لا تنسى إدراج ملف .env في .gitignore الخاص بك في حالة استخدامك لـ Git و GitHub. يمكنك القيام بذلك ببساطة عن طريق فتحه وإضافة السطر التالي:

.env

1. إرسال رسائل بريد إلكتروني باستخدام جايتكو شيل

أخيرًا، وصلنا إلى الجزء الشهي من المقالة! حان الوقت لإرسال أول بريد إلكتروني إلى Django.

افتح النظام الأساسي التشغيلي، قم بتنشيط البيئة الافتراضية، وقم بتشغيل:

python manage.py shell

سيخلق هذا جهاز طاقم للغة البرمجة بجميع إعدادات Django مرتبطة بالفعل بالنسبة لنا. داخل هذا الطاقم الجديد تمامًا، لصق الكود التالي:

>>> from django.core.mail import send_mail
>>> from django.conf import settings
>>> send_mail(
...     subject='A cool subject',
...     message='A stunning message',
...     from_email=settings.EMAIL_HOST_USER,
...     recipient_list=[settings.RECIPIENT_ADDRESS])
1

يمكننا أيضًا صنع جملة واحدة بدون تحديد الحجج:

>>> send_mail('A cool subject', 'A stunning message', settings.EMAIL_HOST_USER, [settings.RECIPIENT_ADDRESS])
1

دعونا نحلل الكود أعلاه:

  • نقوم باستيراد وظيفة Django send_mail.
  • ثم نستورد كائن settings الذي يحتوي على جميع الإعدادات العالمية والإعدادات لكل موقع (تلك داخل ملف settings.py).
  • أخيرًا، نمرر جميع الحجج اللازمة إلى وظيفة send_mail. ترجع هذه الوظيفة عدد الرسائل التي تم إرسالها، في هذه الحالة، 1.

لاحظ كيف نستخدم كائن settings للحصول على from_email (البريد الإلكتروني الذي ترسل به الرسائل) و recipient_list (الإعداد المخصص RECIPIENT_ADDRESS الذي حددناه في .env).

الآن، إذا فحصت صندوق الوارد — حيث حددت متغير البيئة RECIPIENT_ADDRESS إلى عنوان بريدي الإلكتروني — سأتلقى الرسالة التي أرسلتها Django.

2. بناء نموذج اتصال تلقائي باستخدام Django

في هذا القسم، سنبني نموذج اتصال تلقائي باستخدام أشكال Django ووظيفة send_mail المدمجة. سنقوم أيضًا بإنشاء دالة خاصة، send()، داخل نموذج الاتصال لتسهيل تنفيذه في العروض.

لنبدأ بإنشاء تطبيق الاتصال. ادخل دليل المشروع الجذري — حيث توجد الأمر manage.py — وقم بتشغيل:

python manage.py startapp contact

ثم، قم بتثبيته في متغير INSTALLED_APPS الخاص بك داخل ملف EmailProject/settings.py:

# EmailProject/settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    ...

    # Custom
    'contact',
]

قبل المضي قدمًا مع تطبيق contact، فلنقم بتهيئة urlpatterns داخل ملف EmailProject/urls.py. للقيام بذلك، استورد الدالة django.urls.include وتضمين URLs الاتصال في المشروع العام. لا تقلق؛ سنقوم بتهيئة URLs الاتصال لاحقًا:

# EmailProject/urls.py

from django.contrib import admin
from django.urls import path, include # New import

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('contact.urls')) # Include Contact URLs
]

نموذج الاتصال

ادخل مجلد contact التطبيق وقم بإنشاء ملف forms.py. من الأفضل إعلان جميع أشكالك داخل ملف forms.py، ولكن هذا ليس إلزاميًا. لهذا السبب لا يشمل Django هذا الملف افتراضيًا.

يمكنك إنشاء ملف الأشكال بالأوامر التالية:

cd ../contact/
# كنت داخل مجلد EmailProject
touch forms.py

افتح الملف الذي أنشأته للتو وقم بإجراء الاستيرادات التالية:


# contact/forms.py

from django import forms
from django.conf import settings
from django.core.mail import send_mail

وحدة Django النموذج توفر لنا كل الطبقات والحقول اللازمة لإنشاء نموذج الاتصال لدينا. مرة أخرى نقوم باستيراد كائن settings ووظيفة send_mail لإرسال البريد الإلكتروني.

سيحتوي نموذج الاتصال لدينا على عدة حقول ويستخدم طريقتين مخصصتين: get_info()، والتي تقوم بتنسيق المعلومات التي قدمها المستخدم، وsend()، والتي ستقوم بإرسال الرسالة.

دعونا نرى هذا التنفيذ في الكود:


# contact/forms.py

class ContactForm(forms.Form):

    name = forms.CharField(max_length=120)
    email = forms.EmailField()
    inquiry = forms.CharField(max_length=70)
    message = forms.CharField(widget=forms.Textarea)

    def get_info(self):
        """
        Method that returns formatted information
        :return: subject, msg
        """
        
# البيانات المنظفة

        cl_data = super().clean()

        name = cl_data.get('name').strip()
        from_email = cl_data.get('email')
        subject = cl_data.get('inquiry')

        msg = f'{name} with email {from_email} said:'
        msg += f'\n"{subject}"\n\n'
        msg += cl_data.get('message')

        return subject, msg

    def send(self):

        subject, msg = self.get_info()

        send_mail(
            subject=subject,
            message=msg,
            from_email=settings.EMAIL_HOST_USER,
            recipient_list=[settings.RECIPIENT_ADDRESS]
        )

هذه فئة كبيرة جدًا، لذا دعونا نحلل ما نفعله في كل جزء. أولاً، نعرّف أربعة حقول ستكون مطلوبة لإرسال الرسالة:

  • name وenquiry هي CharFields تمثل الاسم وسبب الرسالة الاتصالية.
  • email هو EmailField يمثل بريد الكتروني الشخص الذي يحاول الاتصال بك. لاحظ أن البريد الإلكتروني لن يتم إرساله بواسطة عنوان بريد الكتروني للمستخدم، ولكن بواسطة عنوان بريد الكتروني الذي قمت بتعيينه لإرسال البريد في مشروع Django.
  • message هو حقل آخر CharField باستثناء أننا نستخدم عنصر Textarea الأداة. وهذا يعني أنه عند عرض النموذج، سيقوم بتقديم علامة <textarea> بدلاً من علامة <input> بسيطة.

بالانتقال إلى الطرق المخصصة، نحن نستخدم فقط طريقة get_info لتنسيق المعلومات التي قدمها المستخدم وإرجاع متغيرين: subject، والذي هو في الحقيقة مجرد حقل inquiry، وmessage، والذي سيكون الرسالة الفعلية التي أرسلها Django.

من ناحية أخرى، تحصل طريقة send() فقط على المعلومات المنسقة من get_info وترسل الرسالة مع وظيفة send_mail.

على الرغم من أن هذا القسم كان كبيرًا جدًا، سترى كيف سهّلنا وجهات الاتصال من خلال تطبيق جميع منطق الارسال على ContactForm نفسه.

وجهات الاتصال

افتح ملف contact/views.py وأضف الاستيرادات التالية:

# contact/views.py
from django.views.generic import FormView, TemplateView
from .forms import ContactForm
from django.urls import reverse_lazy

كما ترى، سنستخدم آراء عامة Django، والتي توفر لنا الكثير من الوقت عند القيام بمهام بسيطة – على سبيل المثال، عند إعداد نموذج مع FormView أو إنشاء عرض يقوم فقط بتقديم قالب مع TemplateView.

أيضًا ، نقوم باستيراد ContactForm الذي أنشأناه في القسم السابق ودالة reverse_lazy المستخدمة عند العمل مع class-based views.

بالمتابعة للعروض ، دعنا نكتب ContactView:

# contact/views.py

class ContactView(FormView):
    template_name = 'contact/contact.html'
    form_class = ContactForm
    success_url = reverse_lazy('contact:success')

    def form_valid(self, form):
        # تستدعي الطريقة المخصصة send
        form.send()
        return super().form_valid(form)

كما ترون ، نقوم ببناء FormView بسيط باستخدام ContactForm الذي أنشأناه. نقوم أيضًا بإعداد template_name و success_url. سنكتب القالب النصي HTML ونقوم بإعداد الروابط لاحقًا.

تتيح لنا طريقة form valid إرسال البريد الإلكتروني باستخدام طريقة ContactForm.send() فقط إذا كانت جميع حقول النموذج صالحة. وهذا يعني أنه إذا قام المستخدم بإدخال مدخل غير صالح — مثل عنوان بريد إلكتروني غير منسق — فإن الرسالة لن تُرسل.

تنفيذ طريقة form_valid أعلاه سيكون مكافئًا لما يلي في عرض يعتمد على الدالة:

# العرض السابق للاتصال بالدالة ...

if request.method == 'POST':
    form = ContactForm(request.POST)
    if form.is_valid():
        form.send()
        return redirect('contact:success')
else:
    form = ContactForm())

في نهاية هذا القسم، سنقوم بكتابة ContactSucessView، الذي سيعرض رسالة نجاح للمستخدم. بما أننا استوردنا بالفعل الفئة TemplateView، فإننا فقط بحاجة إلى الوراثة منها وتحديد سمة template_name:

# contact/views.py
class ContactSuccessView(TemplateView):
    template_name = 'contact/success.html'

يمكنك الاطلاع على ملف views.py في مستودع GitHub في حال كانت لديك مخاوف.

صفحات الاتصال

حان الوقت لإنشاء أنماط الروابط لتطبيق contact. بما أن Django لا يوفر لنا ملف urls.py افتراضيًا، سنحتاج لإنشائه بالأمر التالي (تأكد من أنك داخل مجلد contact):

pwd
# /path/to/project/EmailProject/contact
touch urls.py

افتح هذا الملف وقم بإعداد المتغيرات app_name و urlpatterns:

from django.urls import path
from .views import ContactView, ContactSuccessView

app_name = 'contact'

urlpatterns = [
    path('', ContactView.as_view(), name="contact"),
    path('success/', ContactSuccessView.as_view(), name="success"),
]

نستخدم path لتضمين المسار ومقابلة الرؤوس لتكوين URL التطبيق. عندما نضع المتغير app_name إلى 'contact'، فهذا يعني أن اسم مجال URL namespacing للتطبيق سيبدو هكذا:

contact:name_of_path
# لـ ContactView
contact:contact
# لـ ContactSuccessView
contact:success

ملاحظة: المجال هو ما نسميه URLs ديناميكيًا في قوالب Django ومشاهداته.

يمكنك التعرف على مزيد من التفاصيل حول مخرج Django URL في الوثائق الرسمية.

كتابة قوالب

تعتبر قوالب Django الطريقة المفضلة لعرض البيانات بشكل ديناميكي، باستخدام HTML وعلامات خاصة يوفرها لنا لغة تصريف قوالب Django.

لهذا التطبيق المحدد، سنستخدم ثلاث قوالب:

  • base.html: سترث منه جميع القوالب الأخرى. سيحتوي على جميع جسور HTML التي يجب أن يكون لدى جميع القوالب، وكذلك الروابط إلى Bootstrap.
  • contact.html: يعرض نموذج الاتصال.
  • success.html: يعرض رسالة نجاح.

لنبدأ بإنشاء بنية قالب تطبيق الاتصال (تأكد من أنك داخل مجلد تطبيق الاتصال):

mkdir -p templates/contact/
cd templates/contact
touch base.html contact.html success.html

الأوامر المذكورة أعلاه تخلق البنية القالبية النموذجية لتطبيق Django قابل لإعادة الاستخدام — appname/templates/appname — وملفات القالب الثلاثة التي ذكرتها من قبل.

هنا ما يجب أن يبدو عليه تنظيم ملفات التطبيق الآن:

.
├── admin.py
├── apps.py
├── forms.py
├── __init__.py
├── migrations
│   └── __init__.py
├── models.py
├── templates
│   └── contact
│       ├── base.html
│       ├── contact.html
│       └── success.html
├── tests.py
├── urls.py
└── views.py

دعونا نقفز إلى محتوى قالب base.html:

<!-- contact/templates/contact/base.html -->

<!DOCTYPE html>
<html lang="en">

  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Django Email Send</title>
    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet"
      integrity="sha384-wEmeIV1mKuiNpC+IOBjI7aAzPcEZeedi5yW5f2yOq55WWLwNGmvvx4Um1vskeMj0" crossorigin="anonymous" />
  </head>

  <body>
    {% block body %}

    {% endblock %}
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"
      integrity="sha384-p34f1UUtsS3wqzfto5wAAmdvj+osOnFyQFpp4Ua3gs/ZVWx6oOypYoCJhGGScy+8" crossorigin="anonymous">
    </script>
  </body>

</html>

كما ترون، إنها بنية بسيطة لملف HTML تشمل روابط إلى Bootstrap 5. هذا يتيح لنا تهيئة تطبيق الاتصال دون استخدام ملفات CSS.

العلامة {% block name-of-block %} تمكننا من إعداد موضع محتوى يستخدمه “القوالب الأبناء”. استخدام هذه العلامة جعل الوراثة القالبية مهمة مباشرة.

قبل الدخول إلى النماذج، ستحتاج لتثبيت حزمة Django crispy forms، التي تمكننا من تهيئتها بسهولة:

pip install django-crispy-forms

مرة أخرى، crispy_forms هي تطبيق Django، ونحتاج إلى تضمينها في قائمة INSTALLED_APPS:

# config/settings.py

INSTALLED_APPS = [
    ...

    # التطبيقات الثالثة
    'crispy_forms',

    # التطبيقات المخصصة
    'contact',
]

# يشير إلى الإطار الأمامي الذي يستخدمه Django crispy forms
CRISPY_TEMPLATE_PACK = 'bootstrap4'

نستخدم حزمة قالب Bootstrap 4، لأن فئات نموذج Bootstrap متوافقة بين الإصدار 4 و 5 (في وقت الكتابة).

الآن، لنعمل على قالب contact.html:

<!-- contact/templates/contact/contact.html -->

{% extends 'contact/base.html' %}
{% load crispy_forms_tags %}

{% block body %}
<div class="mx-auto my-4 text-center">
    <h1>Contact Us</h1>
</div>
<div class="container">
    <form action="" method="post">
        {% csrf_token %}
        {{ form | crispy }}
    <button class="btn btn-success my-3" type="submit">Send message</button>
    </form>
</div>
{% endblock %}

انتبه كيف توسعنا القالب الأساسي واستخدمنا مكان حاجز الكتلة. هذا هو ما يجعل لغة تصميم قالب Django فعالة للغاية، حيث يتيح لنا توفير الكثير من نسخ ولصق HTML.

بالحديث عن النموذج، نحن نستخدم الطريقة "post"، مما يعني أن ContactView سيعالج البيانات التي قدمها المستخدم ويرسل البريد الإلكتروني إذا كان النموذج صالحًا.

الرمز {% csrf_token %} إلزامي في كل نموذج بسبب أسباب الأمان. وثيقة Django تحتوي على صفحة مخصصة على رموز CSRF وأسباب استخدامها عند العمل مع النماذج.

سنقوم بعرض النموذج مع علامة القالب crispy، ولهذا السبب تم تحميل علامات التبطين المتقطعة مع {% load crispy_forms_tags %}.

أخيرًا، دعنا نكتب قالب success.html:

{% extends 'contact/base.html' %}

{% block body %}
<div class="mx-auto my-4 text-center">
    <h1 class="fw-bolder text-success">We sent your message</h1>
    <p class="my-5">You can send another in the <a href="{% url 'contact:contact' %}">contact page</a></p>
</div>
{% endblock %}

كما ترون، إنها إعلان بسيط للنجاح يشمل رابطًا إلى نموذج الاتصال في حال كان المستخدم يرغب في إرسال رسالة أخرى.

دعنا نشغل الخادم مجددًا ونزور http://localhost:8000 (تأكد من تنشيط .venv وأنك داخل مجلد جذر المشروع):

python manage.py runserver

الصورة التالية تظهر كيف يبدو النموذج النهائي للاتصال.

وهذه صورة لرسالة النجاح.

وهنا صورة للبريد الإلكتروني في البريد الوارد.

التلخيص

تهانينا! لقد تعلمت كيف ترسل رسائل البريد الإلكتروني باستخدام Django وكيفية بناء نموذج اتصال Django أيضًا.

هناك طرق عديدة لإرسال رسائل البريد الإلكتروني باستخدام Django. في هذا البرنامج التعليمي، لقد قمت بإرسالها باستخدام عنوان بريدك الإلكتروني الشخصي، لكنني أرغب في استكشافك للأدوات الأخرى ودمجها في مشاريعك.

في هذا البرنامج التعليمي، قمنا بتغطية ما يلي:

  • كيفية إعداد إعدادات Django لخدمة رسائل البريد
  • كيفية استخدام حساب بريد إلكتروني شخصي لإرسال رسائل بريد في مشروع صغير
  • كيفية استخدام ملفات .env لاستخدام البيانات الحساسة في مشروع Django
  • كيفية بناء نموذج اتصال تلقائي

لمزيد من المعلومات حول Django، تحقق من “بناء تطبيق مشاركة الصور باستخدام Django”.

الأسئلة الشائعة حول كيفية إرسال بريد إلكتروني باستخدام Django

هل يمكنني إرسال بريد إلكتروني من Django؟

نعم، يمكنك إرسال بريد إلكتروني من تطبيق Django. يوفر Django إطار عمل لإرسال البريد الإلكتروني المضمن يجعل الأمر سهلاً نسبيًا لإرسال رسائل البريد.

كيفية إرسال بريد إلكتروني في Django؟

كما ورد في المقال أعلاه، ابدأ بتكوين إعدادات بريدك الإلكتروني في ملف settings.py لمشروع Django. تحتاج إلى تحديد تفاصيل خادم SMTP وبيانات الاعتماد. بمجرد تكوين إعدادات البريد، يمكنك إنشاء وإرسال رسائل بريد إلكتروني من رؤوس البرنامج النصي Django أو الوظائف. يمكنك استخدام وظيفة send_mail من django.core.mail.

لرسائل بريد إلكتروني أكثر تعقيدًا مع محتوى HTML، يمكنك استخدام نظام القوالب في Django لإنشاء قوالب بريد إلكتروني. هذا يتيح لك إنشاء رسائل بريد بتنسيقات غنية. يمكنك استخدام فئة EmailMessage لتضمين محتوى HTML في رسائل البريد الخاصة بك. لا تنس تشغيل python manage.py migrate لإنشاء جداول قاعدة البيانات اللازمة لإرسال البريد إذا لم تقم بذلك بالفعل.

كيفية إرسال بريد Outlook في Django؟

لإرسال بريد Outlook في Django، يمكنك استخدام ميزة إرسال البريد في Django مع إعدادات SMTP لـ Outlook. في ملف settings.py لمشروع Django الخاص بك، قم بتكوين إعدادات SMTP لـ Outlook. ستتيح هذه الإعدادات لـ Django الاتصال بخادم SMTP لـ Outlook لإرسال الرسائل.

كيفية استلام رسائل البريد في Django؟

في مشروع Django الخاص بك في settings.py، قم بتكوين إعدادات خادم البريد الوارد. عادةً ما تحتاج إلى تفاصيل خادم IMAP (Internet Message Access Protocol) لمزود البريد الإلكتروني الخاص بك، جنبًا إلى جنب مع بيانات التوثيق. بعد ذلك، استخدم مكتبة imaplib للاتصال بخادم بريدك الإلكتروني واسترداد الرسائل الإلكترونية. يمكنك القيام بذلك في عروض Django الخاصة بك أو الأوامر الإدارية المخصصة. بمجرد أن تحصل على رسالة بريد إلكتروني، يمكنك معالجتها، استخراج المعلومات، وتنفيذ أي تصرفات تحتاجها داخل تطبيق Django الخاص بك. قد يشمل ذلك تحليل محتوى البريد الإلكتروني، تخزين البيانات المتعلقة في قاعدة البيانات الخاصة بك، أو تشغيل تصرفات محددة بناءً على محتوى البريد الإلكتروني أو المرسل.

Source:
https://www.sitepoint.com/django-send-email/