发送元组列表作为电子邮件正文和原始电子邮件消息
Send a list of tuples as email body, and raw email message
我在这里做了一些研究,我确实看到了类似的问题(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)
您的数据结构在某种程度上是多维的。这意味着您必须首先访问哪个元组,然后是元组的元素。
尝试:
body = "%s,%s,%s,%s" % (mylist[0][0],mylist[0][1],mylist[0][2],mylist[0][3])
这将准备一个主体,其中包含在第一个元组中找到的项目。您可以通过将第一个 [0]
更改为 mylist
.
中的任何元组索引来更改您访问的元组
此外,不需要额外的两个 '
如果您的代码与所写的一样,那么我还没有对其进行测试,但正如 achi 在他们的回答中指出的那样,您的列表是多维的。事实上,您在索引时从列表中检索的项目周围有一组额外的括号,因此您不仅检索元组,而且随后将它们嵌套回另一个元组。另外:
- 格式字符串周围有一组额外的双引号。
- 您似乎在遍历列表中的每个元组(查询行),但在每次传递时生成并覆盖整个消息。
- 您通常不需要或不需要 Python 中的索引循环。相反,请尝试
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。
mylist
是一个二维结构——一个元组列表;在当前循环中,您实际上会得到列表中的前四个元组——而不是您期望的 4 个元组成员。
假设你想要每个元组,在单独的一行,这将为你得到它:
body = ''
for line in mylist:
body += "'%s,%s,%s,%s\n'"% (line[0],line[1],line[2],line[3])
请注意,每个新行都会附加 (+=
),并以一个换行符章节结束 (\n
)。
这将为您提供您可能实际期望的消息内容,但很可能无法解决您的问题“但我收到一封空 body.” 的电子邮件。
原因是消息中缺少任何headers;根据 RFC 5322 - 最新标准,必须至少有一个 From 和 Date headers。一些 MTA 非常宽容,即使没有他们也会接受邮件,但那是少数。
所以实际的 body 初始化应该是(而不是上面的空字符串):
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
注意 headers 之间的分隔符是 \r\n
- CRLF,并且 headers 与消息 body 之间用空行分隔。
顺便说一句,大多数用户使用 email.mime.text.MIMEText
class 及其周边包,恰恰不处理此 low-level 操作。
我在这里做了一些研究,我确实看到了类似的问题(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)
您的数据结构在某种程度上是多维的。这意味着您必须首先访问哪个元组,然后是元组的元素。
尝试:
body = "%s,%s,%s,%s" % (mylist[0][0],mylist[0][1],mylist[0][2],mylist[0][3])
这将准备一个主体,其中包含在第一个元组中找到的项目。您可以通过将第一个 [0]
更改为 mylist
.
此外,不需要额外的两个 '
如果您的代码与所写的一样,那么我还没有对其进行测试,但正如 achi 在他们的回答中指出的那样,您的列表是多维的。事实上,您在索引时从列表中检索的项目周围有一组额外的括号,因此您不仅检索元组,而且随后将它们嵌套回另一个元组。另外:
- 格式字符串周围有一组额外的双引号。
- 您似乎在遍历列表中的每个元组(查询行),但在每次传递时生成并覆盖整个消息。
- 您通常不需要或不需要 Python 中的索引循环。相反,请尝试
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。
mylist
是一个二维结构——一个元组列表;在当前循环中,您实际上会得到列表中的前四个元组——而不是您期望的 4 个元组成员。
假设你想要每个元组,在单独的一行,这将为你得到它:
body = ''
for line in mylist:
body += "'%s,%s,%s,%s\n'"% (line[0],line[1],line[2],line[3])
请注意,每个新行都会附加 (+=
),并以一个换行符章节结束 (\n
)。
这将为您提供您可能实际期望的消息内容,但很可能无法解决您的问题“但我收到一封空 body.” 的电子邮件。
原因是消息中缺少任何headers;根据 RFC 5322 - 最新标准,必须至少有一个 From 和 Date headers。一些 MTA 非常宽容,即使没有他们也会接受邮件,但那是少数。
所以实际的 body 初始化应该是(而不是上面的空字符串):
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
注意 headers 之间的分隔符是 \r\n
- CRLF,并且 headers 与消息 body 之间用空行分隔。
顺便说一句,大多数用户使用 email.mime.text.MIMEText
class 及其周边包,恰恰不处理此 low-level 操作。