发送元组列表作为电子邮件正文和原始电子邮件消息

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 操作。