我在这里做了一些研究,我确实看到了类似的问题(Send formatted list of tuples as body of an email)
但是我的元组不是一对,我的元组是SQL查询结果,如:
mylist =[('Mike','Boston','32','doctor'),('kate','Boston','32','doctor')....]
然后我尝试了以下格式
body = "'%s,%s,%s,%s'"% (mylist[0],mylist[1],mylist[2],mylist[3])
但我收到一封空身的电子邮件。
smtpObj.sendmail(sender, receivers, message)
我的代码有什么问题?谢谢你的帮助。
我在电子邮件中的代码是:
import smtplib
sender = 'xxxxxxx@gmail.com'
receivers = ['xxxxxxxx@gmail.com']
i=0
while (i<len(mylist)):
message ="'%s,%s,%s,%s'"% (mylist[0],mylist[1],mylist[2],mylist[3])
i=i+1
smtpObj = smtplib.SMTP('**********')
smtpObj.sendmail(sender, receivers, message)
答案 0 :(得分:1)
您的数据结构在某种程度上是多维的。这意味着你必须首先访问,哪个元组然后是元组的元素。
尝试:
body = "%s,%s,%s,%s" % (mylist[0][0],mylist[0][1],mylist[0][2],mylist[0][3])
这将准备一个包含第一个元组中找到的项目的主体。您可以通过将第一个[0]
更改为mylist
中的元组索引来更改您访问的元组。
此外,无需额外的两个'
答案 1 :(得分:1)
mylist
是一个二维结构 - 一个元组列表;使用当前循环,您实际上将获得列表中的前四个元组 - 而不是您所期望的4个元组成员。
假设你想要每个元组,在一个单独的行上,这将为你得到它:
body = ''
for line in mylist:
body += "'%s,%s,%s,%s\n'"% (line[0],line[1],line[2],line[3])
注意每个新行都会附加(+=
),并以新行章节(\n
)结束。
这将为您提供您可能实际期望的消息内容,但很可能无法解决您的问题“但我会收到一封空白的电子邮件。”。
原因是消息中没有任何标题;根据{{3}} - 最新标准,必须至少有一个From和Date标题。一些MTA非常宽容,并且会接受没有它们的消息,但这些是少数群体。
所以实际的身体初始化应该是(而不是那里的空字符串):
import datetime
date = datetime.datetime.now().strftime( "%d/%m/%Y %H:%M" )
body = 'From: %s\r\nDate: %s\r\n\r\n'% (sender, date)
# the loop follows
请注意标题之间的分隔符为\r\n
- CRLF,标题与邮件正文分隔为空行。
顺便说一句,大多数用户都使用email.mime.text.MIMEText
类及其周围的包,而不是处理这种低级操作。
答案 2 :(得分:0)
如果您的代码是书面形式,那么我还没有对其进行测试,但正如achi在答案中指出的那样,您的列表是多维的。实际上,在索引时从列表中检索的项目周围有一组额外的括号,因此不仅可以检索元组,还可以将它们直接嵌套到另一个元组中。此外:
for e in list:
范例。然后,只需在遍历列表时将每个格式化的元组附加到您的消息中。全部放在一起:
mylist =[('Mike','Boston','32','doctor'), ('kate','Boston','32','doctor'), ...]
for row in mylist:
message += '%s, %s, %s, %s' % row
...
smtpObj = smtplib.SMTP(...)
smtpObj.sendmail(sender, receiver, message)
请注意,在上面的示例中,row
是来自mylist
的元组,因此在生成字符串时会直接使用它(即不是(row)
,而是row
)。如果您想知道,字符串会在大多数系统上附加操作should be reasonably efficient。