如何用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
相关产品推荐
相关产品推荐

