使用python中的
win32com.client as win32
包,我已经能够成功向Outlook中的同事邮箱发送电子邮件,大致设置如下:
import win32com.client as win32
outlook = win32.Dispatch("Outlook.Application")
mail = outlook.CreateItem(0)
mail.To = "[email protected]"
mail.Subject = "test Subject"
mail.Body = "test body"
mail.Send()
这在本地运行良好,它只是使用我的个人地址发送电子邮件。
我们还使用 DevOps 管道,并且可以轻松调用我们存储库中的 python 文件以促进单元测试等,因此我希望使用 python 自动化这封电子邮件,并通过我们管道之一中的步骤调用它。该脚本在执行必要的先决条件来设置电子邮件正文方面执行正常,但在尝试设置 Outlook 连接时出现以下失败:
pywintypes.com_error: (-2147221005, 'Invalid class string', None, None)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\agent-04\_work\217\s\scripts\etl-daily-email.py", line 97, in <module>
main()
File "C:\agent-04\_work\217\s\scripts\etl-daily-email.py", line 92, in main
EmailETLDashboard()
File "C:\agent-04\_work\217\s\scripts\etl-daily-email.py", line 70, in __init__
outlook = win32.Dispatch("Outlook.Application")
File "c:\agent-04\_work\217\s\.conda\lib\site-packages\win32com\client\__init__.py", line 114, in Dispatch
dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch, userName, clsctx)
File "c:\agent-04\_work\217\s\.conda\lib\site-packages\win32com\client\dynamic.py", line 100, in _GetGoodDispatchAndUserName
return (_GetGoodDispatch(IDispatch, clsctx), userName)
File "c:\agent-04\_work\217\s\.conda\lib\site-packages\win32com\client\dynamic.py", line 82, in _GetGoodDispatch
IDispatch = pythoncom.CoCreateInstance(
pywintypes.com_error: (-2147221005, 'Invalid class string', None, None)
一开始我并没有太多信心,认为这会以与本地类似的方式工作。我想我的问题是,有没有一种方法可以使用 python 自动发送电子邮件,并且可以在 DevOps 管道中调用?对此还很陌生,所以任何建议将不胜感激。
重要的是要认识到 Azure DevOps Pipeline 在安装了一组特定工具的构建代理上运行。您的解决方案可以在本地运行,因为您已安装 Outlook 并配置了必要的凭据。您可能无法在构建代理上使用此方法。
以下是一些可能的选择:
CDO:
CdoSys.dll
是 2000 年代初发送电子邮件的首选库,但几十年来,互联网安全已经发展了许多预防措施来对抗跨电子邮件。您的邮件服务器可能会拒绝来自不受信任的应用程序的电子邮件。
Azure DevOps REST API:REST API 有一个方法可以发送邮件,但它主要专用于发送工作项目。
SendMail 任务:此自定义任务使用 PowerShell Send-MailMessage 模块,该模块已弃用,因为它不支持最新的安全协议。
Microsoft Graph API:Graph API 有一个端点用于发送电子邮件。