【发布时间】:2014-01-30 04:03:14
【问题描述】:
我正在编写一个 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'
我已经测试了脚本的其余部分(没有那个片段,也没有最近发送的
任何帮助弄清楚如何制作“仅在过去 24 小时内未发送”的作品将不胜感激。
【问题讨论】:
-
您希望
server.select()做什么?您是否在某处找到说明它会做什么的文档? -
@Robᵩ 我根据this SO question使用了它。
-
在那个问题中,
M是一个imaplib.IMAP4_SSL对象。在您的程序中,server是一个smtplib.SMTP。它们完全不相关。 -
一种可能性是使用 redis 来存储最近通过电子邮件发送的地址列表。 Redis 允许您保存具有到期日期的值。在您的情况下,您只需存储 24 小时过期时间的电子邮件地址。然后你可以简单地检查邮件是否存在于redis中;如果没有,它最近没有通过电子邮件发送。
-
@Robᵩ 我明白了,我只是假设它调用了
import smtplib.select 来自那里。可能应该多跳入文档中……我的错。