You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python异步函数发送邮件时时间戳未更新的问题

Python异步函数发送邮件时时间戳未更新的问题

我来帮你排查这个时间戳不更新的问题~其实原因很简单,咱们先看你代码里的关键问题:

问题根源

你把时间戳生成、主题拼接这些需要动态更新的逻辑,放在了while True循环的外面!这就导致这些值只在函数第一次执行时计算了一次,之后循环里只是重复使用这个旧值,完全没有重新获取当前时间,所以每次打印和邮件主题都是同一个时间戳。

另外还有两个小细节问题:

  1. send_email函数定义了timestamp参数,但调用时没传值,而且函数内部又重新赋值了,这个参数完全没用,可以删掉
  2. 把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())

关键修改说明

  1. 统一导入模块:把所有import移到文件最顶部,避免重复导入,代码更规范整洁
  2. 动态逻辑移到循环内:把timestamp、timestamp_string、subject这些需要每次更新的内容,放到while True循环内部,这样每次循环都会重新获取当前时间,生成新的主题
  3. 优化outlook初始化:把outlook对象的创建移到循环外面,避免每次发送邮件都重新初始化,提升运行性能
  4. 移除无用参数:删掉了send_email函数里没用的timestamp参数,调用时也不用传值了

现在你再运行代码,应该就能看到每次打印和邮件主题的时间戳都是最新的啦~

备注:内容来源于stack exchange,提问作者excelman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 18:13:02