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

如何用Python实现无交互CLI脚本通过公司Outlook邮箱发送邮件?

无交互Python CLI程序实现Outlook邮件发送(OAuth2客户端凭据流)

核心方案

你的无GUI服务端CLI程序适合采用**客户端凭据流(Client Credentials Flow)**完成OAuth2认证——全程无需用户交互,直接以应用身份获取权限发送邮件。


1. Azure AD应用配置(必须完成)

  • 注册单租户应用:在AAD中创建应用,选择「仅限本组织目录中的账户」
  • 添加并授权API权限:
    • 进入应用的「API权限」→「添加权限」→选择「Microsoft Graph」→「应用权限」
    • 搜索并添加Mail.Send权限,点击「授予管理员同意」(需全局管理员操作,否则权限不生效)
  • 创建客户端凭据:
    • 进入「证书和密码」→「客户端密码」→「新建客户端密码」,记录生成的密码值(仅显示一次,务必妥善保存)
  • Exchange Online权限配置(必要):
    若要以alerts@companyname.com身份发送邮件,需给应用服务主体分配该邮箱的SendAs权限,执行PowerShell命令:
    Add-RecipientPermission -Identity "alerts@companyname.com" -Trustee "<你的应用程序ID>" -AccessRights SendAs
    

2. Python代码实现

使用Microsoft Graph SDK简化开发,无需手动处理令牌请求。

安装依赖

pip install msgraph-core azure-identity python-dotenv

代码示例

import os
from dotenv import load_dotenv
from azure.identity import ClientSecretCredential
from msgraph_core import GraphClient
from msgraph.generated.models import Message, ItemBody, Recipient, EmailAddress

# 加载敏感配置(从.env文件读取,避免硬编码)
load_dotenv()
config = {
    "tenant_id": os.getenv("TENANT_ID"),
    "client_id": os.getenv("CLIENT_ID"),
    "client_secret": os.getenv("CLIENT_SECRET"),
    "sender_email": os.getenv("SENDER_EMAIL"),
    "pm_email": os.getenv("PM_EMAIL")
}

# 初始化认证客户端
credential = ClientSecretCredential(
    tenant_id=config["tenant_id"],
    client_id=config["client_id"],
    client_secret=config["client_secret"]
)
graph_client = GraphClient(credential=credential)

def send_alert(subject, content):
    # 构建邮件对象
    message = Message(
        subject=subject,
        body=ItemBody(content_type="Text", content=content),
        to_recipients=[Recipient(email_address=EmailAddress(address=config["pm_email"]))],
        from_=Recipient(email_address=EmailAddress(address=config["sender_email"]))
    )

    # 发送邮件
    try:
        graph_client.me.send_mail.post(body={"message": message, "save_to_sent_items": True})
        print("邮件发送成功")
    except Exception as e:
        print(f"发送失败: {str(e)}")

# 替换为你的业务触发逻辑
if __name__ == "__main__":
    send_alert(
        subject="数据库数据变更通知",
        content="监控到目标数据库发生数据变化,请及时核查。"
    )

.env文件示例

TENANT_ID=你的AAD租户ID
CLIENT_ID=应用程序ID
CLIENT_SECRET=生成的客户端密码
SENDER_EMAIL=alerts@companyname.com
PM_EMAIL=项目经理邮箱地址

3. 常见问题排查

  • 权限不足错误:检查Mail.Send权限是否已获得管理员同意,以及Exchange的SendAs权限是否配置正确
  • 令牌获取失败:确认租户ID、客户端ID、客户端密码是否准确
  • 发件人身份验证失败:确保alerts@companyname.com邮箱已在Exchange Online中正常启用

内容的提问来源于stack exchange,提问作者ibrhmch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 05:25:27