代码之家  ›  专栏  ›  技术社区  ›  user9265709

python3 mime和文件对象不工作

  •  0
  • user9265709  · 技术社区  · 6 年前

    我正在尝试为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 回复  |  直到 6 年前
        1
  •  0
  •   krock1516    6 年前

    我已经编辑了你的代码,应该可以了,请试试这个。。。

    有两件事需要改变 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\u newlines=True(bufsize=1)和使用Popen的默认参数有什么区别

    默认值为:universal\u newlines=False(意味着输入/输出被接受为字节,而不是Unicode字符串加上universal newlines模式处理(因此参数的名称,尽管这里的text\u模式可能是更好的名称)被禁用--您按原样获取二进制数据(除非Windows上的POSIX层弄乱了),bufsize=-1(意味着流被完全缓冲——使用默认的缓冲区大小)。

    universal\u newlines=True使用区域设置。getpreferredencoding(False)字符编码来解码字节(这可能不同于代码中使用的ascii编码)。

    如果universal\u newlines=False,则表示Robocopy中的行。标准输出:迭代b’\n’-分隔行。如果进程的输出使用非ascii编码,例如UTF-16,则即使操作系统。linesep==“\n”在您的系统上;你可能会得到错误的结果。如果要使用文本行,请使用文本模式:pass universal\u newlines=True或使用io。TextIOWrapper(process.stdout)显式。

    第二个版本确实包含universal\u换行符,因此我指定了一个bufsize。

    通常,如果使用universal\u换行符,则无需指定bufsize(可以指定,但不是必需的)。在您的案例中,不需要指定bufsize。bufsize=1启用line bufferred模式(如果要写入process.stdin,则会在换行符上自动刷新输入缓冲区),否则它等效于默认的bufsize=-1。