簡體   English   中英

AttributeError: 'list' object 沒有屬性 'encode'。 我如何通過 Excel 發送 Email? Python

[英]AttributeError: 'list' object has no attribute 'encode'. How do i send Email via Excel? Python

所以我試圖從 Excel 和 Python 發送一封電子郵件。現在我只在 A1 列中設置了所有電子郵件,用分號分隔。 如果我直接將電子郵件放入 Python,它們會發送出去,但是當我使用 Python 調用時,它給我這個錯誤嚇壞了。 我究竟怎樣才能使這項工作?

import smtplib
from email.mime.image import MIMEImage
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import pandas
from datetime import datetime

server = smtplib.SMTP('relay.xxx.com')
email_df = pandas.read_excel(f"E-mails.xlsx", sheet_name="Emails", nrows=1, usecols = "A")
sender = 'email@email.com'

receivers = 'Email'
receivers = list(email_df)

print(receivers)
msg = MIMEMultipart('related')

msg['Subject'] = 'Test mail'
msg['From'] = sender

with smtplib.SMTP('relay.xxx.com') as server:
    msg['To'] = receivers
    server.sendmail(sender, receivers, bytes(msg.as_string()))
    print(f"Successfully sent email to: {receivers}")

我不想發送多封電子郵件。 我想要一封電子郵件,地址欄中有一堆電子郵件。

或者,如果有一種方法可以按列讀取(a1 中的 addr1,a2 中的 addr),那也會更好。

欣賞它。

如果您可以將您的 email 地址(來自您的 df)放入所需格式的列表中,例如:

print(receivers)    
['email1@email1.com', 'email2@email2.com', 'email3@email3.com']

然后您可以在分配后添加它以將其轉換為 send_mail 的字符串(因為它需要字符串而不是列表):

receivers = ", ".join(receivers)

您提到,如果您的電子表格中 A 列下每行有一個 email 地址,那將是理想的。 因此,如果您可以將您的 Excel 電子表格轉換為這種格式(列標題為“電子郵件”),那么您可以這樣做以獲得上述列表:

email_df = pandas.read_excel(f"E-mails.xlsx", sheet_name="Emails", usecols = "A")
receivers = email_df['Email'].tolist()

因此,為了完整性(使用新格式的 Excel 電子表格,A 列下每行一個 email 地址),您的代碼將更改為:

import smtplib
from email.mime.image import MIMEImage
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import pandas
from datetime import datetime

server = smtplib.SMTP('relay.xxx.com')

email_df = pandas.read_excel(f"E-mails.xlsx", sheet_name="Emails")
receivers = email_df['Email'].tolist()

print(receivers)  # Check list is one valid email address per element

receivers = ", ".join(receivers)

sender = 'email@email.com'
msg = MIMEMultipart('related')

msg['Subject'] = 'Test mail'
msg['From'] = sender

with smtplib.SMTP('relay.xxx.com') as server:
    msg['To'] = receivers
    server.sendmail(sender, receivers, bytes(msg.as_string(), encoding='utf-8'))
    print(f"Successfully sent email to: {receivers}")

如果構建消息,最好使用send_message接口。 我建議使用較新的EmailMessage界面,它比舊的MimeMultipart界面更干凈、更簡單:

import smtplib
from email.message import EmailMessage

...
msg = EmailMessage()

msg['Subject'] = 'Test mail'
msg['From'] = sender

msg.set_payload('Message text.\nLine 2...')
# or eventually add parts with msg.add_related(...), msg.add_alternative(..)
#  or msg.add_attachment(...)


with smtplib.SMTP('relay.xxx.com') as server:
    msg['To'] = receivers
    server.send_messages(msg)
    print(f"Successfully sent email to: {receivers}")

暫無
暫無

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

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