【问题标题】:How to send promotional/mass mail in Django with Amazon SES and hide other recipients如何使用 Amazon SES 在 Django 中发送促销/群发邮件并隐藏其他收件人
【发布时间】:2020-11-05 06:16:39
【问题描述】:

我在网上浏览了一天,但没有找到完美的文章,它提供了发送大量电子邮件的最佳实践。

我已使用 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)

以上是我正在做的:

  1. 只获取电子邮件而不将其转换为列表,以便我可以使用.iterator()
  2. 使用单一连接发送所有邮件
  3. 通过逐一发送邮件来使用循环隐藏其他收件人

(我将为所有收件人使用相同的模板,因此稍后我将对其进行重构以提高性能)

那么,人们如何使用 Amazon SES 发送群发邮件?他们是否使用了其他东西?一个开源代码库或示例会很有帮助。

非常感谢

编辑 1: 删除表情符号

编辑 2: 缩小问题

【问题讨论】:

  • 这是一个专业的网站;请相应地写,使用文字而不是表情符号。
  • 感谢@CodyGray。我真的很抱歉,因为我不知道表情符号的使用。我已经更新了我的问题。感谢您指引我正确的方向。
  • 当然,没问题。感谢更新。但是,对于 Stack Overflow,您的问题仍然过于宽泛,因为您要问 许多 不同的问题,其中一些问题本身非常宽泛(例如,第 5 点,“最佳实践”)。这就是您的问题已关闭的原因。我建议将其分解为多个问题,并尝试让它们专注于特定的编程问题。请在How to Askwhat not to ask 上查看帮助中心的建议。
  • 嗨,@CodyGray 我将再次更新问题以缩小范围。我正在检查两个指南并将更新问题。问候。

标签: python django email amazon-ses django-ses


【解决方案1】:

根据您的问题,我认为首先,在发送群发邮件时,您应该考虑您的 SES 帐户的声誉,如果您决定购买收件人电子邮件列表,该声誉可能会大幅下降。为了实现这一点,最好在 SES 中使用专用 IP。这是链接:https://docs.aws.amazon.com/ses/latest/DeveloperGuide/dedicated-ip.html

根据您的问题:

  1. 最好的方法是将它们包含在密件抄送标头中,正如您设置的那样,限制可能取决于 SMTP 服务器。根据 AWS,每条消息有 50 个收件人。因此,您可以做的是您可以将所有邮件分组并与 50 个收件人一起拨打一个电话,这样可以显着降低您的请求金额。

  2. 群发邮件有两种方法。一个,你已经尝试过(所以一个一个,另一个被认为更好 -> 批量发送,如上所述)。如果您想检查一些关于批量发送的信息,您可以在此处查看:https://aws.amazon.com/blogs/messaging-and-targeting/introducing-email-templates-and-bulk-sending/ 此外,最好只使用密件抄送字段。您确保自己在向收件人显示其他用户的电子邮件地址时不会出现任何错误。

  3. 检查我已经提供的链接。

  4. 是的,是的。您可以轻松使用 amazon ses 模板,或创建自己的模板。此外,自定义、管理您自己的域、配置集确实很有帮助,并且文档非常好。但是有一些小缺点和一些小错误(例如,当您验证域时,它不能立即工作,有可能再次删除并添加它来修复它:))但是您必须小心关于您在 SES 上的声誉。

  5. 练习:

  • 不要使用 TO/CC,而是使用 BCC
  • 始终监控您的发送信誉,除非您希望阻止您的帐户
  • 投资专用 ips
  • 阻止之前已经退回的电子邮件(亚马逊有自己的黑名单,但最好多一个在您身边)
  • 注意发送配额,您已经分配并为您的目的扩展它
  • 不要购买电子邮件列表
  • 您可以在发送电子邮件之前验证收件人的电子邮件地址是否存在
  • 注意合规性
  • 不要使用链接缩短器

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-29
  • 1970-01-01
  • 2018-09-23
  • 2021-01-26
相关资源
最近更新 更多