Я бы действительно рекомендовал использовать системное средство, предназначенное для таких запланированных заданий, для его регулярного запуска, например 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 секунд. Я предполагаю, что это было для тестирования.
Опять же, это, вероятно, не правильный выбор, как это сделать.