Administrar Google Calendars usando el cliente Gmail

Agregar, editar y eliminar calendarios de Gmail

Aspose.Email permite a las aplicaciones gestionar los calendarios de Gmail usando IGmailClient que ofrece funciones como agregar, eliminar y actualizar calendarios de Gmail. Esta clase cliente devuelve una lista de objetos de tipo ExtendedCalendar que contienen información sobre los elementos del calendario de Gmail. IGmailClient la clase expone las siguientes funciones para calendarios:

  • CreateCalendar Puede usarse para insertar un nuevo calendario
  • ListCalendars Puede usarse para obtener la lista de todos los calendarios de un cliente
  • DeleteCalendar Puede usarse para eliminar un calendario
  • FetchCalendar Puede usarse para obtener un calendario concreto de un cliente
  • UpdateCalendar Esta función se usa para volver a insertar un calendario modificado de un cliente

Para acceder a los calendarios, GoogleTestUser se inicializa usando credenciales de cuenta de Gmail. GoogleOAuthHelper se utiliza para obtener el token de acceso del usuario, que luego se usa para inicializar IGmailClient.

Insertar, obtener y actualizar calendarios de Gmail

Para insertar un calendario, inicialice un objeto de tipo Calendar e insértelo usando CreateCalendar() función. CreateCalendar() devuelve el id del calendario recién insertado. Este id puede usarse para obtener el calendario del servidor. El siguiente fragmento de código muestra cómo insertar, obtener y actualizar un calendario.

// Get access token
GoogleTestUser User2 = new GoogleTestUser("user", "email address", "password", "clientId", "client secret");
string accessToken;
string refreshToken;
GoogleOAuthHelper.GetAccessToken(User2, out accessToken, out refreshToken);

using (IGmailClient client = GmailClient.GetInstance(accessToken, User2.EMail))
{
    // Insert, get and update calendar
    Aspose.Email.Clients.Google.Calendar calendar = new Aspose.Email.Clients.Google.Calendar("summary - " + Guid.NewGuid().ToString(), null, null, "America/Los_Angeles");
    
    // Insert calendar and Retrieve same calendar using id
    string id = client.CreateCalendar(calendar);
    Aspose.Email.Clients.Google.Calendar cal = client.FetchCalendar(id);

    //Match the retrieved calendar info with local calendar
    if ((calendar.Summary == cal.Summary) && (calendar.TimeZone == cal.TimeZone))
    {
        Console.WriteLine("fetched calendar information matches");
    }
    else
    {
        Console.WriteLine("fetched calendar information does not match");
    }

    // Change information in the fetched calendar and Update calendar
    cal.Description = "Description - " + Guid.NewGuid().ToString();
    cal.Location = "Location - " + Guid.NewGuid().ToString();
    client.UpdateCalendar(cal);
}

Eliminar calendarios específicos de Google

Para eliminar un calendario concreto, necesitamos obtener la lista de todos los calendarios de un cliente y luego eliminar según sea necesario. ListCalendars() devuelve la lista de ExtendedCalendar que contiene calendarios de Gmail. El siguiente fragmento de código muestra cómo eliminar un calendario concreto.

// Get access token
GoogleTestUser User2 = new GoogleTestUser("user", "email address", "password", "clientId", "client secret");
string accessToken;
string refreshToken;
GoogleOAuthHelper.GetAccessToken(User2, out accessToken, out refreshToken);

using (IGmailClient client = GmailClient.GetInstance(accessToken, User2.EMail))
{
    // Access and delete calendar with summary starting from "Calendar summary - "
    string summary = "Calendar summary - ";

    // Get calendars list
    ExtendedCalendar[] lst0 = client.ListCalendars();

    foreach (ExtendedCalendar extCal in lst0)
    {
        // Delete selected calendars
        if (extCal.Summary.StartsWith(summary))
            client.DeleteCalendar(extCal.Id);
    }
}

Control de acceso al calendario

