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.