MIMEText - у объекта нет атрибута «кодировать» (SMTP) - PullRequest
2 голосов
/ 02 июня 2019

Я пытаюсь заставить моего пи отправлять электронные письма о его IP через Gmail, основываясь на этой ссылке .

Из того, что я прочитал в этой теме Я должен получать строку вывода оболочки в переменной 'output1' при использовании .stdout.decode ().Но в отличие от обычных строк, таких как «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'

Может кто-нибудь объяснить, почему на выходе оболочки всегда отсутствует атрибут «закодировать», несмотря на декодированиеэто в '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()

1 Ответ

0 голосов
/ 02 июня 2019

Ваше утверждение output1.stdout.decode('us-ascii') не имеет никакого эффекта.Он декодирует вывод, но результат никогда не сохраняется.В строке message = MIMEText(output1) вы передаете результат subprocess.run(), который является объектом типа CompletedProcess.Вы должны были передать декодированный текст вместо этого.Итак:

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