2014-01-29 29 views
0

我正在研究Python中的一個腳本,該腳本檢查黑名單中的IP地址,並僅在IP顯示在列表中時發送電子郵件。該腳本將設置爲每15分鐘運行一次,但我只希望它發送電子郵件,如果IP位於列表中,並且電子郵件在過去24小時內未發送。當前代碼:發送電子郵件如果在過去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'

我測試過的腳本的其餘部分(不包括那件和沒有最近Sent < OneDayAgo作品),它似乎工作正常。

任何幫助確定如何使「只發送,如果沒有在過去24小時內發送」一件作品將非常感激。

+0

你期待'server.select()'做什麼?你有沒有找到說明它會做什麼的文檔? –

+0

@Robᵩ我用這個基於[this](http://stackoverflow.com/questions/5572589/python-forward-imap-email-with-attachments-imaplib-smtplib)SO問題。 –

+0

在這個問題中,'M'是['imaplib.IMAP4_SSL'](http://docs.python.org/2/library/imaplib.html)對象。在你的程序中,'server'是一個[''smtplib.SMTP'](http://docs.python.org/2/library/smtplib.html)。它們完全無關。 –

回答

2

爲了知道您在過去24小時內是否發送過電子郵件,您需要記錄發送電子郵件的情況。您可以將這些信息存儲在文本文件,IMAP文件夾,數據庫,Web應用程序或其他許多方式中。您如何存儲數據是您的設計決策。

這裏有一種可能性,其中時間戳存儲在本地文件的修改日期中。

#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() 
+0

剛剛測試過它,並且在腳本開始處添加了「導入時間」後,它似乎可以正常工作。謝謝。 –

0

要確定過去24小時內是否發送了電子郵件,可能需要編寫腳本來檢查郵件服務器日誌。你沒有提到你正在使用哪個MTA,但是我所知道的所有日誌消息都是出入的。