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

C#创建Outlook他人日历约会:解决Appointment.id空值报错

解决EWS创建约会时“Appointment.id Value cannot be null”错误

问题原因分析

  1. Exchange版本不兼容:你使用的ExchangeVersion.Exchange2007_SP1与Office365的EWS服务不匹配,导致Save操作后无法正确返回约会的Id。
  2. 未明确指定目标日历文件夹:通过模拟用户访问他人日历时,未显式指定保存到目标用户的Calendar文件夹,可能导致操作上下文异常。
  3. 模拟权限配置缺失:你的账号可能未被授予针对目标用户的ApplicationImpersonation角色,导致无法完成创建操作并获取Id。

解决方案

1. 更新ExchangeService版本

将Exchange版本替换为兼容Office365的版本,推荐使用ExchangeVersion.Exchange2013或ExchangeVersion.ExchangeLatest:

ExchangeService servicex = new ExchangeService(ExchangeVersion.Exchange2013);

2. 显式绑定目标用户的Calendar文件夹

在保存约会时,明确指定目标用户的日历文件夹,确保操作在正确的上下文执行:

// 绑定目标用户的Calendar文件夹
Folder calendarFolder = Folder.Bind(servicex, WellKnownFolderName.Calendar);
// 保存约会到指定日历
appointment.Save(calendarFolder.Id, SendInvitationsMode.SendToNone);

3. 确认模拟权限配置

联系Office365管理员,为你的账号授予ApplicationImpersonation管理角色,确保可以模拟目标用户执行日历操作。

修改后的完整代码示例

public async Task<bool> CreateAppointmentAsync()
{
    var spinId = Guid.NewGuid();
    bool success = false;
    var targetUserEmail = "user@domain.com"; // 目标用户邮箱

    try
    {
        string ewsUrl = "https://outlook.office365.com/EWS/Exchange.asmx";
       
        // 使用兼容Office365的Exchange版本
        ExchangeService servicex = new ExchangeService(ExchangeVersion.Exchange2013);
        servicex.Credentials = new WebCredentials("your-account@domain.com", "your-password");
        servicex.Url = new Uri(ewsUrl);
        // 设置模拟用户
        servicex.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, targetUserEmail);

        Appointment appointment = new Appointment(servicex);
        // 设置约会属性
        appointment.Subject = "Tennis lesson";
        appointment.Body = "Focus on backhand this week.";
        appointment.Start = DateTime.Now.AddDays(2);
        appointment.End = appointment.Start.AddHours(1);
        appointment.Location = "Tennis club";
        appointment.ReminderDueBy = DateTime.Now;

        // 绑定目标用户的Calendar文件夹并保存约会
        Folder calendarFolder = Folder.Bind(servicex, WellKnownFolderName.Calendar);
        appointment.Save(calendarFolder.Id, SendInvitationsMode.SendToNone);

        // 此时appointment.Id已被正确填充,可正常绑定
        Item item = await Item.Bind(servicex, appointment.Id, new PropertySet(ItemSchema.Subject));

        success = true;
        MessageBox.Show("成功创建事件");
        Console.WriteLine("获取到的约会主题: " + item.Subject);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
        return success;
    }
    finally
    {
        Thread.Sleep(100);
        _eventAggregator.GetEvent<CloseControlEvent>().Publish(spinId.ToString());
    }
    return success;
}

额外注意事项

  • 移除servicex.UseDefaultCredentials = true;,因为你已经显式设置了WebCredentials,两者存在冲突。
  • 若你的账号启用了MFA,需改用OAuth认证(EWS基本认证已逐步被Office365弃用,推荐优先使用OAuth)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 23:27:22