Проблема отправки персидских писем с помощью EmailMessage в django

Я довольно новичок в django и пытался отправить письмо, содержащее персидские буквы, используя django.core.mail.EmailMessage. Вот мой код:

from django.core.mail import EmailMessage
from django.conf import settings


def custom_sender(subject: str, body: str, recipient_list: list[str], attachments: list[str] = (), content_type_html: bool = False):
    try:
        email = EmailMessage(
            subject,
            body,
            settings.DEFAULT_FROM_EMAIL,
            recipient_list,
        )

        if content_type_html:
            email.content_subtype = "html"

        for attachment in attachments:
            email.attach_file(attachment)

        email.send()

    except Exception as e:
        print(f'\n\nFailed to send email: {e}\n\n')

и вот как я пытался использовать его в своем представлении :

custom_sender(subject='ایمیل تستی',
              body='این یک ایمیل تستی است.',
              recipient_list=[user.email])

но я столкнулся с этой ошибкой :

'charmap' codec can't encode character '\u06cc' in position 1: character maps to <undefined>

Я заметил, что не могу вывести персидские буквы в консоли в моем проекте django и постоянно сталкиваюсь с этой же ошибкой (это не происходит за пределами моего проекта django, и я могу вывести персидские буквы в консоли). кто-нибудь может сказать мне, что это за ошибка и как я могу ее исправить?

Я спрашивал у некоторых AI и перепробовал кучу решений, таких как кодирование темы и тела с помощью .encode('utf-8') и использование smart_str в django, или использование юникодных строк в python, как

u'این یک پیام تستی است'

Я даже пробовал возиться с setting.py django, например, попытаться изменить DEFAULT_CHARSET (хотя по умолчанию он уже установлен на 'utf-8') или изменить язык по умолчанию на персидский, чтобы посмотреть, поможет ли это, но ничего из этого не помогло, и ошибка осталась.

Во-первых, вам нужно настроить часовой пояс в файле settings.py :

import locale

LANGUAGE_CODE = 'fa-ir'

locale.setlocale(locale.LC_ALL, "fa_IR.UTF-8")

TIME_ZONE = 'Asia/Tehran'

USE_I18N = True

USE_L10N = True

USE_TZ = True

и затем настройте промежуточное ПО в файле settings.py следующим образом :

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    
    'django.middleware.locale.LocaleMiddleware',
    
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

Обратите внимание: Локальное промежуточное ПО должно располагаться после общего промежуточного ПО.

Для получения дополнительной информации смотрите этот пост.

Внесите эти изменения в ваш проект и отправьте дальнейшую информацию. Удачи.

Вернуться на верх