Gestión de Recurrencias

Trabajando con Recurrencias Diarias

Aspose.Email admite la creación de recurrencias diarias usando MapiCalendarDailyRecurrencePattern. Se pueden utilizar tres tipos diferentes de fin de recurrencia de calendario Mapi, incluyendo EndAfterNOccurrences, EndAfterDate y NeverEnd. Esta sección muestra la creación de diferentes patrones de recurrencia diaria.

Recurrencias Diarias con Cuenta de Ocurrencias

En este tipo de recurrencia, el número de repeticiones debe establecerse junto con otra información como sigue:

  1. Establezca fecha de inicio, fin y vencimiento.
  2. Crear un MapiTask.
  3. Establecer el estado de la tarea a NoAsignado.
  4. Cree el objeto de recurrencia diaria configurando propiedades como PatternType, Period, WeekStartDay, EndType y OccurenceCount.
  5. Establezca la propiedad MapiTask.Recurrence a este objeto de recurrencia diario.
  6. Guarde este mensaje en el disco.

El siguiente fragmento de código muestra cómo crear una tarea con tipo de fin de recurrencia EndAfterNOccurrence.

// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook();

TimeZone localZone = TimeZone.CurrentTimeZone;
TimeSpan timeSpan = localZone.GetUtcOffset(DateTime.Now);
DateTime StartDate = new DateTime(2015, 7, 16);
StartDate = StartDate.Add(timeSpan);

DateTime DueDate = new DateTime(2015, 7, 16);
DateTime endByDate = new DateTime(2015, 8, 1);
DueDate = DueDate.Add(timeSpan);
endByDate = endByDate.Add(timeSpan);
 
MapiTask task = new MapiTask("This is test task", "Sample Body", StartDate, DueDate);
task.State = MapiTaskState.NotAssigned;

// Set the Daily recurrence
var rec = new MapiCalendarDailyRecurrencePattern
{
    PatternType = MapiCalendarRecurrencePatternType.Day,
    Period = 1,
    WeekStartDay = DayOfWeek.Sunday,
    EndType = MapiCalendarRecurrenceEndType.EndAfterNOccurrences,
    OccurrenceCount = GetOccurrenceCount(StartDate, endByDate, "FREQ=DAILY"),
};

if (rec.OccurrenceCount==0)
{
    rec.OccurrenceCount = 1;
}

task.Recurrence = rec;
task.Save(dataDir + "Daily_out.msg", TaskSaveFormat.Msg);

La siguiente función puede usarse para calcular el número de eventos entre las dos fechas:

private static uint GetOccurrenceCount(DateTime start, DateTime endBy, string rrule)
{
    CalendarRecurrence pattern = new CalendarRecurrence(string.Format("DTSTART:{0}\r\nRRULE:{1}", start.ToString("yyyyMMdd"), rrule));
    DateCollection dates = pattern.GenerateOccurrences(start, endBy);
    return (uint)dates.Count;
}

Establecer el Valor del Recuento de Ocurrencias

El siguiente fragmento de código muestra cómo establecer el valor del recuento de ocurrencias.

// Set the Daily recurrence
var record = new MapiCalendarDailyRecurrencePattern
{
    PatternType = MapiCalendarRecurrencePatternType.Day,
    Period = 1,
    WeekStartDay = DayOfWeek.Sunday,
    EndType = MapiCalendarRecurrenceEndType.EndAfterNOccurrences,
    OccurrenceCount = 5,
};
task.Recurrence = record;

Recurrencias Diarias: Tipo EndAfterDate

"End By" opción en la tarea Mapi se logra estableciendo la propiedad OccurrenceCount calculada por la función GetOccurrenceCount(). Esta función toma la fecha de inicio, la fecha de fin y la cadena RRULE.

Recurrencias Diarias: Configurar el valor Cada Día

El siguiente fragmento de código muestra cómo establecer el valor de period a 1 y el valor de INTERVAL a 1 también en la cadena RRULE.

// Set the Daily recurrence
var record = new MapiCalendarDailyRecurrencePattern
{
    PatternType = MapiCalendarRecurrencePatternType.Day,
    Period = 1,
    EndType = MapiCalendarRecurrenceEndType.EndAfterDate,
    OccurrenceCount = GetOccurrenceCount(StartDate, endByDate, "FREQ=DAILY;INTERVAL=1"),
    EndDate = endByDate
};

