簡體   English   中英

AttributeError: 'list' object 在發送 email 時沒有屬性 'encode'

[英]AttributeError: 'list' object has no attribute 'encode' when sending an email

我想要這個代碼,我可以在其中有一個 csv 文件,在一行電子郵件旁邊有一排名稱,然后是 email 每個 email 在列表中但每個名稱都在消息中。 這是我的代碼:

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import csv


def nobrackets(current):
    return str(current).replace('[','').replace(']','')
def noastrick(current):
    return str(current).replace('\'','').replace('\'','')

email = 'xxxxxxxxxx'
password = 'xxxxxxxx'
send_to_email = []
subject = 'Whats up doc' # The subject line
message = ()
names = []
msg = MIMEMultipart()

msg['Subject'] = 'Whats up doc'

 # Attach the message to the MIMEMultipart object


server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
with open('Emails.csv','r') as csv_file:
    csv_reader=csv.reader(csv_file)
    for line in csv_reader:
        names.append(line[0])
        names_var = names
        send_to_email.append(line[1])
        send_to_email_var = send_to_email
        
        message = (f"Hey {noastrick(nobrackets(names_var))} how has your day been?")
        msg.attach(MIMEText(message, 'plain'))
        msg['From'] = 'xxxxxxxxx'

        msg['To'] = send_to_email_var

        server.login(email, password)
        text = msg.as_string() # You now need to convert the MIMEMultipart object to a string to send
        server.sendmail(email, send_to_email_var, text)
        names.clear()
        message = ()
        send_to_email = []
server.quit()

我得到的錯誤是 File/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/email/ _policybase.py ",第 369 行,在 _fold parts.append(h.encode(linesep=self.linesep , maxlinelen=maxlinelen))

AttributeError: 'list' object 沒有屬性 'encode'

我將列表更改為變量的原因是因為我認為這可能會解決我遇到的錯誤。 我對 python 有點陌生,我意識到錯誤在一個名為 _policybase.py 的文件中,它可能就像我安裝在我的計算機上的 python 應用程序中內置的一樣,但我不知道如何編輯該文件或修復那個錯誤。

問題是代碼將msg['to']設置為列表而不是字符串。 smtplib.server.sendmail將接受字符串列表作為其toaddrs參數,但 email 消息不接受(如果需要多個 to 地址,請為每個地址調用一次msg['to'] = address address)。

此外,不必對消息進行字符串化以發送它:而是使用smtplib.server.send_message

這段代碼應該可以工作:

with open('Emails.csv','r') as csv_file:
    csv_reader=csv.reader(csv_file)
    for line in csv_reader:
        names_var = line[0]
        send_to_email_var = line[1]

        msg = MIMEMultipart()
        msg['Subject'] = 'Whats up doc'
        message = (f"Hey {noastrick(nobrackets(names_var))} how has your day been?")
        msg.attach(MIMEText(message, 'plain'))
        msg['From'] = 'xxxxxxxxx'

        msg['To'] = send_to_email_var

        server.login(email, password)
        server.send_message(msg, email, send_to_email_var)
server.quit()

@snakecharmerb 的這個答案大部分是正確的:

問題是代碼將 msg['to'] 設置為列表而不是字符串。 smtplib.server.sendmail 將接受字符串列表作為其 toaddrs 參數,但 email 消息不接受(如果需要多個到地址,請為每個地址調用一次 msg['to'] = address)。

但是,您不需要通過 for 循環將郵件單獨發送給每個收件人。 相反,只需將列表作為逗號分隔的字符串分配給 msg["To"] ,如下所示:

msg["To"] = ", ".join(send_to_email_var)

暫無
暫無

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

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