如何使用通过 DevOps 管道触发的 python 发送电子邮件

问题描述 投票:0回答:1

使用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 管道中调用?对此还很陌生,所以任何建议将不胜感激。

python azure-devops azure-pipelines smtp win32com
1个回答
0
投票

重要的是要认识到 Azure DevOps Pipeline 在安装了一组特定工具的构建代理上运行。您的解决方案可以在本地运行,因为您已安装 Outlook 并配置了必要的凭据。您可能无法在构建代理上使用此方法。

以下是一些可能的选择:

  • CDO:

    CdoSys.dll
    是 2000 年代初发送电子邮件的首选库,但几十年来,互联网安全已经发展了许多预防措施来对抗跨电子邮件。您的邮件服务器可能会拒绝来自不受信任的应用程序的电子邮件。

  • Azure DevOps REST API:REST API 有一个方法可以发送邮件,但它主要专用于发送工作项目。

  • SendMail 任务:此自定义任务使用 PowerShell Send-MailMessage 模块,该模块已弃用,因为它不支持最新的安全协议。

  • Microsoft Graph API:Graph API 有一个端点用于发送电子邮件。

© www.soinside.com 2019 - 2024. All rights reserved.