在Python脚本中使用Pywin32和Outlook发送自动邮件正常,但通过Windows任务调度时不工作
我写了一个Python脚本,使用 win32com.client.Dispatch("Outlook.Application")
来通过Outlook发送自动邮件。
如果我自己运行这个脚本,一切都运行得很好。但是如果我通过Windows的 task scheduler
来运行它,就无法发送邮件了。
为了检查我是否正确运行了脚本,我让脚本输出一个随机的文本文件,这个是可以的,但邮件却不行。为什么呢?
3 个回答
我在自己做的一个Excel应用程序中也遇到过类似的问题。当我在排查故障时,系统会弹出一个Outlook的配置框,我根本无法绕过它。奇怪的是,这个对话框在定时执行的时候却不会出现。我找到了一种解决办法,就是使用CDO发送邮件。我知道你不是在用VBA,但这可能会给你提供一种替代的方法来发送邮件(就像我当时做的那样):http://www.rondebruin.nl/win/s1/cdo.htm
注意:我只有在将安全选项设置为“仅在用户登录时运行”时才能成功(我在自己的电脑上有完全的管理员权限,并且以最高权限运行)。我有一个强烈的猜测——虽然没有确认——在使用任务调度器时,可能会触发某些安全设置,至少在公司环境中是这样。
我之前遇到的类似问题已经解决了。我使用任务调度器来调用一个python脚本(通过批处理文件),这个脚本里用到了pywin32com模块。这个python代码可以打开Excel并调用一个宏。从python、命令行和批处理文件运行都没问题,但通过任务调度器运行时却不行。错误信息大概是这样的:“确保调用 disp = win32com.client.Dispatch(prog_id)”。
在这个讨论中提到,我把选项改成了“仅在用户登录时运行”,结果就成功了!
唯一的问题是,我安排任务的时间是在我不在电脑旁的时候。我想我只能不注销,然后希望电脑不会进入睡眠模式,不过在这种情况下,这也不是个大问题。
你在发邮件之前会加附件吗?我之前遇到过类似的问题,但现在一切正常。如果我的脚本里有两个不同的函数来发送邮件(比如一个是出错时发邮件,另一个是脚本成功运行时发邮件),那么在使用Outlook时,我会遇到“操作被中止”的错误。这是因为在其中一个函数里我会加附件,而在另一个函数里却不加。具体为什么我也不知道,但这就会导致错误。为了解决这个问题,我只需要在那个不需要附件的邮件里加一个多余的附件。
def emailComplete():
ol = DispatchEx("Outlook.Application")
Msg = ol.CreateItem(0)
Msg.To = "recip@ient.com"
Msg.Subject = "foo complete"
Msg.Attachments.Add("C:\Path\to\blank\attachment.txt") # send a blank attachment to stop the 'operation aborted' error
Msg.Send()
ol.Quit()
def emailError():
ol = DispatchEx("Outlook.Application")
Msg = ol.CreateItem(0)
Msg.To = "recip@ient.com"
Msg.Subject = "foo errored"
Msg.Attachments.Add("C:\path\to\error\file.txt") # send the error file with the email
Msg.Send()
ol.Quit()
这不是最优雅的解决办法,但至少让我能正常工作了!!