У багатьох проєктах відправка електронних листів з вкладеннями є звичайною вимогою. У цій статті ми розглянемо, як налаштувати функціональність відправки електронних листів у Django для включення вкладень, використовуючи кастомний адаптер класу.
Налаштування кастомного адаптера для електронної пошти
Спочатку створимо кастомний адаптер, успадкувавши DefaultAccountAdapter
з Django. Цей адаптер буде відповідати за відправку електронних листів з вкладеннями.
from allauth.account.adapter import DefaultAccountAdapter
class CustomAccountAdapter(DefaultAccountAdapter):
current_site = 'yourdomain.com' def send_mail_with_attachment(self, template_prefix, email, context):
ctx = {
"email": email,
"current_site": context['current_site'],
}
ctx.update(context)
msg = self.render_mail(template_prefix, email, ctx) # Прикріплюємо файли до листа
if context.get('attachments'):
for attachment in context['attachments']:
file_name, content, content_type = attachment
msg.attach(file_name, content, content_type) msg.send() def send_files(self, request, user, email, files, **kwargs):
current_site = 'yourdomain.com'
recipient_email = email attachments = [] if files:
for index, uploaded_file in enumerate(files):
file = uploaded_file.file
filename = uploaded_file.filename
if uploaded_file.exam_date:
filename += f" {uploaded_file.exam_date.strftime('%Y-%m-%d')}"
existing_filenames = [attachment[0] for attachment in attachments]
while filename in existing_filenames:
filename += f"_{index}"
attachments.append((filename, file.read(), uploaded_file.content_type)) # Підготовка контексту листа
ctx = {
"user": user,
"file_nbr": len(files),
"current_site": current_site,
"attachments": attachments
} # Відправка листа
if recipient_email:
email_template = "email_templates/email_with_attachments"
self.send_mail_with_attachment(email_template, recipient_email, ctx)
Основні можливості
- Налаштування контексту листа: Словник
ctx
включає всі необхідні дані для рендерингу шаблону листа та управління вкладеннями. - Обробка вкладень: Метод
send_files
динамічно обробляє завантажені файли, забезпечуючи унікальні імена файлів і прикріплюючи їх до листа. - Використання шаблону: Вказавши префікс шаблону (наприклад,
email_templates/email_with_attachments
), ви можете створювати гнучкі та багаторазові дизайни листів.
Виклик адаптера
У вашому вигляді створіть екземпляр кастомного адаптера та викликайте метод send_files
:
from .adapter import CustomAccountAdapter
# Приклад використання в Django вигляді
class FileSendView(View):
def post(self, request):
user = request.user
email = request.POST.get('email')
files = request.FILES.getlist('files') adapter = CustomAccountAdapter()
adapter.send_files(
request=request,
user=user,
email=email,
files=files,
) return JsonResponse({"message": "Лист успішно надіслано!"})
Шаблон листа
Створіть простий шаблон листа, наприклад, email_templates/email_with_attachments.txt
:
Hello {{ user.username }},
Ви отримали {{ file_nbr }} файл(и), прикріплені до цього листа. Будь ласка, перевірте вкладення для деталей.
З найкращими побажаннями,
{{ current_site }}
Загальне використання
Це налаштування є універсальним і може бути адаптоване для будь-якого проєкту, де потрібно відправляти електронні листи з вкладеннями. Просто:
- Замініть
yourdomain.com
на домен вашого проєкту. - Налаштуйте шаблон листа відповідно до ваших потреб.
- Використовуйте метод
send_files
в будь-якому місці, де потрібно відправити електронні листи з вкладеннями.
Висновок
Розширюючи адаптер електронної пошти Django, ви отримуєте надійний та багаторазовий спосіб відправки листів з вкладеннями. Цей метод є масштабованим, і його можна налаштувати відповідно до зростання вашого проєкту. Спробуйте це і спростіть функціональність електронної пошти у вашому проєкті!
У багатьох проєктах відправка електронних листів з вкладеннями є звичайною вимогою. У цій статті ми розглянемо, як налаштувати функціональність відправки електронних листів у Django для включення вкладень, використовуючи кастомний адаптер класу.
Налаштування кастомного адаптера для електронної пошти
Спочатку створіть кастомний адаптер, успадкувавши DefaultAccountAdapter
з Django. Цей адаптер буде відповідати за відправку електронних листів з вкладеннями.
from allauth.account.adapter import DefaultAccountAdapter
class CustomAccountAdapter(DefaultAccountAdapter):
current_site = 'yourdomain.com' def send_mail_with_attachment(self, template_prefix, email, context):
ctx = {
"email": email,
"current_site": context['current_site'],
}
ctx.update(context)
msg = self.render_mail(template_prefix, email, ctx) # Прикріплюємо файли до листа
if context.get('attachments'):
for attachment in context['attachments']:
file_name, content, content_type = attachment
msg.attach(file_name, content, content_type) msg.send() def send_files(self, request, user, email, files, **kwargs):
current_site = 'yourdomain.com'
recipient_email = email attachments = [] if files:
for index, uploaded_file in enumerate(files):
file = uploaded_file.file
filename = uploaded_file.filename
if uploaded_file.exam_date:
filename += f" {uploaded_file.exam_date.strftime('%Y-%m-%d')}"
existing_filenames = [attachment[0] for attachment in attachments]
while filename in existing_filenames:
filename += f"_{index}"
attachments.append((filename, file.read(), uploaded_file.content_type)) # Підготовка контексту листа
ctx = {
"user": user,
"file_nbr": len(files),
"current_site": current_site,
"attachments": attachments
} # Відправка листа
if recipient_email:
email_template = "email_templates/email_with_attachments"
self.send_mail_with_attachment(email_template, recipient_email, ctx)
Основні можливості
- Налаштування контексту листа: Словник
ctx
включає всі необхідні дані для рендерингу шаблону листа та управління вкладеннями. - Обробка вкладень: Метод
send_files
динамічно обробляє завантажені файли, забезпечуючи унікальні імена файлів і прикріплюючи їх до листа. - Використання шаблону: Вказавши префікс шаблону (наприклад,
email_templates/email_with_attachments
), ви можете створювати гнучкі та багаторазові дизайни листів.
Виклик адаптера
У вашому вигляді створіть екземпляр кастомного адаптера та викликайте метод send_files
:
from .adapter import CustomAccountAdapter
# Приклад використання в Django вигляді
class FileSendView(View):
def post(self, request):
user = request.user
email = request.POST.get('email')
files = request.FILES.getlist('files') adapter = CustomAccountAdapter()
adapter.send_files(
request=request,
user=user,
email=email,
files=files,
) return JsonResponse({"message": "Лист успішно надіслано!"})
Шаблон листа
Створіть простий шаблон листа, наприклад, email_templates/email_with_attachments.txt
:
Hello {{ user.username }},
Ви отримали {{ file_nbr }} файл(и), прикріплені до цього листа. Будь ласка, перевірте вкладення для деталей.
З найкращими побажаннями,
{{ current_site }}
Загальне використання
Це налаштування є універсальним і може бути адаптоване для будь-якого проєкту, де потрібно відправляти електронні листи з вкладеннями. Просто:
- Замініть
yourdomain.com
на домен вашого проєкту. - Налаштуйте шаблон листа відповідно до ваших потреб.
- Використовуйте метод
send_files
в будь-якому місці, де потрібно відправити електронні листи з вкладеннями.
Висновок
Розширюючи адаптер електронної пошти Django, ви отримуєте надійний та багаторазовий спосіб відправки листів з вкладеннями. Цей метод є масштабованим, і його можна налаштувати відповідно до зростання вашого проєкту. Спробуйте це і спростіть функціональність електронної пошти у вашому проєкті!
Перекладено з: Creating Custom Emails with Attachments in Django