El valor Every Day puede establecerse en cualquier valor apropiado como se muestra en el siguiente ejemplo:


// Set the Daily recurrence
var record = new MapiCalendarDailyRecurrencePattern
{
	PatternType = MapiCalendarRecurrencePatternType.Day,
	Period = 2,
	EndType = MapiCalendarRecurrenceEndType.EndAfterDate,
	OccurrenceCount = GetOccurrenceCount(StartDate, endByDate, "FREQ=DAILY;INTERVAL=2"),
};

Recurrencias Diarias: Tipo NeverEnd

El tipo de finalización se puede establecer usando MapiCalendarRecurrenceEndType.NeverEnd. Period o INTERVAL pueden establecerse al valor requerido, por ejemplo 1, en el siguiente ejemplo.

// Set the Daily recurrence
var record = new MapiCalendarDailyRecurrencePattern
{
    PatternType = MapiCalendarRecurrencePatternType.Day,
    Period = 1,
    EndType = MapiCalendarRecurrenceEndType.NeverEnd,
};

Trabajando con Recurrencias Semanales

Aspose.Email ofrece funciones avanzadas para la creación de recurrencias semanales usando MapiCalendarWeeklyRecurrencePattern. Se pueden utilizar tres tipos diferentes de fin de recurrencia del calendario Mapi, incluyendo EndAfterNOccurrences, EndAfterDate y NeverEnd. Esta sección muestra la creación de diferentes patrones de recurrencia semanal.

Recurrencias Semanales: Tipo EndAfterNOccurrences

En este tipo de recurrencia, el número de repeticiones debe establecerse junto con otra información como sigue:

  1. Establezca fecha de inicio, fin y vencimiento.
  2. Crear un MapiTask.
  3. Establecer el estado de la tarea a NoAsignado.
  4. Cree el objeto de recurrencia semanal configurando las propiedades como PatternType, Period, WeekStartDay, EndType y OccurenceCount.
  5. Establezca la propiedad MapiTask.Recurrence a este objeto de recurrencia semanal.
  6. Guarde este mensaje en el disco.

El siguiente fragmento de código muestra cómo crear una tarea con el tipo de fin de recurrencia EndAfterNOccurrence.

// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook();
TimeZone localZone = TimeZone.CurrentTimeZone;
TimeSpan ts = localZone.GetUtcOffset(DateTime.Now);
DateTime StartDate = new DateTime(2015, 7, 16);
StartDate = StartDate.Add(ts);

DateTime DueDate = new DateTime(2015, 7, 16);
DateTime endByDate = new DateTime(2015, 9, 1);
DueDate = DueDate.Add(ts);
endByDate = endByDate.Add(ts);

MapiTask task = new MapiTask("This is test task", "Sample Body", StartDate, DueDate);
task.State = MapiTaskState.NotAssigned;

// Set the weekly recurrence
var rec = new MapiCalendarWeeklyRecurrencePattern
{
    EndType = MapiCalendarRecurrenceEndType.EndAfterNOccurrences,
    PatternType = MapiCalendarRecurrencePatternType.Week,
    Period = 1,
    WeekStartDay = DayOfWeek.Sunday,
    DayOfWeek = MapiCalendarDayOfWeek.Friday,
    OccurrenceCount = GetOccurrenceCount(StartDate, endByDate, "FREQ=WEEKLY;BYDAY=FR"),
};

if (rec.OccurrenceCount == 0)
{
    rec.OccurrenceCount = 1;
}

task.Recurrence = rec;
task.Save(dataDir + "Weekly_out.msg", TaskSaveFormat.Msg);

La siguiente función puede usarse para calcular el número de eventos entre las dos fechas:

private static uint GetOccurrenceCount(DateTime start, DateTime endBy, string rrule)
{            
    CalendarRecurrence pattern = new CalendarRecurrence(string.Format("DTSTART:{0}\r\nRRULE:{1}", start.ToString("yyyyMMdd"),rrule));            
    DateCollection dates = pattern.GenerateOccurrences(start, endBy);            
    return (uint)dates.Count;
}

