我有一个应用程序将发送数千封电子邮件。我最初的计划是迭代每条记录并一次发出一封电子邮件,并从记录的UUID创建取消订阅链接。为了加快发送电子邮件,我改为使用EmailMultiAlternative和get_connection()来构建一个上下文
email = EmailMultiAlternatives()
email.subject = email_script.subject
email.from_email = DEFAULT_FROM_EMAIL
template = get_template('email/email_blast_template.html')
......
body = template.render(context)
connection = get_connection()
connection.open()
email.bcc = list(recipients)
email.body = body
email.attach_alternative(body, "text/html")
email.connection = connection
email.send()
connection.close()
无论如何我可以访问每封电子邮件的电子邮件地址,以便我可以建立取消订阅链接吗? request.META中是否存有信息?我在看那里的东西时遇到了一些麻烦。
If you wish to unsubscribe click <a href={% url unsubscribe email.uuid }}>here</a>
答案 0 :(得分:0)
我看不出你所指的是怎样的。您在示例代码中生成的电子邮件无法按收件人自定义,因为它是一封电子邮件(即,您不会为每个收件人生成唯一内容)。我看到的唯一解决方案是按照您最初的建议为每个收件人创建单独的电子邮件。
要做到这一点,您只能打开和关闭连接一次,甚至只渲染一次模板,但使用循环来实际准备和传递消息。这仍然比为每条消息重新生成内容和/或重新打开连接更有效。例如:
template = get_template('email/email_blast_template.html')
body = template.render(context)
connection = get_connection()
connection.open()
for recipient in recipients:
email = EmailMultiAlternatives()
email.subject = email_script.subject
email.from_email = DEFAULT_FROM_EMAIL
email.bcc = recipient
email.body = body.replace('{email}', recipient)
email.attach_alternative(body.replace('{email}', recipient), "text/html")
email.connection = connection
email.send()
connection.close()
使用上面的代码,您的正文模板只需要在取消订阅链接中包含“模板”标记(示例中为“{email}”)。该示例还使用实际的电子邮件地址,但如果您愿意,可以根据它生成唯一标识符。