【问题标题】:Send Email If Not Sent In Last 24 Hours如果在过去 24 小时内未发送,则发送电子邮件
【发布时间】: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 来自那里。可能应该多跳入文档中……我的错。

标签: python email smtplib


【解决方案1】:

为了知道您是否在过去 24 小时内发送过电子邮件,您需要记录发送电子邮件。您可以通过 Web 应用程序或许多其他方式将该信息存储在文本文件、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()

【讨论】:

  • 刚刚测试过,在我在脚本开头添加import time 后它似乎可以工作。谢谢。
【解决方案2】:

要确定过去 24 小时内是否发送过电子邮件,您可能需要编写脚本来检查邮件服务器日志。您没有提及您使用的是哪个 MTA,但我所知道的所有日志消息的输入和输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    相关资源
    最近更新 更多