Seleccionar Múltiples Días en una Semana

El siguiente fragmento de código muestra cómo seleccionar varios días en una semana.

// Set the weekly recurrence
var rec = new MapiCalendarWeeklyRecurrencePattern
{
    EndType = MapiCalendarRecurrenceEndType.EndAfterNOccurrences,
    PatternType = MapiCalendarRecurrencePatternType.Week,
    Period = 1,
    WeekStartDay = DayOfWeek.Sunday,
    DayOfWeek = MapiCalendarDayOfWeek.Friday | MapiCalendarDayOfWeek.Monday,
    OccurrenceCount = GetOccurrenceCount(StartDate, endByDate, "FREQ=WEEKLY;BYDAY=FR,MO"),
};

Seleccionar Múltiples Días en una Semana y Establecer Intervalos

El siguiente fragmento de código muestra cómo seleccionar varios días de la semana y establecer intervalos.

// Set the weekly recurrence
var rec = new MapiCalendarWeeklyRecurrencePattern
{
    EndType = MapiCalendarRecurrenceEndType.EndAfterNOccurrences,
    PatternType = MapiCalendarRecurrencePatternType.Week,
    Period = 2,
    WeekStartDay = DayOfWeek.Sunday,
    DayOfWeek = MapiCalendarDayOfWeek.Friday | MapiCalendarDayOfWeek.Monday,
    OccurrenceCount = GetOccurrenceCount(StartDate, endByDate, "FREQ=WEEKLY;BYDAY=FR,MO;INTERVAL=2"),
};

Recurrencias Semanales: Tipo EndAfterDate

"End By" opción en la tarea Mapi se logra estableciendo la propiedad OccurrenceCount calculada por la función GetOccurrenceCount(). Esta función toma la fecha de inicio, la fecha de fin y la cadena RRULE.

Recurrencias Semanales: Configurar el valor Cada Día

El siguiente fragmento de código muestra cómo establecer el valor de period a 1 y el valor de INTERVAL a 1 también en la cadena RRULE.

// Set the weekly recurrence
var rec = new MapiCalendarWeeklyRecurrencePattern
{
    EndType = MapiCalendarRecurrenceEndType.EndAfterDate,
    PatternType = MapiCalendarRecurrencePatternType.Week,
    Period = 1,
    WeekStartDay = DayOfWeek.Sunday,
    DayOfWeek = MapiCalendarDayOfWeek.Friday,
    EndDate = endByDate,
    OccurrenceCount = GetOccurrenceCount(StartDate, endByDate, "FREQ=WEEKLY;BYDAY=FR;INTERVAL=1"),
};

El valor Every Day puede establecerse en cualquier valor apropiado y se pueden seleccionar varios días como se muestra en el siguiente ejemplo:

var record = new MapiCalendarWeeklyRecurrencePattern
{
    EndType = MapiCalendarRecurrenceEndType.EndAfterDate,
    PatternType = MapiCalendarRecurrencePatternType.Week,
    Period = 2,
    WeekStartDay = DayOfWeek.Sunday,
    EndDate = endByDate,
    DayOfWeek = MapiCalendarDayOfWeek.Friday | MapiCalendarDayOfWeek.Monday,
    OccurrenceCount = GetOccurrenceCount(StartDate, endByDate, "FREQ=WEEKLY;BYDAY=FR,MO;INTERVAL=2"),
};

Recurrencias Semanales: Tipo NeverEnd

El tipo de finalización se puede establecer usando MapiCalendarRecurrenceEndType.NeverEnd. Period o INTERVAL pueden establecerse al valor requerido, por ejemplo 1, en el siguiente ejemplo.

// Set the weekly recurrence
var recurrence = new MapiCalendarWeeklyRecurrencePattern
{
    EndType = MapiCalendarRecurrenceEndType.NeverEnd,
    PatternType = MapiCalendarRecurrencePatternType.Week,
    Period = 1,
    WeekStartDay = DayOfWeek.Sunday,
    DayOfWeek = MapiCalendarDayOfWeek.Friday,
    OccurrenceCount = GetOccurrenceCount(StartDate, endByDate, "FREQ=WEEKLY;BYDAY=FR"),
};

