Отправить электронное письмо, если оно не было отправлено в течение последних 24 часов

Я работаю над скриптом на Python, который проверяет IP-адрес по черному списку и отправляет электронное письмо, только если IP-адрес отображается в списке. Сценарий будет настроен на запуск каждые 15 минут, но я хочу, чтобы он отправлял электронное письмо только в том случае, если IP-адрес есть в списке, а электронное письмо не было отправлено за последние 24 часа. Текущий код:

import sys
import subprocess
import smtplib
import datetime
username = ''
password = ''
fromaddr = ''
toaddr = ''
server = smtplib.SMTP(host=,port=)
server.starttls()
server.ehlo()
server.esmtp_features["auth"] = "LOGIN PLAIN"
server.login(username,password)
sentFolder = server.select("SENT",readonly=TRUE)
recentSent = sentFolder["Date"]
OneDayAgo = date.today()-timedelta(days=1)
msg = ''
staticIPAddress = ''
dnsHostname = staticIPAddress + ".bl.spamcop.net"
p = subprocess.check_output("nslookup " + dnsHostname1,stderr=subprocess.STDOUT,shell=False)
if ('Non-existent' not in str(p) and recentSent < OneDayAgo):
 server.sendmail(fromaddr, toaddrs, msg)

Ошибка, с которой я сталкиваюсь, возникает по адресу:
sentFolder = server.select("SENT",readonly=TRUE)

Код ошибки: AttributeError: 'SMTP' object has no attribute 'select'

Я протестировал остальную часть скрипта (без этой части и без частей недавнего отправления ‹ OneDayAgo), и, похоже, он работает нормально.

Мы будем очень признательны за любую помощь в выяснении того, как сделать «отправлять только, если не отправлено в течение последних 24 часов».


person Corey Christensen    schedule 29.01.2014    source источник
comment
Что вы ожидаете от server.select()? Вы нашли где-нибудь документацию, говорящую, что это будет делать?   -  person Robᵩ    schedule 29.01.2014
comment
@Robᵩ Я использовал это на основе этого вопроса SO.   -  person Corey Christensen    schedule 29.01.2014
comment
В этом вопросе M — это объект imaplib.IMAP4_SSL. В вашей программе server является smtplib.SMTP. Они совершенно не связаны.   -  person Robᵩ    schedule 29.01.2014
comment
Одна из возможностей — использовать Redis для хранения списка недавно отправленных адресов электронной почты. Redis позволяет сохранять значение с датой истечения срока действия. В вашем случае вы просто сохраните адрес электронной почты со сроком действия 24 часа. Затем вы можете просто проверить, существует ли электронная почта в Redis; если нет, то это не было отправлено по электронной почте в последнее время.   -  person chase    schedule 29.01.2014
comment
@Robᵩ Я понял, я просто предположил, что, поскольку он называется import smtplib, .select пришел оттуда. Наверное, надо было еще немного углубиться в документацию....мне плохо.   -  person Corey Christensen    schedule 29.01.2014


Ответы (2)


Чтобы узнать, отправляли ли вы электронное письмо за предыдущие 24 часа, вам необходимо сделать запись об отправке электронного письма. Вы можете хранить эту информацию в текстовом файле, папке IMAP, базе данных, через веб-приложение или многими другими способами. Как вы храните эти данные, зависит от вашего дизайнерского решения.

Вот одна из возможностей, в которой временная метка хранится в дате модификации локального файла.

#UNTESTED EXAMPLE CODE
def create_timestamp():
    with open("tsfile", "w") as fp:
        fp.write("now")

def time_since_last_timestamp():
    return time.time() - os.path.getmtime("tsfile")


...
if 'Non-existent' not in str(p) and time_since_last_timestamp() > 86400:
    server.sendmail(...)
    create_timestamp()
person Robᵩ    schedule 29.01.2014
comment
Только что протестировал его, и он работает после того, как я добавил import time в начало скрипта. Спасибо. - person Corey Christensen; 30.01.2014

Чтобы определить, было ли отправлено электронное письмо за последние 24 часа, вы можете запрограммировать свой сценарий для проверки журналов почтового сервера. Вы не упомянули, какой MTA вы используете, но все, что я знаю о входных и выходных сообщениях.

person mti2935    schedule 29.01.2014