当我尝试在python上安排每日电子邮件时,如何修复此错误



我每天都试图通过电子邮件向自己发送一个数据帧。我已经走了这么远,一切都正常,但当我试图在特定的时间发送它时,我会收到这个错误

"第一个参数必须是可调用的"-引用了我在括号内调用函数的事实。

有什么办法解决这个问题吗?同样,现在我已经设置好了,如果我关闭程序,它会继续运行脚本以便每天执行吗?

谢谢,

def email_new(df):
message = MIMEMultipart()
message['Subject'] = "Subject"
message['From'] = 'email@outlook.com'
message['To'] = 'email@gmail.com'

html = MIMEText(df.to_html(index=False), "html")
message.attach(html)
with smtplib.SMTP("smtp.office365.com", 587) as server:
server.starttls()
server.login('email@outlook.com','password')
server.sendmail('email@outlook.com', 'email.edu', message.as_string())


schedule.every().day.at('17:40').do(email_new(df))

while True: 
schedule.run_pending()
time.sleep(1)

do()在第二个参数中获取要传递给函数的参数

schedule.every().day.at('17:40').do(email_new,df)

我不熟悉这个.do方法,但通常情况下,您可以使用functools.partial部分实例化email_new函数。通过这种方式,您可以直接将部分实例化的email_new函数传递给.do方法。

让我们从一个玩具例子开始:

from functools import partial

def add_two_numbers(x, y):
return x + y
add_5_10 = partial(add_two_numbers, 5, 10)
print(add_5_10())  # 15

现在用你的例子:

from functools import partial

def email_new(df):
message = MIMEMultipart()
message['Subject'] = "Subject"
message['From'] = 'email@outlook.com'
message['To'] = 'email@gmail.com'

html = MIMEText(df.to_html(index=False), "html")
message.attach(html)
with smtplib.SMTP("smtp.office365.com", 587) as server:
server.starttls()
server.login('email@outlook.com','password')
server.sendmail('email@outlook.com', 'email.edu', message.as_string())

email_new_df = partial(email_new, df)
schedule.every().day.at('17:40').do(email_new_df)
while True: 
schedule.run_pending()
time.sleep(1)

至于在你离开笔记本电脑时的日程安排,我建议你学习Cron Jobs。但是,你的笔记本电脑必须是清醒的,并且能够执行这个过程。在这种情况下,也许远程电脑或树莓派可能是个好主意。

请参阅向函数传递参数的调度模块示例:https://schedule.readthedocs.io/en/stable/examples.html#pass-对工作的争论

将函数的参数作为附加参数传递给do方法。对于您的日程安排,您将使用

schedule.every().day.at('17:40').do(email_new, df)

相关内容

最新更新