Trabajando con Recurrencias Mensuales

Aspose.Email admite la creación de recurrencias mensuales usando MapiCalendarMonthlyRecurrencePattern. Se pueden utilizar tres tipos diferentes de fin de recurrencia del calendario Mapi, incluyendo EndAfterNOccurrences, EndAfterDate y NeverEnd. Esta sección muestra la creación de diferentes patrones de recurrencia mensual.

Recurrencias Mensuales: Tipo EndAfterNOccurrences

En este tipo de recurrencia, el número de repeticiones debe establecerse junto con otra información como sigue:

  1. Establezca fecha de inicio, fin y vencimiento.
  2. Crear un MapiTask.
  3. Establecer el estado de la tarea a NoAsignado.
  4. Cree el objeto de recurrencia mensual configurando las propiedades como PatternType, Period, WeekStartDay, EndType y OccurenceCount.
  5. Establezca la propiedad MapiTask.Recurrence a este objeto de recurrencia mensual.
  6. Guarde este mensaje en el disco.

El siguiente fragmento de código muestra cómo crear una tarea con el tipo de fin de recurrencia EndAfterNOccurrence.

// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook();
TimeZone localZone = TimeZone.CurrentTimeZone;
TimeSpan ts = localZone.GetUtcOffset(DateTime.Now);
DateTime StartDate = new DateTime(2015, 7, 16);
StartDate = StartDate.Add(ts);

DateTime DueDate = new DateTime(2015, 7, 16);
DateTime endByDate = new DateTime(2015, 12, 31);
DueDate = DueDate.Add(ts);
endByDate = endByDate.Add(ts);

MapiTask task = new MapiTask("This is test task", "Sample Body", StartDate, DueDate);
task.State = MapiTaskState.NotAssigned;

// Set the Monthly recurrence
var rec = new MapiCalendarMonthlyRecurrencePattern
{
    Day = 15,
    Period = 1,
    PatternType = MapiCalendarRecurrencePatternType.Month,
    EndType = MapiCalendarRecurrenceEndType.EndAfterNOccurrences,
    OccurrenceCount = GetOccurrenceCount(StartDate, endByDate, "FREQ=MONTHLY;BYMONTHDAY=15;INTERVAL=1"),
    WeekStartDay = DayOfWeek.Monday,

};

if (rec.OccurrenceCount == 0)
{
    rec.OccurrenceCount = 1;
}

task.Recurrence = rec;
//task.Save(dataDir + "Monthly_out.msg", TaskSaveFormat.Msg);

La siguiente función puede usarse para calcular el número de eventos entre las dos fechas:

private static uint GetOccurrenceCount(DateTime start, DateTime endBy, string rrule)
{
    CalendarRecurrence pattern = new CalendarRecurrence(string.Format("DTSTART:{0}\r\nRRULE:{1}", start.ToString("yyyyMMdd"), rrule));
    DateCollection dates = pattern.GenerateOccurrences(start, endBy);       
    return (uint)dates.Count;
}

Establecer número fijo de ocurrencias

El siguiente fragmento de código muestra cómo establecer un número fijo de ocurrencias.

// Set the Monthly recurrence
var records = new MapiCalendarMonthlyRecurrencePattern
{
    Day = 15,
    Period = 1,
    PatternType = MapiCalendarRecurrencePatternType.Month,
    EndType = MapiCalendarRecurrenceEndType.EndAfterNOccurrences,
    OccurrenceCount = 5,
    WeekStartDay = DayOfWeek.Monday
};

Recurrencias Mensuales: Tipo EndAfterDate

"End By" opción en la tarea Mapi se logra estableciendo la propiedad OccurrenceCount calculada por la función GetOccurrenceCount(). Esta función toma la fecha de inicio, la fecha de fin y la cadena RRULE. El siguiente fragmento de código muestra cómo crear una recurrencia el día 15 de cada mes entre la fecha de inicio y la de fin.

// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook();

TimeZone localZone = TimeZone.CurrentTimeZone;
TimeSpan ts = localZone.GetUtcOffset(DateTime.Now);
DateTime StartDate = new DateTime(2015, 7, 1);
StartDate = StartDate.Add(ts);

