如何将Python脚本输出发送到电子邮件地址
我有一个用线程编写的Python脚本,它会对本地网络上的20个节点进行ping测试,并打印出每个节点的状态,比如“节点正常”、“节点宕机”等等。
我想把这些输出结果发送到我的邮箱,因为我打算让这个脚本每周自动运行一次。如果我不在本地网络旁边,就不用担心了,只需要查看我的邮箱就可以了。
编程语言:Python。操作系统:Linux Mint 10 Julia。谢谢!
6 个回答
7
与其让你的主程序直接用print
输出结果,不如用一个logger
来同时输出到屏幕和日志文件。
你可以按照日志使用手册来设置一个logger,方法如下:
import logging
log_file = r'C:\Users\user\Downloads\LogFileName.log'
logger = logging.getLogger('simple_example')
logger.setLevel(logging.INFO)
# create file handler which logs even debug messages
fh = logging.FileHandler('log_file')
fh.setLevel(logging.DEBUG)
# create console handler with a higher log level
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
# create formatter and add it to the handlers
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
fh.setFormatter(formatter)
# add the handlers to logger
logger.addHandler(ch)
logger.addHandler(fh)
接下来,把你脚本中的print
替换成logger.info
。
下面是替换前的例子:
print("Printing status")
下面是替换后的例子:
logger.info("Printing status")
然后你可以按照下面的方法把日志通过邮件发给自己:
import smtplib
from email.message import EmailMessage
import os
msg_body = "Body Text"
msg = EmailMessage()
msg['Subject'] = "Subject"
msg['From'] = "send_from@email.com"
msg['To'] = "send_to@email.com"
msg.set_content(msg_body)
if os.path.isfile(log_file):
msg.add_attachment(open(log_file, "r").read(), filename=os.path.basename(log_file))
# Send the message via our own SMTP server.
s = smtplib.SMTP("smtpa.server")
s.send_message(msg)
s.quit()
12
import smtplib
def prompt(prompt):
return raw_input(prompt).strip()
fromaddr = prompt("From: ")
toaddrs = prompt("To: ").split()
print "Enter message, end with ^D (Unix) or ^Z (Windows):"
# Add the From: and To: headers at the start!
msg = ("From: %s\r\nTo: %s\r\n\r\n"
% (fromaddr, ", ".join(toaddrs)))
while True:
try:
line = raw_input()
except EOFError:
break
if not line:
break
msg += line
print "Message length is " + repr(len(msg))
server = smtplib.SMTP('localhost')
server.set_debuglevel(1)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()
17
如果这个程序每周运行一次,你可能会通过 crontab 来设置它吧?
30 2 * * 5 python yourScript.py | mail -s outputFromScript your@email.address