繁体   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