MIME и файловый объект python3 не работают

Я пытаюсь использовать функцию почты ниже для python3, который выдает ошибку NameError: name 'file' is not defined который прекрасно работает для python2.

я должен знать file() is not supported in Python 3 что будет заменой file,

#!/usr/bin/env python3
from subprocess import Popen, PIPE
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import os
############ File comparison & sendmail part starts here ########
def ps_Mail():
    filename = "/tmp/ps_msg"
    f = file(filename)
    if os.path.exists(filename) and os.path.getsize(filename) > 0:
        mailp = Popen(["/usr/sbin/sendmail", "-t", "-oi"], stdin=PIPE)
        msg = MIMEMultipart('alternative')
        msg['To'] = "sam@seemac.com"
        msg['Subject'] = "Uhh!! Unsafe process seen"
        msg['From'] = "psCheck@seemac.com"
        msg1 = MIMEText(filename.read(),  'text')
        msg.attach(msg1)
        mailp.communicate(msg.as_string())
ps_Mail()

1 ответ

Решение

Я отредактировал ваш код, и это должно работать, попробуйте это...

Есть две ключевые вещи, которые нужно изменить universal_newlines=True и использовать open() вместо file(),

#!/usr/bin/env python3
from subprocess import Popen, PIPE
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import os
############ File comparison & sendmail part starts here ########
def ps_Mail():
    filename = "/tmp/ps_msg"
    f = open(filename)
    if os.path.exists(filename) and os.path.getsize(filename) > 0:
        mailp = Popen(["/usr/sbin/sendmail", "-t", "-oi"], stdin=PIPE, universal_newlines=True)
        msg = MIMEMultipart('alternative')
        msg['To'] = "sam@seemac.com"
        msg['Subject'] = "Uhh!! Unsafe process seen"
        msg['From'] = "psCheck@seemac.com"
        msg1 = MIMEText(filename.read(),  'text')
        msg.attach(msg1)
        mailp.communicate(msg.as_string())
ps_Mail()

Больше подробностей....

В чем разница между использованием universal_newlines=True (с bufsize=1) и использованием аргументов по умолчанию с Popen

Значения по умолчанию: universal_newlines=False (что означает, что ввод / вывод принимается как байты, а не строки Unicode плюс универсальная обработка в режиме новой строки (следовательно, имя параметра, хотя здесь text_mode могло бы быть лучше), отключено - вы получаете двоичные данные как есть (если только слой POSIX в Windows не испортил их) и bufsize=-1 (что означает, что потоки полностью буферизуются - используется размер буфера по умолчанию).

universal_newlines = True использует кодировку символов locale.getpreferredencoding(False) для декодирования байтов (которая может отличаться от кодировки ascii, используемой в вашем коде).

Если universal_newlines = False, то для строки в Robocopy.stdout: перебирает b'\n'-разделенные строки. Если процесс использует не-ascii-кодировку, например, UTF-16 для вывода, то даже если os.linesep == '\n' в вашей системе; Вы можете получить неправильный результат. Если вы хотите использовать текстовые строки, используйте текстовый режим: pass universal_newlines=True или используйте io.TextIOWrapper(process.stdout) явно.

Вторая версия включает в себя universal_newlines, и поэтому я указываю размер буфера.

В общем случае нет необходимости указывать размер bufsize, если вы используете universal_newlines (вы можете, но это не обязательно). И вам не нужно указывать bufsize в вашем случае. bufsize=1 включает режим буферизации строки (входной буфер очищается автоматически на новых строках, если вы пишете в process.stdin), в противном случае он эквивалентен значению по умолчанию bufsize=-1.

Другие вопросы по тегам