首页 > 解决方案 > Google Calender Api v3 .net 当与会者回复活动时发送电子邮件通知

问题描述

我在我的项目中使用适用于 .Net 的 Google Calendar Api v3。当任何与会者回复活动(“是”,“否”)时,我需要创建活动并发送通知。我阅读了 api 文档并尝试了它所说的内容。下面是我创建服务帐户凭据并使用组织者和创建者信息创建事件的代码。

我有域“example.net”并尝试使用具有电子邮件“organizer@example.net”的组织者创建活动,组织者和与会者都可以来自不同的域,例如“gmail,outlook”。

但每当我创建活动时,api 会自动向与会者发送有关活动信息的电子邮件,但组织者看起来像在“calendar.json”文件中定义的“calendar@example-calendar.iam.gserviceaccount.com”。因此,每当与会者回复活动时,组织者都无法收到有关与会者回复活动内容的电子邮件。我无法将管理器设置为“organizer@example.com”,它始终是“calendar@example-calendar.iam.gserviceaccount.com”。

请查看下面的代码并告诉我如何将组织者、活动创建者设置为“organizer@example.com”(也可以使用不同域的不同电子邮件地址,如 gmail、outlook),或者我该怎么做当任何与会者回复活动(是或否)时,谷歌日历会向活动组织者发送电子邮件通知

  private static Event SendCalendarInvitation()
    {
        try
        {
            string credPath = @"C:\calendar.json";

            var json = File.ReadAllText(credPath);
            var cr = JsonConvert.DeserializeObject<PersonalServiceAccountCred>(json); 

            var xCred = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(cr.client_email)
            {
                Scopes = new[] {
                    CalendarService.Scope.Calendar
                }
            }.FromPrivateKey(cr.private_key));

            // Create the service

            CalendarService service = new CalendarService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = xCred
            });

            Event calendarEvent = new Event
            {
                Summary = "Example Event",
                Location = "Los Angeles",
                Description = "Description",
                Start = new EventDateTime()
                {
                    DateTime = new DateTime(2018, 6, 2, 10, 0, 0),
                    TimeZone = "America/Los_Angeles"
                },
                End = new EventDateTime()
                {
                    DateTime = new DateTime(2018, 6, 2, 12, 0, 0),
                    TimeZone = "America/Los_Angeles"
                },
                Attendees = new List<EventAttendee>()
                {
                    new EventAttendee() { Email = "organizer@example.com", Organizer = true},
                    new EventAttendee() { Email = "attendee@gmail.com"}
                },
                Creator = new Event.CreatorData()
                {
                    Email = "organizer@example.com",
                    DisplayName = "Organizer"
                },
                Organizer = new Event.OrganizerData()
                {
                    Email = "organizer@example.com",
                    DisplayName = "Organizer"
                },
                Reminders = new Event.RemindersData()
                {
                    UseDefault = false,
                    Overrides = new List<EventReminder>()
                    {
                        new EventReminder()
                        {
                            Method = "email",
                            Minutes = 30
                        },
                        new EventReminder()
                        {
                            Method = "email",
                            Minutes = 14400
                        }
                    }
                }
            };

            Event calendarEventResult = null;

            var statusCode = System.Net.HttpStatusCode.Accepted;
            try
            {
                var request = service.Events.Insert(calendarEvent, "primary");
                request.SendNotifications = true;
                calendarEventResult = request.Execute();
            }
            catch (Exception ex)
            {
                statusCode = System.Net.HttpStatusCode.BadRequest;
            }
            return calendarEventResult;
        }
        catch (Exception ex)
        {
            return null;
        }
    }

标签: c#google-apigoogle-api-dotnet-clientservice-accountsgoogle-calendar-api

解决方案


事件有一个组织者,它是包含事件主副本的日历。活动也可以有多个参与者。与会者通常是受邀用户的主日历。

如果服务帐户设置为组织者,则您代表服务帐户发送事件。这是一个愚蠢的用户。当它邀请用户加入时,用户将被通知创建事件的人已经添加了他们,在这种情况下它的“calendar@example-calendar.iam.gserviceaccount.com”没有办法改变这一点。

我没试过这个。但是,如果您执行Event.patch并让服务帐户将您的个人帐户设置为组织者,那么它应该从您而不是服务帐户发送邮件。

// Building the initial request.
var request = service.Events.Patch(body, calendarId, eventId);

// Applying optional parameters to the request.                
request = (EventsResource.PatchRequest)SampleHelpers.ApplyOptionalParms(request, optional);

// Requesting data.
return request.Execute();

从事件示例中提取的代码

测试这个想法的顺序。

  1. 创建一个事件。
  2. 修补事件,将组织者更​​新为您自己而不是服务帐户。
  3. 做一个事件看看你是否能够更新这个字段。文档说它应该是可写的。
  4. 将与会者添加到活动中。检查它发送的电子邮件。

如果它仍然不起作用,请尝试将您的电子邮件设置为所有者和组织者,但我担心服务帐户将无法编辑它。


推荐阅读