MIMEText - 对象没有属性 'encode' (SMTP)

MIMEText - Object has no attribute 'encode' (SMTP)

我正在尝试让我的 pi 通过 Gmail 发送关于它的 IP 的电子邮件,基于 this link

根据我在 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 输出总是缺少 'encode' 属性,尽管它被解码为 'us-ascii',以及如何正确处理 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()

您的声明output1.stdout.decode('us-ascii')没有任何效果。它解码输出,但永远不会存储结果。在行 message = MIMEText(output1) 中,您传递 subprocess.run() 的结果,它是类型 CompletedProcess 的对象。您应该传递解码后的文本。所以:

decoded_output = output1.stdout.decode('us-ascii')
message = MIMEText(decoded_output)