Python异步函数发送邮件时时间戳未更新的问题
Python异步函数发送邮件时时间戳未更新的问题
我来帮你排查这个时间戳不更新的问题~其实原因很简单,咱们先看你代码里的关键问题:
问题根源
你把时间戳生成、主题拼接这些需要动态更新的逻辑,放在了while True循环的外面!这就导致这些值只在函数第一次执行时计算了一次,之后循环里只是重复使用这个旧值,完全没有重新获取当前时间,所以每次打印和邮件主题都是同一个时间戳。
另外还有两个小细节问题:
send_email函数定义了timestamp参数,但调用时没传值,而且函数内部又重新赋值了,这个参数完全没用,可以删掉- 把
import语句放在函数甚至循环里是非常不好的习惯,重复导入会浪费性能,也不符合Python代码规范
修改后的代码
我帮你把代码调整好了,关键修改点都做了优化:
import asyncio import datetime as dt import socket import getpass import win32com.client #Main Event loop to send emails async def send_email(): # 只初始化一次outlook对象,避免循环里重复创建 outlook = win32com.client.gencache.EnsureDispatch('Outlook.Application') hostname = socket.gethostname() user = getpass.getuser() to = "email.address@domain.com" while True: # 每次循环都重新获取当前时间,生成新的时间戳字符串 timestamp = dt.datetime.now() timestamp_string = timestamp.strftime("%d %B %Y %H:%M:%S") subject = f"Machine Status Check - {timestamp_string}" html_body = f""" Machine Name: {hostname} User ID: {user} """ # 发送邮件 new_email = outlook.CreateItem(0) new_email.To = to new_email.Subject = subject new_email.HTMLBody = html_body new_email.Send() print(f"Email Sent at {timestamp_string}") await asyncio.sleep(120) #Run the asyncio event loop async def main(): await send_email() #Start the event loop asyncio.run(main())
关键修改说明
- 统一导入模块:把所有
import移到文件最顶部,避免重复导入,代码更规范整洁 - 动态逻辑移到循环内:把
timestamp、timestamp_string、subject这些需要每次更新的内容,放到while True循环内部,这样每次循环都会重新获取当前时间,生成新的主题 - 优化outlook初始化:把outlook对象的创建移到循环外面,避免每次发送邮件都重新初始化,提升运行性能
- 移除无用参数:删掉了
send_email函数里没用的timestamp参数,调用时也不用传值了
现在你再运行代码,应该就能看到每次打印和邮件主题的时间戳都是最新的啦~
备注:内容来源于stack exchange,提问作者excelman
相关产品推荐
相关产品推荐