Aspose.Email brinda control total sobre el acceso a los elementos del calendario. ListAccessRules() función está expuesta por IGmailClient que devuelve la lista de AccessControlRule. La información individual de la regla puede ser recuperada, modificada y guardada de nuevo para el calendario de un cliente. IGmailClient contiene las siguientes funciones para gestionar las reglas de control de acceso.

  • ListAccessRules Esta función proporciona la lista de AccessControlRule
  • CreateAccessRule Esta función crea una nueva regla de acceso para un calendario.
  • UpdateAccessRule Esta función se utiliza para actualizar una regla de acceso.
  • FetchAccessRule Puede usarse para obtener una regla de acceso particular para el calendario de un cliente
  • DeleteAccessRule Esta función se utiliza para eliminar una regla de acceso.

El siguiente fragmento de código muestra cómo usar funciones para gestionar las reglas de acceso:

GoogleTestUser User2 = new GoogleTestUser("user", "email address", "password", "clientId", "client secret");
string accessToken;
string refreshToken;
GoogleOAuthHelper.GetAccessToken(User2, out accessToken, out refreshToken);

using (IGmailClient client = GmailClient.GetInstance(accessToken, User2.EMail))
{
    // Retrieve list of calendars for the current client
    ExtendedCalendar[] calendarList = client.ListCalendars();

    // Get first calendar id and retrieve list of AccessControlRule for the first calendar
    string calendarId = calendarList[0].Id;
    AccessControlRule[] roles1 = client.ListAccessRules(calendarId);

    // Create a local access control rule and Set rule properties
    AccessControlRule rule = new AccessControlRule();
    rule.Role = AccessRole.reader;
    rule.Scope = new AclScope(AclScopeType.user, User2.EMail);

    // Insert new rule for the calendar. It returns the newly created rule
    AccessControlRule createdRule = client.CreateAccessRule(calendarId, rule);

    // Confirm if local created rule and returned rule are equal
    if ((rule.Role == createdRule.Role) && (rule.Scope.Type == createdRule.Scope.Type) && (rule.Scope.Value.ToLower() == createdRule.Scope.Value.ToLower()))
    {
        Console.WriteLine("local rule and returned rule after creation are equal");
    }
    else
    {
        Console.WriteLine("Rule could not be created successfully");
        return;
    }

    // Get list of rules
    AccessControlRule[] roles2 = client.ListAccessRules(calendarId);

    // Current list length should be 1 more than the earlier one
    if (roles1.Length + 1 == roles2.Length)
    {
        Console.WriteLine("List lengths are ok");
    }
    else
    {
        Console.WriteLine("List lengths are not ok");
        return;
    }

    // Change rule and Update the rule for the selected calendar
    createdRule.Role = AccessRole.writer;
    AccessControlRule updatedRule = client.UpdateAccessRule(calendarId, createdRule);

    // Check if returned access control rule after update is ok
    if ((createdRule.Role == updatedRule.Role) && (createdRule.Id == updatedRule.Id))
    {
        Console.WriteLine("Rule is updated successfully");
    }
    else
    {
        Console.WriteLine("Rule is not updated");
        return;
    }

    // Retrieve individaul rule against a calendar
    AccessControlRule fetchedRule = client.FetchAccessRule(calendarId, createdRule.Id);

    //Check if rule parameters are ok
    if ((updatedRule.Id == fetchedRule.Id) && (updatedRule.Role == fetchedRule.Role) && (updatedRule.Scope.Type == fetchedRule.Scope.Type) && (updatedRule.Scope.Value.ToLower() == fetchedRule.Scope.Value.ToLower()))
    {
        Console.WriteLine("Rule parameters are ok");
    }
    else
    {
        Console.WriteLine("Rule parameters are not ok");
    }

    // Delete particular rule against a given calendar and Retrieve the all rules list for the same calendar
    client.DeleteAccessRule(calendarId, createdRule.Id);
    AccessControlRule[] roles3 = client.ListAccessRules(calendarId);

    // Check that current rules list length should be equal to the original list length before adding and deleting the rule
    if (roles1.Length == roles3.Length)
    {
        Console.WriteLine("List lengths are same");
    }
    else
    {
        Console.WriteLine("List lengths are not equal");
        return;
    }
}

Configuración del cliente de calendario e información de colores

