[英]Send a list of tuples as email body, and raw email message
我在這里做了一些研究,我確實看到了一個類似的問題( 發送格式化的元組列表作為電子郵件正文 )
但我的元組不是一對,我的元組是一個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)
mylist
是一個二維結構 - 一個元組列表; 使用當前循環,您實際上將獲得列表中的前四個元組 - 而不是您所期望的4個元組成員。
假設你想要每個元組,在一個單獨的行上,這將為你得到它:
body = ''
for line in mylist:
body += "'%s,%s,%s,%s\n'"% (line[0],line[1],line[2],line[3])
注意每個新行都附加( +=
),並以換行符章節( \\n
)結束。
這將為您提供您可能實際期望的消息內容,但很可能無法解決您的問題“但我會收到一封空白的電子郵件。”
原因是消息中沒有任何標題; 根據RFC 5322 - 最新標准,必須至少有一個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
類及其周圍的包,正好不能處理這種低級操作。
在某種程度上,您的數據結構是多維的。 這意味着你必須首先訪問,哪個元組,然后是元組的元素。
嘗試:
body = "%s,%s,%s,%s" % (mylist[0][0],mylist[0][1],mylist[0][2],mylist[0][3])
這將准備一個包含第一個元組中找到的項目的主體。 您可以通過將第一個[0]
更改為mylist
的元組索引來更改您訪問的元組。
此外,不需要額外的兩個'
如果您的代碼是按照書面編寫的,那么我還沒有對其進行測試,但正如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
)。 如果你想知道,字符串附加操作在大多數系統上應該是合理有效的 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.