在Databricks用Python发HTML邮件报错‘list’对象无‘encode’属性
问题根源
错误直接触发原因是你给MIMEText传入的第一个参数messageHTML是列表类型,而MIMEText要求输入字符串类型,系统尝试调用字符串的encode方法编码内容时,列表没有这个方法就抛出了报错。除此之外你的代码还有另外3处逻辑错误,同步修复即可:
messageHTML定义为了列表,需要拼接为完整字符串sendEmail函数参数设计不合理,当前直接硬编码调用全局变量messageHTML,没有使用传入的text参数- 函数要求
receivers是列表类型,但你调用时传入的to_addr是单个字符串,执行', '.join(receivers)时会把字符串拆成单个字符拼接,导致收件人错误 - 调用
sendEmail时传入的第四个参数text没有提前定义,属于无效变量
修复后代码
Cmd1修改后内容
import smtplib from email import encoders from email.mime.text import MIMEText from email.mime.image import MIMEImage from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase from email.mime.application import MIMEApplication def sendEmail(sender, receivers, subject, html_content): msg = MIMEMultipart() msg['From'] = sender msg['BCC'] = ', '.join(receivers) msg['Subject'] = subject # 改用函数传入的html内容参数,移除硬编码全局变量逻辑 msg.attach(MIMEText(html_content, 'html')) text = msg.as_string() smtpObj = smtplib.SMTP('mySMTP') smtpObj.sendmail(sender, receivers, text)
Cmd2修改后内容
from_addr = 'addr1@mail.com' # 收件人统一改为列表格式,单个收件人也放在列表中 to_addr = ['addr2@mail.com'] # 把列表拼接为完整的HTML字符串 messageHTML = ''.join([ "<center><h1>Example Email Title</h1></center>", """ <p><b>A standard paragraph.</b></p> <ol> <li>This demonstrates a list.</li> </ol> """ ])
Cmd3修改后内容
# 传入正确的HTML内容变量 sendEmail(from_addr, to_addr, "My Email Subject Line", messageHTML)
修改完成后依次运行3个命令段即可正常发送HTML格式邮件。
内容的提问来源于stack exchange,提问作者TechWriter
相关产品推荐
相关产品推荐

