如何使用 Amazon SES 在 Django 中发送 promotional/mass 邮件并隐藏其他收件人
How to send promotional/mass mail in Django with Amazon SES and hide other recipients
我在网上冲浪了一天,但没有找到提供群发电子邮件最佳实践的完美文章。
我已经使用 django-ses
配置了 Amazon SES,并且邮件发送正确。现在的问题是我不知道人们如何发送群发邮件,隐藏其他收件人,他们使用什么功能,以及他们遵循什么模式来使发送群发邮件变得高效和轻松。
此外,我们正在为邮件使用模板(Django 模板),下面是我通过混合我在互联网上找到的所有最好的东西获得的最佳解决方案:
# 1. Getting queryset of all recipients which will receive mail
# (mine is a little bit different but at the end, it gives queryset of all emails - not list)
subscribers = EmailNotificationSubscriber.objects.all().values_list('user__user_email', flat=True)
# 2. Opening a connection
# 3. [Looping] using `.iterator()` to fetch email one by one from queryset (I think this is to handle the cases where we have an email list of around 10k or even bigger)
# 4. Creating EmailMessage instance and sending an email using `.send()`
# Function to get HTML Message (instance of `EmailMessage`)
def get_html_msg(subject, from_email, to, template_name, ctx, connection=None):
message = get_template(os.path.join(settings.BASE_DIR, 'templates', 'email', template_name)).render(ctx)
msg = EmailMessage(subject, message, from_email, to, connection=connection)
msg.content_subtype = 'html'
return msg
# Function which sends mass mail
def send_mass_mail(subject, qs, mail_template='base.html', ctx=None, fail_silently=True, *args, **kwargs):
from_email = settings.EMAIL_FROM
with get_email_connection() as connection:
for recipient in qs.iterator():
print(f"Sending to recipient: {recipient}")
msg = get_html_msg(subject, from_email, [recipient], mail_template, ctx, connection)
msg.send(fail_silently)
以上是我正在做的:
- 只获取电子邮件而不是将其转换为列表,因此我可以使用
.iterator()
- 使用单一连接发送所有邮件
- 通过逐个发送邮件来使用循环隐藏其他收件人
(我将为所有收件人使用相同的模板,因此我稍后会重构它以提高性能)
那么,人们如何使用 Amazon SES 发送群发邮件?他们用别的东西吗?开源代码库或示例会有很大帮助。
非常感谢
编辑 1: 删除了表情符号
编辑 2: 缩小问题范围
根据你的问题,我认为首先,在发送群发邮件时,你应该考虑你的 SES 帐户的声誉,如果你决定购买收件人电子邮件列表,它可能会大幅下降。为了实现这一点,最好在 SES 中使用专用 IP。这是 link:https://docs.aws.amazon.com/ses/latest/DeveloperGuide/dedicated-ip.html
根据您的问题:
最好的方法是将它们包含在密件抄送中 header,正如您所设置的,限制可能取决于 SMTP 服务器。根据 AWS,每条消息有 50 个收件人。所以你可以做的是你可以将所有邮件分组并与 50 个收件人进行一次通话,这样可以显着降低你的请求数量。
群发邮件有两种方法。一个,您已经尝试过(所以一个接一个,另一个被认为更好 -> 如上所述批量发送)。如果您想检查一些关于批量发送的信息,您可以在那里看到它:https://aws.amazon.com/blogs/messaging-and-targeting/introducing-email-templates-and-bulk-sending/ 此外,最好只使用 BCC 字段。您确保自己不会在向其他用户的收件人显示电子邮件地址时出现任何错误。
检查我已经提供的links。
是的,是的。您可以轻松使用 amazon ses 模板,或创建您自己的模板。此外,自定义、管理您自己的域、配置集真的很有帮助,而且文档非常好。然而,有一些小缺点和一些小错误(例如,当您验证域时,它不会立即工作,有可能再次删除和添加它来修复它:))但是你必须小心关于您在 SES 上的声誉。
实践:
- 不要使用 TO/CC,而是使用 BCC
- 始终监控您的发送信誉,除非您希望您的帐户被阻止
- 投资专用 ips
- 屏蔽之前已经退回的邮件(亚马逊有自己的黑名单,不过最好多一份)
- 注意发送配额,您已经为您的目的分配和扩展了它
- 不要购买电子邮件列表
- 您可以在发送电子邮件之前验证收件人的电子邮件地址是否存在
- 注意违规行为
- 不要使用 link 缩短器
我在网上冲浪了一天,但没有找到提供群发电子邮件最佳实践的完美文章。
我已经使用 django-ses
配置了 Amazon SES,并且邮件发送正确。现在的问题是我不知道人们如何发送群发邮件,隐藏其他收件人,他们使用什么功能,以及他们遵循什么模式来使发送群发邮件变得高效和轻松。
此外,我们正在为邮件使用模板(Django 模板),下面是我通过混合我在互联网上找到的所有最好的东西获得的最佳解决方案:
# 1. Getting queryset of all recipients which will receive mail
# (mine is a little bit different but at the end, it gives queryset of all emails - not list)
subscribers = EmailNotificationSubscriber.objects.all().values_list('user__user_email', flat=True)
# 2. Opening a connection
# 3. [Looping] using `.iterator()` to fetch email one by one from queryset (I think this is to handle the cases where we have an email list of around 10k or even bigger)
# 4. Creating EmailMessage instance and sending an email using `.send()`
# Function to get HTML Message (instance of `EmailMessage`)
def get_html_msg(subject, from_email, to, template_name, ctx, connection=None):
message = get_template(os.path.join(settings.BASE_DIR, 'templates', 'email', template_name)).render(ctx)
msg = EmailMessage(subject, message, from_email, to, connection=connection)
msg.content_subtype = 'html'
return msg
# Function which sends mass mail
def send_mass_mail(subject, qs, mail_template='base.html', ctx=None, fail_silently=True, *args, **kwargs):
from_email = settings.EMAIL_FROM
with get_email_connection() as connection:
for recipient in qs.iterator():
print(f"Sending to recipient: {recipient}")
msg = get_html_msg(subject, from_email, [recipient], mail_template, ctx, connection)
msg.send(fail_silently)
以上是我正在做的:
- 只获取电子邮件而不是将其转换为列表,因此我可以使用
.iterator()
- 使用单一连接发送所有邮件
- 通过逐个发送邮件来使用循环隐藏其他收件人
(我将为所有收件人使用相同的模板,因此我稍后会重构它以提高性能)
那么,人们如何使用 Amazon SES 发送群发邮件?他们用别的东西吗?开源代码库或示例会有很大帮助。
非常感谢
编辑 1: 删除了表情符号
编辑 2: 缩小问题范围
根据你的问题,我认为首先,在发送群发邮件时,你应该考虑你的 SES 帐户的声誉,如果你决定购买收件人电子邮件列表,它可能会大幅下降。为了实现这一点,最好在 SES 中使用专用 IP。这是 link:https://docs.aws.amazon.com/ses/latest/DeveloperGuide/dedicated-ip.html
根据您的问题:
最好的方法是将它们包含在密件抄送中 header,正如您所设置的,限制可能取决于 SMTP 服务器。根据 AWS,每条消息有 50 个收件人。所以你可以做的是你可以将所有邮件分组并与 50 个收件人进行一次通话,这样可以显着降低你的请求数量。
群发邮件有两种方法。一个,您已经尝试过(所以一个接一个,另一个被认为更好 -> 如上所述批量发送)。如果您想检查一些关于批量发送的信息,您可以在那里看到它:https://aws.amazon.com/blogs/messaging-and-targeting/introducing-email-templates-and-bulk-sending/ 此外,最好只使用 BCC 字段。您确保自己不会在向其他用户的收件人显示电子邮件地址时出现任何错误。
检查我已经提供的links。
是的,是的。您可以轻松使用 amazon ses 模板,或创建您自己的模板。此外,自定义、管理您自己的域、配置集真的很有帮助,而且文档非常好。然而,有一些小缺点和一些小错误(例如,当您验证域时,它不会立即工作,有可能再次删除和添加它来修复它:))但是你必须小心关于您在 SES 上的声誉。
实践:
- 不要使用 TO/CC,而是使用 BCC
- 始终监控您的发送信誉,除非您希望您的帐户被阻止
- 投资专用 ips
- 屏蔽之前已经退回的邮件(亚马逊有自己的黑名单,不过最好多一份)
- 注意发送配额,您已经为您的目的分配和扩展了它
- 不要购买电子邮件列表
- 您可以在发送电子邮件之前验证收件人的电子邮件地址是否存在
- 注意违规行为
- 不要使用 link 缩短器