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

时间:2018-02-23 04:13:02

标签: python tuples smtplib

我在这里做了一些研究,我确实看到了类似的问题(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)

3 个答案:

答案 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在答案中指出的那样,您的列表是多维的。实际上,在索引时从列表中检索的项目周围有一组额外的括号,因此不仅可以检索元组,还可以将它们直接嵌套到另一个元组中。此外:

  • 格式字符串周围有一组额外的双引号。
  • 您似乎正在遍历列表中的每个元组(查询行),但在每次传递时生成并覆盖整个消息。
  • 您通常不希望或需要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