DateTime DueDate = new DateTime(2015, 7, 1);
DateTime endByDate = new DateTime(2015, 12, 31);
DueDate = DueDate.Add(ts);
endByDate = endByDate.Add(ts);

MapiTask task = new MapiTask("This is test task", "Sample Body", StartDate, DueDate);
task.State = MapiTaskState.NotAssigned;

// Set the Monthly recurrence
var recurrence = new MapiCalendarMonthlyRecurrencePattern
{
    Day = 15,
    Period = 1,
    PatternType = MapiCalendarRecurrencePatternType.Month,
    EndType = MapiCalendarRecurrenceEndType.EndAfterDate,
    OccurrenceCount = GetOccurrenceCount(StartDate, endByDate, "FREQ=MONTHLY;BYMONTHDAY=15;INTERVAL=1"),
    WeekStartDay = DayOfWeek.Monday,
    EndDate = endByDate
};

task.Recurrence = recurrence;
//task.Save(dataDir + "SetMonthlyEndAfterDateRecurrence_out.msg", TaskSaveFormat.Msg);

Recurrencias Mensuales: Tipo NeverEnd

El siguiente fragmento de código muestra cómo establecer el tipo de fin usando MapiCalendarRecurrenceEndType.NeverEnd.

var recurrence = new MapiCalendarMonthlyRecurrencePattern
{
    Day = 15,
    Period = 1,
    PatternType = MapiCalendarRecurrencePatternType.Month,
    EndType = MapiCalendarRecurrenceEndType.NeverEnd,
    WeekStartDay = DayOfWeek.Monday,
};

Trabajando con Recurrencias Anuales

Aspose.Email admite la creación de recurrencias anuales usando MapiCalendarMonthlyRecurrencePattern. Al establecer la propiedad period a 12, podemos lograr el patrón de recurrencia anual. Se pueden utilizar tres tipos diferentes de fin de recurrencia del calendario Mapi, incluyendo EndAfterNOccurrences, EndAfterDate y NeverEnd. Esta sección muestra la creación de diferentes patrones de recurrencia anual.

Recurrencias Anuales: Tipo EndAfterNOccurrences

En este tipo de recurrencia, el número de repeticiones debe establecerse junto con otra información como sigue:

  1. Establezca fecha de inicio, fin y vencimiento.
  2. Crear un MapiTask.
  3. Establecer el estado de la tarea a NoAsignado.
  4. Cree el objeto de recurrencia mensual configurando las propiedades como PatternType, Period, WeekStartDay, EndType y OccurenceCount.
  5. Establezca la propiedad MapiTask.Recurrence a este objeto de recurrencia mensual para lograr la recurrencia anual.
  6. Guarde este mensaje en el disco.

El siguiente fragmento de código muestra cómo crear una tarea con el tipo de fin de recurrencia EndAfterNOccurrence.


TimeZone localZone = TimeZone.CurrentTimeZone;
TimeSpan ts = localZone.GetUtcOffset(DateTime.Now);
DateTime StartDate = new DateTime(2015, 7, 1);
StartDate = StartDate.Add(ts);
DateTime DueDate = new DateTime(2015, 7, 1);
DateTime endByDate = new DateTime(2020, 12, 31);
DueDate = DueDate.Add(ts);
endByDate = endByDate.Add(ts);
MapiTask task = new MapiTask("This is test task", "Sample Body", StartDate, DueDate);
task.State = MapiTaskState.NotAssigned;

// Set the Yearly recurrence
var recurrence = new MapiCalendarMonthlyRecurrencePattern
{
	Day = 15,
	Period = 12,
	PatternType = MapiCalendarRecurrencePatternType.Month,
	EndType = MapiCalendarRecurrenceEndType.EndAfterNOccurrences,
	OccurrenceCount = 3,
};
task.Recurrence = recurrence;
task.Save("Yearly.msg", TaskSaveFormat.Msg);

Recurrencias Anuales: Tipo EndAfterDate

"End By" opción en la tarea Mapi se logra estableciendo la propiedad OccurrenceCount calculada por la función GetOccurrenceCount(). Esta función toma la fecha de inicio, la fecha de fin y la cadena RRULE. El siguiente fragmento de código muestra cómo crear una recurrencia el día 15 de cada séptimo mes entre la fecha de inicio y la de fin.

