当当天的日期等于我在变量中设置的日期时,如何运行此代码?

时间:2015-05-24 06:41:40

标签: python email date datetime

我正在尝试在当前日期等于变量日期时发送电子邮件。

import smtplib


import datetime

date = datetime

fromaddr = "holidaysandspecialdates@gmail.com"
toaddrs  = 'noah.s.cha@gmail.com'
msg = input("Enter your message:")


# Credentials (if needed)
username = ''
password = ''

date = 2015-5-24

when datetime.date.today() == date:
    fromaddr = "holidaysandspecialdates@gmail.com"
    toaddrs  = 'noah.s.cha@gmail.com'
    msg = "CodeDay Ends Today!!!"
# The actual mail send
server = smtplib.SMTP('smtp.gmail.com:587')
server.starttls()
server.login(username,password)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()
print("Your message:" + "'" + msg + "'" + " has been sent to " + toaddrs + "."  ) 

3 个答案:

答案 0 :(得分:1)

认为您正在寻找的是程序启动的方式,然后等到日期为2015-5-25,然后发送消息。

执行此操作的简单方法是使用一些外部调度程序 - cronlaunchdScheduled Tasks或操作系统附带的任何内容。只需将其设置为在该日期尽早运行您的程序一次。 (如果你无法弄清楚如何做到这一点,你可能会想要AskUbuntu,AskDifferent等,这取决于你所使用的平台。)

如果你真的想在Python里面这样做,你可以。你需要的是一种入睡的方法,直到2015-5-25。为此,您可以使用sleep功能。但你需要知道睡多少秒。

import datetime
import time

target = datetime.datetime(2015, 5, 25)
time_to_sleep = target - datetime.datetime.now()
time.sleep(time_to_sleep.total_seconds())

请注意,我在2015-5-25之外创建了一个实际的date对象;只需在代码中使用2015-5-25,要求它从2015中减去5,然后从结果中减去25,这样就得到了整数1986,而不是日期。 (另外,我使用了datetime而不是date,所以它会一直睡到2015-5-25的开始,直到当天中午的任意时间。)

无论如何,这样做的一个大问题是你的程序必须坐在那里,什么都不做,好几天。如果有人意外重新启动您的计算机并且没有重新启动该程序,它将永远不会做任何事情。您的系统调度程序有办法解决该问题(系统每次打开时都会自动重新启动它,并立即检查所有计划任务以确保它没有错过任何一个),但是您没有(除非你希望每次你的系统开启直到时间结束时运行这个程序)。还存在各种较小的问题(参见JF Sebastian的一些评论),再次,您的系统调度程序已经知道如何解决,但是要么需要做更多工作,要么无法处理。

答案 1 :(得分:-1)

比较两个对象时,类型在Python中很重要

date = datetimi.date(2015, 5, 24)
if datetime.date.now().date() == date:
    fromeaddr = ""

date()调用将datetime对象限制为date部分

答案 2 :(得分:-2)

您必须将输入日期变量(字符串)转换为datetime类型

类似

my_date = raw_input("Give me a date: ")
Give me a date: 24/05/2015

my_date_as_obj = datetime.datetime.strptime(my_date, "%d/%m/%Y")

if datetime.date.today() == my_date_as_obj.date():
   # Date matches. Do something

另外 参考:Datetime Strftime