来自MS SQL数据库和Outlook的Python电子邮件通知
我创建了按时间顺序排列的python脚本:来自MS SQL数据库和Outlook的Python电子邮件通知,python,sql-server,outlook,automation,automated-deploy,Python,Sql Server,Outlook,Automation,Automated Deploy,我创建了按时间顺序排列的python脚本: 使用sqlalchemy库从MS SQL数据库中选择数据 engine = create_engine("mssql+pyodbc://server\database?driver=SQL Server?Trusted_Connection=yes") 对所选数据进行一些修改,并创建包含员工、电子邮件地址和一些附加信息的数据框 使用win32com.client库通过outlook向创建的数据框中的员工发送电子邮件,其中包
- 使用sqlalchemy库从MS SQL数据库中选择数据
engine = create_engine("mssql+pyodbc://server\database?driver=SQL Server?Trusted_Connection=yes")
- 对所选数据进行一些修改,并创建包含员工、电子邮件地址和一些附加信息的数据框
- 使用win32com.client库通过outlook向创建的数据框中的员工发送电子邮件,其中包含一些“定制”信息
outlook=win32.Dispatch('outlook.application')
目标是安排它每天自动运行。您不能在任何地方运行代码。
如果你在一家公司工作,请他们购买一个最小的VPS(虚拟专用服务器),这样它就可以一直运行。那很便宜。如果是出于私人需要,请为自己购买一个。通常,如果您有需要执行的代码或脚本,无论您需要使用何种语言将代码发布到可以执行代码的服务器或服务 虽然有许多方法可以自动从SQL Server发送电子邮件或报告,但您的特定脚本并不是常见的候选脚本之一。当您使用MS Outlook automation API打开Outlook并发送电子邮件时,要使其正常工作,需要在执行服务器上安装Outlook,并且需要在正确配置邮箱的用户配置文件的上下文中执行脚本。因此,简而言之,您的特定脚本需要用户登录,它只是自动化一个用户可以自己完成的过程 一种解决方案是让电脑保持开机状态,并使用Windows任务调度器(或您选择的任何脚本/进程调度器)安排要执行的脚本。如果这是一个关键的过程,您可以设置您的电脑在需要执行脚本之前唤醒,以便执行计划 要真正在无人参与的情况下运行,您需要更改脚本逻辑,以便不存在可能不可用的对本地用户配置文件配置的依赖关系。这意味着您需要手动实例化SMTP客户端以传输电子邮件(而不是使用outlook automation),或者查找脚本可以与之交互的电子邮件服务/api,如果您使用MS Exchange,则可以使用内置Web服务,请参阅,但还有很多其他选项,如 虽然从PC上运行还有其他选择,但很明显,当您的PC关闭时,您的数据库托管在某个在线的服务器上,否则将不会有任何数据更改来发送电子邮件,因此下一个查找托管代码的位置将是数据库服务器本身
- 在当前状态下,还需要在服务器上安装和配置outlook,并且脚本在配置的用户配置文件中执行
- 您的脚本不适合这种情况,但是SQL Server确实有一个组件,这意味着您可以在纯SQL中执行此操作,具体取决于电子邮件内容的复杂性,对于简单的数据库状态DBA/Admin报告,这通常是一个可行的选项
这可能不是你想听到的,但你要么需要购买第三方服务来为你的用户实现这一点,要么将你的脚本开发成更多的应用程序或小程序。查看这些主题,选择一个与您的代码熟练程度最接近的主题,并在遇到问题时/如果遇到问题时发布更多问题。那么,如果主机未打开,将发送什么?电子邮件不是凭空产生的。也许我不明白这个问题,但为什么主机会关闭?“我需要安排它自动运行,而不需要打开我的电脑”如果它不打开,它就关闭了。在这一点上,没有什么,这就是为什么我请求帮助。可能是如何使用不同的主机或其他东西,并将其部署到可以自己运行的地方。我是数据分析师,不是程序员,所以我在这个领域的知识有点有限。有没有具体的问题?你试过什么,做过什么研究吗?请看,。此时我正在使用windows调度程序,但这不是一个可持续的解决方案。我将查找您描述的选项,并尝试找到一些解决方案。非常感谢您的回答。如果scheduler没有削减它,那么您需要开始寻找更正式的代码解决方案,祝您好运,通常
DatabaseMail
是最简单的,但取决于电子邮件正文的安全性和复杂性,这可能不可行。
for index, row in final_df.iterrows():
mail = outlook.CreateItem(0)
mail.To = row["MAIL"]
mail.SentOnBehalfOfName = "GenericCorporateMAil@Corporation.com"
mail.cc = row["MANAGER"]
mail.Subject = ...
mail.Body = ...
mail.Send()