本文介绍了创建带有内嵌图像和 PDF 附件的 HTML 邮件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想用 Python/Django 写一个包含这些部分的 HTML 邮件:
I want to write a HTML mail in Python/Django containing these parts:
- HTML 链接到 logo.png
- logo.png 应该在邮件用户代理中内嵌显示(而不是作为附件)
- info.pdf 应显示为附件
- 邮件用户代理无法显示 HTML 时应显示的文本.
我关注了这篇博文.
结果:
- HTML 和内嵌图像有效
- 但是 info.pdf 文件被视为内联 logo.png,并且某些邮件用户代理不显示它:-(
如何在python中的一封邮件中创建两种方式(下载(info.pdf)和内联(logo.png))?
How to create both ways (download (info.pdf) and inline (logo.png)) in one mail in python?
推荐答案
我逆向工程使这个结构在实践中得到使用:
I reverse engineered that this structure gets used in practice:
+-------------------------------------------------------+
| multipart/mixed |
| |
| +-------------------------------------------------+ |
| | multipart/related | |
| | | |
| | +-------------------------------------------+ | |
| | | multipart/alternative | | |
| | | | | |
| | | +-------------------------------------+ | | |
| | | | text can contain [cid:logo.png] | | | |
| | | +-------------------------------------+ | | |
| | | | | |
| | | +-------------------------------------+ | | |
| | | | html can contain src="cid:logo.png" | | | |
| | | +-------------------------------------+ | | |
| | | | | |
| | +-------------------------------------------+ | |
| | | |
| | +-------------------------------------------+ | |
| | | image logo.png "inline" attachment | | |
| | +-------------------------------------------+ | |
| | | |
| +-------------------------------------------------+ |
| |
| +-------------------------------------------------+ |
| | pdf ("download" attachment, not inline) | |
| +-------------------------------------------------+ |
| |
+-------------------------------------------------------+
不幸的是,我只找到了这个复杂的解决方案:
Unfortunately I only found this complicated solution:
from django.core.mail.message import EmailMessage
def create_email(subject='', body='', from_email=None, to=None, bcc=None,
connection=None, attachments=[], headers=None,
cc=None, reply_to=None, html_body='', html_inline_attachments=[]):
message = _create_email(subject=subject, body=body, from_email=from_email, to=to, bcc=bcc,
connection=connection, headers=headers, cc=cc, reply_to=reply_to,
html_body=html_body, html_inline_attachments=html_inline_attachments)
for attachment in attachments:
if isinstance(attachment, basestring):
message.attach_file(attachment)
continue
message.attach(attachment)
return message
def _create_email(subject='', body='', from_email=None, to=None, bcc=None,
connection=None, headers=None,
cc=None, reply_to=None, html_body='', html_inline_attachments=[]):
if not (body or html_body):
raise ValueError('Missing body or html_body!')
for address, type, name in [
(from_email, basestring, 'from_email'),
(to, list, 'to'),
(cc, list, 'cc'),
(bcc, list, 'bcc')]:
if address and not isinstance(address, type):
raise ValueError('"{}" must be a list! ({})'.format(name, address))
if body and not html_body:
if html_inline_attachments:
raise ValueError('"html_body" is missing!')
return EmailMessage(subject=subject, body=body, from_email=from_email, to=to, bcc=bcc,
connection=connection, headers=headers, cc=cc,
reply_to=reply_to)
if not body:
body = html_to_text(html_body)
msg = EmailMessage(subject=subject, from_email=from_email, to=to, bcc=bcc,
connection=connection, headers=headers, cc=cc, reply_to=reply_to)
alternative = MIMEMultipart('alternative')
alternative.attach(MIMEText(body.encode('utf8'), 'plain', 'utf8'))
alternative.attach(MIMEText(html_body.encode('utf8'), 'html', 'utf8'))
related = MIMEMultipart('related')
related.attach(alternative)
for inline in html_inline_attachments:
inline_attachment = msg._create_attachment(os.path.basename(inline), open(inline).read())
inline_attachment.add_header('Content-Disposition', 'inline')
inline_attachment.add_header('Content-ID', os.path.basename(inline))
related.attach(inline_attachment)
msg.attach(related)
return msg
如果有人有更简单的解决方案,请告诉我:-)
If someone has a simpler solution, please let me know :-)
这篇关于创建带有内嵌图像和 PDF 附件的 HTML 邮件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!