发送根据收件人电子邮件客户端语言识别的多种语言版本的电子邮件

Sending email with multiple language versions recognized on the basis of the language in the receiver's email client

在主题中,我正在尝试实现发送基于接收方浏览器中的语言识别的多种语言版本的电子邮件。

例如,我想用英语和西班牙语发送同一封电子邮件,但收件人在他的首选(通过电子邮件提供商设置)语言版本中只会看到一个选项。

我试图在 https://tools.ietf.org/id/draft-ietf-slim-multilangcontent-14.html#Examples 的基础上构建它,但我不确定它是否可行,因为我没有找到该示例的任何有效实现。 我正在使用 Python 和 Pyramid Mailer。

我无法在一封电子邮件中正确设置 2 种不同的内容语言。

如果您知道是否可以发送此类电子邮件,请帮助我。

就像您 link 显示的示例一样,您必须有多个 MIME 部分,每个部分都有一个单独的 Content-Language: header.

这是重新创建示例的尝试。不幸的是,Python 似乎擦除 Content-Language: header 如果你用 suben['Content-Language'] = 'en-GB' 添加它并用 [=14= 将它移动到附件的 headers ],所以我不确定这是否会起作用。我添加的 Content-Disposition: 和 Python 添加的之间也存在讨厌的冲突。如果我使用 msg.add_attachment()suben, 'rfc822', 'inline'),我会收到一条愤怒的错误消息,指出 message/rfc822 部分不支持 'inline'。 (也许您需要为这种类型创建一个新的内容管理器?)

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) 发送它。

我不知道电子邮件客户端在实践中对这种结构的支持程度如何(如果有的话)。

这使用 Python 3.6 中经过大修的 EmailMessage class。如果你使用的是旧版本,这个接口是在 3.3 中引入的——但没有记录;旧版本仍然必须使用旧版 email.message.Message() class,但实际上,您需要升级。