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

如何通过服务权限在Azure Function中用C#为Exchange Online共享邮箱添加SMTP地址

通过应用权限修改共享邮箱SMTP地址(Azure Function C#实现)

核心说明

共享邮箱在Azure AD中属于特殊的用户对象,其SMTP地址存储在用户的proxyAddresses属性中,而非mailboxSettings接口(该接口用于自动回复、时区等邮箱配置)。以下是无需用户登录、通过应用权限实现的完整方案:

1. Azure AD应用配置

  • 在Azure AD中注册应用,添加Microsoft Graph的应用权限:User.ReadWrite.All(若需更细粒度权限,可选择Mailbox.ReadWrite,但前者直接覆盖用户属性修改场景)。
  • 完成管理员同意(应用权限必须由租户管理员授权)。

2. C#代码示例(Azure Function)

使用Microsoft Graph SDK实现,无需手动处理REST请求:

首先安装NuGet依赖:

Install-Package Microsoft.Graph
Install-Package Azure.Identity

Function代码:

using Microsoft.Graph;
using Azure.Identity;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;

public static class UpdateSharedMailboxSmtp
{
    [FunctionName("UpdateSharedMailboxSmtp")]
    public static async Task Run(
        [TimerTrigger("0 */10 * * * *")] TimerInfo myTimer,
        ILogger log)
    {
        // 应用凭证信息(从Azure AD应用获取)
        var tenantId = "你的租户ID";
        var clientId = "你的应用注册ID";
        var clientSecret = "你的应用密钥";

        // 初始化Graph客户端(客户端凭证流,无用户登录)
        var scopes = new[] { "https://graph.microsoft.com/.default" };
        var credential = new ClientSecretCredential(tenantId, clientId, clientSecret);
        var graphClient = new GraphServiceClient(credential, scopes);

        try
        {
            // 共享邮箱的标识:可以是UserPrincipalName或Object ID
            var sharedMailboxId = "shared-sales@contoso.com";
            // 要添加的SMTP别名(注意前缀:别名用小写smtp:,主地址用大写SMTP:)
            var newAlias = "smtp:sales-eu@contoso.com";

            // 获取现有邮箱的地址列表
            var targetMailbox = await graphClient.Users[sharedMailboxId]
                .Request()
                .Select(u => new { u.ProxyAddresses })
                .GetAsync();

            // 避免重复添加
            if (!targetMailbox.ProxyAddresses.Contains(newAlias, StringComparer.OrdinalIgnoreCase))
            {
                var updatedAddresses = targetMailbox.ProxyAddresses.ToList();
                updatedAddresses.Add(newAlias);

                // 更新邮箱地址
                await graphClient.Users[sharedMailboxId]
                    .Request()
                    .UpdateAsync(new User
                    {
                        ProxyAddresses = updatedAddresses
                    });

                log.LogInformation($"已成功添加SMTP地址:{newAlias}");
            }
            else
            {
                log.LogInformation($"SMTP地址已存在:{newAlias}");
            }
        }
        catch (Exception ex)
        {
            log.LogError(ex, "更新共享邮箱SMTP地址失败");
        }
    }
}

3. 关键注意事项

  • 地址格式:主邮箱地址使用SMTP:大写前缀,别名使用smtp:小写前缀,添加别名时必须遵循此规则。
  • 权限验证:确保应用已获得管理员同意的User.ReadWrite.All或Mailbox.ReadWrite应用权限,否则会返回权限不足错误。
  • 替代方案:你提到的Exchange Admin Center的beta接口属于Exchange PowerShell REST端点,不推荐用于应用级调用,Microsoft Graph API是Azure生态的标准接口,更稳定且易于维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 11:43:23