Aspose.Email permite acceder a la configuración del Cliente mediante IGmailClient.GetSettings(). Devuelve la lista de configuraciones como se muestra a continuación:

  1. dateFieldOrder
  2. displayAllTimezones
  3. hideInvitations
  4. format24HourTime
  5. defaultCalendarMode
  6. defaultEventLength
  7. locale
  8. remindOnRespondedEventsOnly
  9. alternateCalendar
  10. ubicaciónUsuario
  11. hideWeekends
  12. showDeclinedEvents
  13. inicioDeSemana
  14. clima
  15. customCalendarMode
  16. timezoneLabel
  17. zona horaria
  18. useKeyboardShortcuts
  19. país

De manera similar, la información de color para clientes también se puede obtener usando IGmailClient.GetColors(). Este objeto de información de color devuelve la lista de colores de primer plano, colores de fondo y la fecha y hora de actualización.

Acceder a la Configuración del Cliente

El siguiente fragmento de código muestra cómo pueden usarse las funciones para acceder a la configuración del cliente:

GoogleTestUser User2 = new GoogleTestUser("user", "email address", "password", "clientId", "client secret");
string accessToken;
string refreshToken;
GoogleOAuthHelper.GetAccessToken(User2, out accessToken, out refreshToken);

using (IGmailClient client = GmailClient.GetInstance(accessToken, User2.EMail))
{
    // Retrieve client settings
    Dictionary<string, string> settings = client.GetSettings();
    if (settings.Count < 1)
    {
        Console.WriteLine("No settings are available.");
        return;
    }

    // Traverse the settings list
    foreach (KeyValuePair<string, string> pair in settings)
    {
        // Get the setting value and test if settings are ok
        string value = client.GetSetting(pair.Key);
        if (pair.Value == value)
        {
            Console.WriteLine("Key = " + pair.Key + ", Value = " + pair.Value);
        }
        else
        {
            Console.WriteLine("Settings could not be retrieved");
        }
    }
}

Acceder a la información de colores

El siguiente fragmento de código muestra cómo pueden usarse las funciones para acceder a la configuración de colores del cliente.

GoogleTestUser User2 = new GoogleTestUser("user", "email address", "password", "clientId", "client secret");
string accessToken;
string refreshToken;
GoogleOAuthHelper.GetAccessToken(User2, out accessToken, out refreshToken);

using (IGmailClient client = GmailClient.GetInstance(accessToken, User2.EMail))
{
    ColorsInfo colors = client.GetColors();
    Dictionary<string, Colors> palettes = colors.Calendar;

    // Traverse the settings list
    foreach (KeyValuePair<string, Colors> pair in palettes)
    {
        Console.WriteLine("Key = " + pair.Key + ", Color = " + pair.Value);
    }
    Console.WriteLine("Update Date = " + colors.Updated);
}

Administrar citas de Google Calendar

Aspose.Email ofrece funcionalidades para trabajar con citas en calendarios de Google. Las siguientes tareas se pueden realizar con citas en Google Calendar:

  1. Agregar citas.
  2. Obtener lista de citas.
  3. Obtener una cita en particular.
  4. Actualizar una cita.
  5. Mover cita de un calendario a otro.
  6. Eliminar cita.

IGmailClient proporciona funciones como CreateAppointment, FetchAppointment, UpdateAppointment, ListAppointments, MoveAppointment y DeleteAppointment.

Agregar citas a Google Calendar

