#python #email #multilingual #content-type #mailer
#python #Адрес электронной почты #многоязычный #тип содержимого #почтовая программа
Вопрос:
Как и в теме, я пытаюсь реализовать отправку электронной почты с несколькими языковыми версиями, распознанными на основе языка в браузере получателя.
Я хотел бы отправить одно и то же сообщение электронной почты, например, на английском и испанском языках, но получатель увидит только один вариант в своей предпочтительной (в настройках поставщика услуг электронной почты) языковой версии.
Я пытаюсь построить его на основе https://tools.ietf.org/id/draft-ietf-slim-multilangcontent-14.html#Examples , но я не уверен, возможно ли это вообще, потому что я не нашел ни одной рабочей реализации этого примера. Я использую Python и Pyramid Mailer.
Я не смог правильно установить 2 разных языка содержимого в одном сообщении электронной почты.
Пожалуйста, помогите мне, если у вас есть какие-либо идеи, возможно ли отправлять электронные письма такого типа.
Комментарии:
1. Как вы думаете, почему получатели будут использовать браузер для чтения своей электронной почты?
2. @tripleee Я имею в виду поставщиков электронной почты, таких как gmail или Thunderbird, извините, что ввел вас в заблуждение. Я изменю это.
Ответ №1:
Как показано в примере, на который вы ссылаетесь, у вас должно быть несколько частей MIME, каждая с отдельным Content-Language:
заголовком.
Вот попытка воссоздать образец. К сожалению, Python, похоже, удаляет Content-Language:
заголовок, если вы добавляете его с suben['Content-Language'] = 'en-GB'
помощью и перемещаете его в заголовки вложения с add_header
помощью , поэтому я не уверен, что это вообще сработает. Существует также досадный конфликт между Content-Disposition:
I add и тем, который добавлен Python. Если я использую msg.add_attachment()suben, 'rfc822', 'inline')
, я получаю сердитое сообщение об ошибке, в котором говорится 'inline'
message/rfc822
, что части не поддерживаются. (Может быть, вам нужно создать новый менеджер контента для этого типа?)
from email.message import EmailMessage
msg = EmailMessage()
msg['From'] = 'Nik@example.com'
msg['To'] = 'Nathaniel@example.com'
msg['Subject'] = 'Example of a message in Spanish and English'
msg['Content-Disposition'] = 'inline' # redundant?
msg.set_content = """
This is a message in multiple languages. It says the
same thing in each language. If you can read it in one language,
you can ignore the other translations. The other translations may be
presented as attachments or grouped together.
Este es un mensaje en varios idiomas. Dice lo mismo en
cada idioma. Si puede leerlo en un idioma, puede ignorar las otras
traducciones. Las otras traducciones pueden presentarse como archivos
adjuntos o agrupados.
"""
suben = EmailMessage()
# suben['Content-Language'] = 'en-GB'
suben['Content-Translation-Type'] = 'original'
# suben['Content-Disposition'] = 'inline' # redundant?
suben['Subject'] = 'Example of a message in Spanish and English'
suben.set_content("Hello, this message content is provided in your language.")
suben.add.header('Content-Language', 'en-GB')
suben.add_header('Content-Disposition', 'inline')
subes = EmailMessage()
# subes['Content-Language'] = 'es-ES'
subes['Content-Translation-Type'] = 'human'
# subes['Content-Disposition'] = 'inline' # redundant?
subes['Subject'] = 'Ejemplo práctico de mensaje en español e inglés'
subes.set_content("Hola, el contenido de este mensaje esta disponible en su idioma.")
subes.add_header('Content-Language', 'es-ES')
subes.add_header('Content-Disposition', 'inline')
msg.add_attachment(suben)
msg.add_attachment(subes)
msg.replace_header('Content-type', 'multipart/multilingual')
В целом это основано на примерах из https://docs.python.org/3/library/email.examples.html с некоторыми изменениями для этого довольно необычного многокомпонентного типа.
Демонстрация: https://ideone.com/T0AonQ показывает, что содержимое из первого set_content
удалено; если вы хотите поддержать это, добавление его другим способом (как другое вложение, я полагаю) должно быть простым.
Как показано в демонстрации, вы можете проверить источник сгенерированного сообщения с msg.as_string()
помощью и, в конечном итоге, отправить его smtplib.send_message(msg)
.
Я понятия не имею, насколько хорошо — если вообще — эта конструкция поддерживается почтовыми клиентами на практике.
При этом используется переработанный EmailMessage
класс из Python 3.6. Если вы используете более старую версию, этот интерфейс был представлен — но недокументирован — в 3.3; более старые версии по-прежнему должны будут использовать устаревший email.message.Message()
класс, но на самом деле вы захотите обновить.
Комментарии:
1. В качестве неопределенного обмана, если я помещу
msg.add_attachment(suben, 'RFC822', 'inline')
, я получу расположение содержимого: там, где я этого хочу. Хорошая догадка, принимают ли клиентыmessage/RFC822
в качестве синонима нижний регистрmessage/rfc822
.