我正在尝试实现群发邮件。
这是群发文件:Just a link to the Django Docs
为了实现这一点,我需要创建这个元组:

datatuple = (
    ('Subject', 'Message.', '[email protected]', ['[email protected]']),
    ('Subject', 'Message.', '[email protected]', ['[email protected]']),
)

我向orm查询一些收件人的详细信息。然后,我会想象每次向元组添加另一个收件人时,都会涉及一些循环。除用户名和电子邮件外,邮件的所有元素都相同。
到目前为止我有:
recipients = notification.objects.all().values_list('username','email')
# this returns [(u'John', u'[email protected]'), (u'Jane', u'[email protected]')]
for recipient in recipients:
     to = recipient[1]               #access the email
     subject = "my big tuple loop"
     dear = recipient[0]              #access the name
     message = "This concerns tuples!"
     #### add each recipient to datatuple
     send_mass_mail(datatuple)

我一直在尝试这样的方法:
SO- tuple from a string and a list of strings

最佳答案

如果我理解正确,这是非常简单的理解。

emails = [
    (u'Subject', u'Message.', u'[email protected]', [address])
    for name, address in recipients
]
send_mass_mail(emails)

注意,我们利用python将tuples解压成一组命名变量的能力。对于recipients的每个元素,我们将其第0个元素分配给name,将其第一个元素分配给address所以在第一次迭代中,nameu'John'addressu'[email protected]'
如果需要根据名称更改'Message.',则可以使用字符串格式或您选择的任何其他格式/模板机制来生成消息:
emails = [
    (u'Subject', u'Dear {}, Message.'.format(name), u'[email protected]', [address])
    for name, address in recipients
]

由于以上是列表理解,因此它们导致emails成为list。如果你真的需要它是tuple而不是list,那也很简单:
emails = tuple(
    (u'Subject', u'Message.', u'[email protected]', [address])
    for name, address in recipients
)

对于这个,我们实际上是将生成器对象传递到tuple构造函数中。这有使用生成器的性能优势,而无需创建中间list的开销在python中接受iterable参数的任何地方都可以这样做。

09-26 19:23