MIMEText - 对象没有属性“编码”(SMTP)
Posted
技术标签:
【中文标题】MIMEText - 对象没有属性“编码”(SMTP)【英文标题】:MIMEText - Object has no attribute 'encode' (SMTP) 【发布时间】:2019-10-18 05:57:51 【问题描述】:我正在尝试让我的 pi 基于this link,通过 Gmail 发送有关其 IP 的电子邮件。
根据我在this thread 中读到的内容,我应该在使用.stdout.decode() 时在'output1' 变量中获得shell 的字符串输出。但与“Hello World”等通常的字符串不同 - MIMEText() 中没有显示错误 - MIMEText(output1) 显示以下错误。
Traceback (most recent call last):
File "/home/upload/startup_mail.py", line 24, in <module>
message = MIMEText(output1)
File "/usr/lib/python3.5/email/mime/text.py", line 34, in __init__
_text.encode('us-ascii')
AttributeError: 'CompletedProcess' object has no attribute 'encode'
有人可以解释为什么 Shell 输出尽管解码为“us-ascii”,但总是缺少“encode”属性,以及如何正确处理 Shell 输出到 MIMEText()?
源码如下:
import subprocess
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import datetime
to = 'xxxx@gmail.com'
user = 'xxx@gmail.com'
us_p = 'xxxx'
smtpserv = smtplib.SMTP('smtp.gmail.com',587)
smtpserv.ehlo()
smtpserv.starttls()
smtpserv.ehlo()
smtpserv.login(user, us_p)
# run command in background console and get output
output1 = subprocess.run(['ip', 'route', 'list'], stdout=subprocess.PIPE)
output1.stdout.decode('us-ascii')
today = datetime.date.today()
msg = MIMEMultipart('alternative')
message = MIMEText(output1)
msg.attach(message)
msg['Subject'] = 'Pi Booted on %s' % today.strftime('%b %d %Y')
smtpserv.sendmail(user, [to], msg.as_string())
smtpserv.quit()
【问题讨论】:
【参考方案1】:您的声明output1.stdout.decode('us-ascii')
没有任何作用。它对输出进行解码,但从不存储结果。在message = MIMEText(output1)
行中,您传递subprocess.run()
的结果,它是CompletedProcess
类型的对象。您应该改为传递解码的文本。所以:
decoded_output = output1.stdout.decode('us-ascii')
message = MIMEText(decoded_output)
【讨论】:
如果你只有一个 body 部分,则不需要将它包装在一个 multipart 容器中。顾名思义,当您有多个部分时,多部分容器很有用。 真的很抱歉回复晚了!我不知道我必须将解码后的值分配给变量,它现在完美无缺。由于我缺乏声誉,我的投票不会出现,但我肯定会出现。感谢帮助! :)以上是关于MIMEText - 对象没有属性“编码”(SMTP)的主要内容,如果未能解决你的问题,请参考以下文章
如何修复 AttributeError:“列表”对象没有属性“编码”
错误 - AttributeError:'DirectoryIterator' 对象在 keras 的自动编码器设计中没有属性 'ndim