簡體   English   中英

發送元組列表作為電子郵件正文和原始電子郵件消息

[英]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在答案中指出的那樣,您的列表是多維的。 實際上,在索引時從列表中檢索的項目周圍有一組額外的括號,因此不僅可以檢索元組,還可以將它們直接嵌套到另一個元組中。 另外:

  • 格式字符串周圍有一組額外的雙引號。
  • 您似乎在列表中的每個元組(查詢行)上進行迭代,但在每次傳遞時生成並覆蓋整個消息。
  • 您通常不希望或需要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 )。 如果你想知道,字符串附加操作在大多數系統上應該是合理有效的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM