我想在Python / Django中编写包含以下部分的HTML邮件:
结果:
我对这种结构进行了反向工程,以便在实践中使用:
+-------------------------------------------------------+ | 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) | | | +-------------------------------------------------+ | | | +-------------------------------------------------------+
不幸的是,我只发现了这个复杂的解决方案:
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!')