如何使用 boto3 SES send_email
客户端发送图像附件?
我知道我可以使用 send_raw_email
发送附件,但我需要使用 html data
发送邮件正文。如果这不可能,我如何使用 boto3.ses.send_raw_email() 发送带有 html 数据的电子邮件?
原文由 DKo 发布,翻译遵循 CC BY-SA 4.0 许可协议
如何使用 boto3 SES send_email
客户端发送图像附件?
我知道我可以使用 send_raw_email
发送附件,但我需要使用 html data
发送邮件正文。如果这不可能,我如何使用 boto3.ses.send_raw_email() 发送带有 html 数据的电子邮件?
原文由 DKo 发布,翻译遵循 CC BY-SA 4.0 许可协议
在查阅了多个资源(包括其他 SO 问题、博客和 Python 文档)之后,我得出了以下代码。
允许文本和/或 html 电子邮件和附件。
分离 MIME 和 boto3 部分,以防你想将 MIME 重新用于其他目的,比如使用 SMTP 客户端而不是 boto3 发送电子邮件。
import os
import boto3
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
def create_multipart_message(
sender: str, recipients: list, title: str, text: str=None, html: str=None, attachments: list=None)\
-> MIMEMultipart:
"""
Creates a MIME multipart message object.
Uses only the Python `email` standard library.
Emails, both sender and recipients, can be just the email string or have the format 'The Name <the_email@host.com>'.
:param sender: The sender.
:param recipients: List of recipients. Needs to be a list, even if only one recipient.
:param title: The title of the email.
:param text: The text version of the email body (optional).
:param html: The html version of the email body (optional).
:param attachments: List of files to attach in the email.
:return: A `MIMEMultipart` to be used to send the email.
"""
multipart_content_subtype = 'alternative' if text and html else 'mixed'
msg = MIMEMultipart(multipart_content_subtype)
msg['Subject'] = title
msg['From'] = sender
msg['To'] = ', '.join(recipients)
# Record the MIME types of both parts - text/plain and text/html.
# According to RFC 2046, the last part of a multipart message, in this case the HTML message, is best and preferred.
if text:
part = MIMEText(text, 'plain')
msg.attach(part)
if html:
part = MIMEText(html, 'html')
msg.attach(part)
# Add attachments
for attachment in attachments or []:
with open(attachment, 'rb') as f:
part = MIMEApplication(f.read())
part.add_header('Content-Disposition', 'attachment', filename=os.path.basename(attachment))
msg.attach(part)
return msg
def send_mail(
sender: str, recipients: list, title: str, text: str=None, html: str=None, attachments: list=None) -> dict:
"""
Send email to recipients. Sends one mail to all recipients.
The sender needs to be a verified email in SES.
"""
msg = create_multipart_message(sender, recipients, title, text, html, attachments)
ses_client = boto3.client('ses') # Use your settings here
return ses_client.send_raw_email(
Source=sender,
Destinations=recipients,
RawMessage={'Data': msg.as_string()}
)
if __name__ == '__main__':
sender_ = 'The Sender <the_sender@email.com>'
recipients_ = ['Recipient One <recipient_1@email.com>', 'recipient_2@email.com']
title_ = 'Email title here'
text_ = 'The text version\nwith multiple lines.'
body_ = """<html><head></head><body><h1>A header 1</h1><br>Some text."""
attachments_ = ['/path/to/file1/filename1.txt', '/path/to/file2/filename2.txt']
response_ = send_mail(sender_, recipients_, title_, text_, body_, attachments_)
print(response_)
原文由 Joao Coelho 发布,翻译遵循 CC BY-SA 4.0 许可协议
2 回答5.2k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
2 回答874 阅读✓ 已解决
1 回答1.8k 阅读✓ 已解决
来自“ 如何使用 AMAZON SES 发送 HTML 邮件”的无耻复制示例 这就是典型的电子邮件数据内容的样子。
如果你想使用 boto3.ses.send_raw_email 发送附件和 HTML 文本,你只需要使用上面的消息字典并传递。 (只需将您的 html 文本放在 mail_content 下)
事实上,原始附件标头应该适用于 send_email() 和 send_raw_email() 。除了发送邮件,你应该把附件放在
Text
,而不是html
。