// Set the Yearly recurrence
var rec = new MapiCalendarMonthlyRecurrencePattern
{
    Day = 15,
    Period = 12,
    PatternType = MapiCalendarRecurrencePatternType.Month,
    EndType = MapiCalendarRecurrenceEndType.EndAfterDate,
    EndDate = endByDate,
    OccurrenceCount = GetOccurrenceCount(StartDate, endByDate, "FREQ=YEARLY;BYMONTHDAY=15;BYMONTH=7;INTERVAL=1"),
};
task.Recurrence = rec;

Recurrencias Anuales: Tipo de Recurrencia NeverEnd

El siguiente fragmento de código muestra cómo establecer el tipo de fin usando MapiCalendarRecurrenceEndType.NeverEnd.

// Set the Yearly recurrence
var recurrence = new MapiCalendarMonthlyRecurrencePattern
{
    Day = 15,
    Period = 12,
    PatternType = MapiCalendarRecurrencePatternType.Month,
    EndType = MapiCalendarRecurrenceEndType.NeverEnd,
};            

Generar Recurrencia a partir de la Regla de Recurrencia

La API de Aspose.Email proporciona la capacidad de generar un Patrón de Recurrencia a partir de una Regla de Recurrencia (RRULE). Analiza la información del RRULE según las especificaciones iCal RFC 5545 y genera el patrón de recurrencia usando el método MapiCalendarRecurrencePatternFactory.FromString. El siguiente fragmento de código muestra cómo generar un patrón de recurrencia a partir de una regla de recurrencia.

// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook();

DateTime startDate = new DateTime(2015, 7, 16);
DateTime endDate = new DateTime(2015, 8, 1);
MapiCalendar app1 = new MapiCalendar("test location", "test summary", "test description", startDate, endDate);

app1.StartDate = startDate;
app1.EndDate = endDate;

string pattern = "DTSTART;TZID=Europe/London:20150831T080000\r\nDTEND;TZID=Europe/London:20150831T083000\r\nRRULE:FREQ=DAILY;INTERVAL=1;COUNT=7\r\nEXDATE:20150831T070000Z,20150904T070000Z";
app1.Recurrence.RecurrencePattern = MapiCalendarRecurrencePatternFactory.FromString(pattern);

Agregar un Adjuntos a Eventos de Calendario Recurrentes

La API de Aspose.Email proporciona la capacidad de agregar archivos adjuntos a eventos de calendario recurrentes.

DateTime startDate = new DateTime(2018, 7, 19).AddHours(12);
MapiCalendar calendar = new MapiCalendar("location1", "summary1", "description1", startDate, startDate.AddHours(1));

MapiCalendarEventRecurrence recurrence = new MapiCalendarEventRecurrence();
MapiCalendarRecurrencePattern pattern = recurrence.RecurrencePattern = new MapiCalendarDailyRecurrencePattern();
pattern.PatternType = MapiCalendarRecurrencePatternType.Day;
pattern.Period = 1;
pattern.EndType = MapiCalendarRecurrenceEndType.NeverEnd;

DateTime exceptionDate = startDate.AddDays(3);
MapiCalendarExceptionInfo exception = new MapiCalendarExceptionInfo
{
    Location = "exceptionLoc",
    Subject = "exceptionSubj",
    Body = "exceptionBody",
    OriginalStartDate = exceptionDate,
    StartDateTime = exceptionDate,
    EndDateTime = exceptionDate.AddHours(5),
    Attachments = new MapiAttachmentCollection(calendar)
};
exception.Attachments.Add("file.txt", Encoding.ASCII.GetBytes("hello, world!"));

pattern.Exceptions.Add(exception);
pattern.ModifiedInstanceDates.Add(exceptionDate);
pattern.DeletedInstanceDates.Add(exceptionDate);
calendar.Recurrence = recurrence;

using (var newPst = PersonalStorage.Create(dataDir + "AddAttachmentToMapiExceptionInfo.pst", FileFormatVersion.Unicode))
{
    var newFolder = newPst.CreatePredefinedFolder("Calendar", StandardIpmFolder.Appointments);
    newFolder.AddMapiMessageItem(calendar);
}