python - 如何修复 AttributeError:“列表”对象没有属性“编码”
问题描述
我正在尝试发送带有 html 附件的邮件,其中包含来自 Pandas 数据框的表格和 Python 3.7 中的一些绘制图像。当提供的数据帧中的数据不为空并且因此有要发送的绘图图像时,我不会遇到错误。我还在列表中收集发生的错误,并将它们添加到我想与邮件一起发送的最终字符串中。
def mailMe():
# Create the container email message.
msg = EmailMessage()
msg['Subject'] = 'Mail'
msg['From'] = sender
msg['To'] = receiver
#style overview table
htmlTable = (
df.style
.set_table_styles(styles)
.applymap(color_negative_red)
.set_caption('Auswertung')
.render()
)
#attach 100 dpi images
if not len(pngfiles100)==0:
for file in pngfiles100:
try:
with open(r'.\\temp\\'+file, 'rb') as fp:
img_data = fp.read()
msg.add_attachment(img_data, maintype='image',
subtype=imghdr.what(None, img_data),
filename=file)
except:
continue
fp.close()
#Error messages
htmlTable+='\n'+'<p style="font-family:Arial;"><b>Errors:</b></p>'
if not len(errors)==0:
for i in errors:
htmlTable+='\n'+'<p style="font-family:Arial;">'+i+'</p>'
pngFolder=r'.\\temp\\'
htmlTable+="""
<table>
<tbody>
"""
i=0
for col in df.columns:
tempDf=pd.DataFrame(data=df[col])
tmpHtml = (
tempDf.style
.set_table_styles(styles)
.applymap(color_negative_red)
.render()
)
if not len(pngfiles50)==0:
#embed 50 dpi images in mail
htmlTable+=u'\n'+'<tr><td>'+tmpHtml+'</td>'+'<td><img src="cid:image'+str(i+1)+'"></td></tr>'+u'\n'
try:
fp=open(pngFolder+pngfiles50[i],'rb')
msgImage = MIMEImage(fp.read())
fp.close()
msgImage.add_header('Content-ID','<image'+str(i+1)+'>')
msg.attach(msgImage)
except:
continue
i+=1
htmlTable+="""
</tbody>
</table>
"""
# Send the email via our own SMTP server.
with smtplib.SMTP(host) as s:
htmlTable = MIMEText(htmlTable,"html")
msg.attach(htmlTable)
s.send_message(msg)
追溯:
Traceback (most recent call last):
File "c:\Users\mmai\.vscode\extensions\ms-python.python-2019.8.30787\pythonFiles\ptvsd_launcher.py", line 43, in <module>
main(ptvsdArgs)
File "c:\Users\mmai\.vscode\extensions\ms-python.python-2019.8.30787\pythonFiles\lib\python\ptvsd\__main__.py", line 432, in main
run()
File "c:\Users\mmai\.vscode\extensions\ms-python.python-2019.8.30787\pythonFiles\lib\python\ptvsd\__main__.py", line 316, in run_file
runpy.run_path(target, run_name='__main__')
File "C:\Users\mmai\AppData\Local\Programs\Python\Python37-32\lib\runpy.py", line 263, in run_path
pkg_name=pkg_name, script_name=fname)
File "C:\Users\mmai\AppData\Local\Programs\Python\Python37-32\lib\runpy.py", line 96, in _run_module_code
mod_name, mod_spec, pkg_name, script_name)
File "C:\Users\mmai\AppData\Local\Programs\Python\Python37-32\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "c:\Users\mmai\Documents\Python\Mail.py", line 1043, in <module>
OEM()
File "c:\Users\mmai\Documents\Python\Mail.py", line 168, in __init__
self.mailMe()
File "c:\Users\mmai\Documents\Python\Mail.py", line 1035, in mailMe
s.send_message(msg)
File "C:\Users\mmai\AppData\Local\Programs\Python\Python37-32\lib\smtplib.py", line 964, in send_message
g.flatten(msg_copy, linesep='\r\n')
File "C:\Users\mmai\AppData\Local\Programs\Python\Python37-32\lib\email\generator.py", line 116, in flatten
self._write(msg)
File "C:\Users\mmai\AppData\Local\Programs\Python\Python37-32\lib\email\generator.py", line 181, in _write
self._dispatch(msg)
File "C:\Users\mmai\AppData\Local\Programs\Python\Python37-32\lib\email\generator.py", line 214, in _dispatch
meth(msg)
File "C:\Users\mmai\AppData\Local\Programs\Python\Python37-32\lib\email\generator.py", line 427, in _handle_text
if _has_surrogates(msg._payload) and not self.policy.cte_type=='7bit':
File "C:\Users\mmai\AppData\Local\Programs\Python\Python37-32\lib\email\utils.py", line 57, in _has_surrogates
s.encode()
AttributeError: 'list' object has no attribute 'encode'
s.send_message(msg) 似乎有问题,但我无法理解它。发送者和接收者都是字符串而不是列表。
通过添加解决它 msg.add_attachment(htmlTable)
解决方案
这可能会帮助您:
"".join(s).encode()
推荐阅读
- latex - 背页中的 12pt,Latex 对应于 Microsoft Word 中的字体 12?
- javascript - (节点:1984)UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“电子邮件”
- php - PHP日期函数不尊重 date_default_timezone_set
- wordpress - Nginx 反向代理:如何反向代理在外部 IP 上运行的 wordpress 站点
- git - 克隆一个镜像的本地 Git 存储库
- python - Python - 如何将过滤器应用于视频?
- python - 如何登录多个 Telegram 帐户并向群组发送消息
- javascript - Azure Functions Blobtrigger 读取文件并将数据存储在数据库中
- python - 更好的 Pandas 方法来计算不同列中值的频率
- json - 将json的第二个字段变成小写