我正在尝试实现群发邮件。
这是群发文件: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将
tuple
s解压成一组命名变量的能力。对于recipients
的每个元素,我们将其第0个元素分配给name
,将其第一个元素分配给address
所以在第一次迭代中,name
是u'John'
而address
是u'[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参数的任何地方都可以这样做。