Python - 发送带有变量的 HTML 邮件

Python - sending HTML Mail with Variables

我想制作一个小型的 cronmailer 供我个人使用。这是不起作用的部分

# Create the body of the message (a plain-text and an HTML version).
text = "LOG OUTPUT: " + sys.argv[1] + "\n"
logdata = open(sys.argv[2], "rb") 
for row in logdata:
        text = text + row

html = """\
<html>
  <head></head>
  <body>
    <p>LOG OUTPUT: {0} <br> {1} 
    </p>
  </body>
</html>
""".format(unicode(str(sys.argv[1]),'utf-8'),  unicode(str(logdata),'utf-8'))


part1 = MIMEText(text, 'plain')
part2 = MIMEText(html, 'html')

msg.attach(part1)
msg.attach(part2)

server = smtplib.SMTP(str(server) + ":" + str(port))
server.starttls()
server.login(username,password)
server.sendmail(emailfrom, emailto, msg.as_string())
server.quit()   

我收到邮件了。使用纯文本和附件(将代码留在外面,因为它有效)。但不是 HTML 部分。我得到的唯一结果是:

<html>
  <head></head>
  <body>
    <p>LOG OUTPUT: test

感谢您的帮助,祝新年快乐

以下可能是构建 html 字符串(在 Python 2 中)的更好方法:

import cgi

text = "LOG OUTPUT: " + sys.argv[1] + "\n"
with open(sys.argv[2], "rb") as f:
    text += f.read()

html = """\
<html>
  <head></head>
  <body>
    <p>LOG OUTPUT: {0}<br/>
    <pre>{1}</pre>
    </p>
  </body>
</html>""".format(unicode(str(sys.argv[1]), 'utf-8'),
                  unicode(cgi.escape(text), 'utf-8'))

请注意,在 Python 3 中,转义函数是 html.escape(因此您最好不要将自己的变量命名为 html,因为它会发生冲突:-),但是对于 Python 2、这里的转义函数是特意命名的cgi.escape,这个应该可以吧