El siguiente ejemplo de código muestra la función de agregar una cita en un calendario. Para lograrlo, siga los pasos:

  1. Crear e insertar un calendario.
  2. Recuperar la lista de citas de un calendario nuevo.
  3. Crear una cita.
  4. Insertar una cita.

                GoogleTestUser User2 = new GoogleTestUser("user", "email address", "password", "clientId", "client secret");
                string accessToken;
                string refreshToken;
                GoogleOAuthHelper.GetAccessToken(User2, out accessToken, out refreshToken);

                // Get IGmailclient
                using (IGmailClient client = GmailClient.GetInstance(accessToken, User2.EMail))
                {
                    // Create local calendar	
                    Aspose.Email.Clients.Google.Calendar calendar1 = new Aspose.Email.Clients.Google.Calendar("summary - " + Guid.NewGuid().ToString(), null, null, "Europe/Kiev");

                    // Insert calendar and get id of inserted calendar and Get back calendar using an id
                    string id = client.CreateCalendar(calendar1);
                    Aspose.Email.Clients.Google.Calendar cal1 = client.FetchCalendar(id);
                    string calendarId1 = cal1.Id;

                    try
                    {
                        // Retrieve list of appointments from the first calendar
                        Appointment[] appointments = client.ListAppointments(calendarId1);
                        if (appointments.Length > 0)
                        {
                            Console.WriteLine("Wrong number of appointments");
                            return;
                        }

                        // Get current time and Calculate time after an hour from now
                        DateTime startDate = DateTime.Now;
                        DateTime endDate = startDate.AddHours(1);

                        // Initialize a mail address collection and set attendees mail address
                        MailAddressCollection attendees = new MailAddressCollection();
                        attendees.Add("User1.EMail@domain.com");
                        attendees.Add("User3.EMail@domain.com");

                        // Create an appointment with above attendees
                        Appointment app1 = new Appointment("Location - " + Guid.NewGuid().ToString(), startDate, endDate, User2.EMail, attendees);

                        // Set appointment summary, description, start/end time zone
                        app1.Summary = "Summary - " + Guid.NewGuid().ToString();
                        app1.Description = "Description - " + Guid.NewGuid().ToString();
                        app1.StartTimeZone = "Europe/Kiev";
                        app1.EndTimeZone = "Europe/Kiev";

                        // Insert appointment in the first calendar inserted above and get back inserted appointment
                        Appointment app2 = client.CreateAppointment(calendarId1, app1);

                        // Retrieve appointment using unique id
                        Appointment app3 = client.FetchAppointment(calendarId1, app2.UniqueId);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                }

Obtener y actualizar citas de Google Calendar

Aquí se demuestran la recuperación y actualización del calendario de la siguiente manera:

  1. Recuperar una cita particular.
  2. Modificar la cita.
  3. Actualizar la cita en el calendario.

Se asume que ya se han extraído un calendario con id "calendarId" y el id único de la cita "AppointmentUniqueId". El siguiente fragmento de código muestra cómo obtener y actualizar una cita.

GoogleTestUser User2 = new GoogleTestUser("user", "email address", "password", "clientId", "client secret");
string accessToken;
string refreshToken;
GoogleOAuthHelper.GetAccessToken(User2, out accessToken, out refreshToken);
             
// Get IGmailclient
using (IGmailClient client = GmailClient.GetInstance(accessToken, User2.EMail))
{
    string calendarId = client.ListCalendars()[0].Id;
    string AppointmentUniqueId = client.ListAppointments(calendarId)[0].UniqueId;

    // Retrieve Appointment
    Appointment app3 = client.FetchAppointment(calendarId, AppointmentUniqueId);
    // Change the appointment information
    app3.Summary = "New Summary - " + Guid.NewGuid().ToString();
    app3.Description = "New Description - " + Guid.NewGuid().ToString();
    app3.Location = "New Location - " + Guid.NewGuid().ToString();
    app3.Flags = AppointmentFlags.AllDayEvent;
    app3.StartDate = DateTime.Now.AddHours(2);
    app3.EndDate = app3.StartDate.AddHours(1);
    app3.StartTimeZone = "Europe/Kiev";
    app3.EndTimeZone = "Europe/Kiev";
    // Update the appointment and get back updated appointment
    Appointment app4 = client.UpdateAppointment(calendarId, app3);
}

Mover y eliminar citas en Google Calendar

Una cita puede moverse proporcionando el calendario de origen, el calendario de destino y el id único de una cita en el calendario de origen. El siguiente fragmento de código muestra cómo mover y eliminar una cita.

GoogleTestUser User2 = new GoogleTestUser("user", "email address", "password", "clientId", "client secret");
string accessToken;
string refreshToken;
GoogleOAuthHelper.GetAccessToken(User2, out accessToken, out refreshToken);

// Get IGmailclient
using (IGmailClient client = Aspose.Email.Clients.Google.GmailClient.GetInstance(accessToken, User2.EMail))
{
    string SourceCalendarId = client.ListCalendars()[0].Id;
    string DestinationCalendarId = client.ListCalendars()[1].Id;
    string TargetAppUniqueId = client.ListAppointments(SourceCalendarId)[0].UniqueId;

    // Retrieve the list of appointments in the destination calendar before moving the appointment
    Appointment[] appointments = client.ListAppointments(DestinationCalendarId);
    Console.WriteLine("Before moving count = " + appointments.Length);
    Appointment Movedapp = client.MoveAppointment(SourceCalendarId, DestinationCalendarId, TargetAppUniqueId);

    // Retrieve the list of appointments in the destination calendar after moving the appointment
    appointments = client.ListAppointments(DestinationCalendarId);
    Console.WriteLine("After moving count = " + appointments.Length);

    // Delete particular appointment from a calendar using unique id
    client.DeleteAppointment(DestinationCalendarId, Movedapp.UniqueId);

    // Retrieve the list of appointments. It should be one less than the earlier appointments in the destination calendar
    appointments = client.ListAppointments(DestinationCalendarId);
    Console.WriteLine("After deleting count = " + appointments.Length);
}

Consulta FreeBusy para Google Calendar

Aspose.Email proporciona un mecanismo de consulta para verificar si una cita está programada según los criterios. La clase FreebusyQuery se ofrece para este propósito y permite preparar una consulta para un calendario en particular.

Este ejemplo de código demuestra la funcionalidad de consultar un calendario. En este ejemplo se realizan las siguientes tareas:

  1. Crear e insertar un calendario
  2. Crear una cita
  3. Insertar cita
  4. Preparar una consulta FreeBusyQuery
  5. Obtener la respuesta FreebusyResponse

// Use the GoogleUser and GoogleOAuthHelper classes below to receive an access token
using (IGmailClient client = GmailClient.GetInstance(accessToken, user.Email))
{
    // Initialize calendar item
    Aspose.Email.Clients.Google.Calendar calendar1 = new Aspose.Email.Clients.Google.Calendar("summary - " + Guid.NewGuid().ToString(), null, null, "Europe/Kiev");

    // Insert calendar and get back id of newly inserted calendar and Fetch the same calendar using calendar id
    string id = client.CreateCalendar(calendar1);
    Aspose.Email.Clients.Google.Calendar cal1 = client.FetchCalendar(id);
    string calendarId1 = cal1.Id;
    try
    {
        // Get list of appointments in newly inserted calendar. It should be zero
        Appointment[] appointments = client.ListAppointments(calendarId1);
        if (appointments.Length != 0)
        {
            Console.WriteLine("Wrong number of appointments");
            return;
        }

        // Create a new appointment and Calculate appointment start and finish time
        DateTime startDate = DateTime.Now;
        DateTime endDate = startDate.AddHours(1);

        // Create attendees list for appointment
        MailAddressCollection attendees = new MailAddressCollection();
        attendees.Add("user1@domain.com");
        attendees.Add("user2@domain.com");

        // Create appointment
        Appointment app1 = new Appointment("Location - " + Guid.NewGuid().ToString(), startDate, endDate, "user2@domain.com", attendees);
        app1.Summary = "Summary - " + Guid.NewGuid().ToString();
        app1.Description = "Description - " + Guid.NewGuid().ToString();
        app1.StartTimeZone = "Europe/Kiev";
        app1.EndTimeZone = "Europe/Kiev";

        // Insert the newly created appointment and get back the same in case of successful insertion
        Appointment app2 = client.CreateAppointment(calendarId1, app1);

        // Create Freebusy query by setting min/max timeand time zone
        FreebusyQuery query = new FreebusyQuery();
        query.TimeMin = DateTime.Now.AddDays(-1);
        query.TimeMax = DateTime.Now.AddDays(1);
        query.TimeZone = "Europe/Kiev";

        // Set calendar item to search and Get the reponse of query containing 
        query.Items.Add(cal1.Id);
        FreebusyResponse resp = client.GetFreebusyInfo(query);
        // Delete the appointment
        client.DeleteAppointment(calendarId1, app2.UniqueId);
    }
    finally
    {
        // Delete the calendar
        client.DeleteCalendar(cal1.Id);
    }
}