Criar um iCal (arquivo ics) é muito simples. Neste post, mostrarei como criar um, anexá-lo à um e-mail e enviá-lo
Primeiro de tudo, este é o formato básico de parâmetros que precisamos preencher para criar um ICS
- BEGIN:VCALENDAR
- PRODID:-//LEEDS MUSIC SCENE//EN
- VERSION:2.0
- METHOD:PUBLISH
- BEGIN:VEVENT
- SUMMARY:BAND @ VENUE
- PRIORITY:0
- CATEGORIES:GIG
- CLASS:PUBLIC
- DTSTART:STARTTIME
- DTEND:ENDTIME
- URL:LINK TO LMS GIG PAGE
- DESCRIPTION:FULL BAND LIST
- LOCATION:VENUE
- END:VEVENT
- END:VCALENDAR
O calendário começa com a palavra-chave BEGIN: VCALENDAR e termina com END: VCALENDAR . Entre o calendário, você pode adicionar quantos eventos desejar, começando cada evento com BEGIN: VEVENT e terminando com END: VEVENT .
Veja como criá-lo utilizando uma StringBuilder:
StringBuilder sb = new StringBuilder(); string DateFormat = "yyyyMMddTHHmmssZ"; string now = DateTime.Now.ToUniversalTime().ToString(DateFormat); sb.AppendLine("BEGIN:VCALENDAR"); sb.AppendLine("PRODID:-//Compnay Inc//Product Application//EN"); sb.AppendLine("VERSION:2.0"); sb.AppendLine("METHOD:PUBLISH"); DateTime dtStart = Convert.ToDateTime("01/01/2019"); DateTime dtEnd = Convert.ToDateTime("02/02/2019"); sb.AppendLine("BEGIN:VEVENT"); sb.AppendLine("DTSTART:" + dtStart.ToUniversalTime().ToString(DateFormat)); sb.AppendLine("DTEND:" + dtEnd.ToUniversalTime().ToString(DateFormat)); sb.AppendLine("DTSTAMP:" + now); sb.AppendLine("UID:" + Guid.NewGuid()); sb.AppendLine("CREATED:" + now); sb.AppendLine("X-ALT-DESC;FMTTYPE=text/html:" + "<b>OIII</b>"); sb.AppendLine("LAST-MODIFIED:" + now); sb.AppendLine("LOCATION:" + "Sala Principal"); sb.AppendLine("SEQUENCE:0"); sb.AppendLine("STATUS:CONFIRMED"); sb.AppendLine("SUMMARY:" + "Isto é uma reunião"); sb.AppendLine("TRANSP:OPAQUE"); sb.AppendLine("END:VEVENT"); sb.AppendLine("END:VCALENDAR");
Para anexá-lo dentro de um e-mail, basta convertê-lo para Stream, veja o código completo:
MailMessage message = new MailMessage(); message.To.Add("xx@xxxx.com.br"); message.From = new MailAddress("xxxx@xxxxx.com.br", "Company, Inc"); message.Subject = "subject"; message.Body = "emailbody"; message.BodyEncoding = UTF8Encoding.UTF8; message.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure; message.IsBodyHtml = true; message.IsBodyHtml = true; StringBuilder sb = new StringBuilder(); string DateFormat = "yyyyMMddTHHmmssZ"; string now = DateTime.Now.ToUniversalTime().ToString(DateFormat); sb.AppendLine("BEGIN:VCALENDAR"); sb.AppendLine("PRODID:-//Compnay Inc//Product Application//EN"); sb.AppendLine("VERSION:2.0"); sb.AppendLine("METHOD:PUBLISH"); DateTime dtStart = Convert.ToDateTime("01/01/2019"); DateTime dtEnd = Convert.ToDateTime("02/02/2019"); sb.AppendLine("BEGIN:VEVENT"); sb.AppendLine("DTSTART:" + dtStart.ToUniversalTime().ToString(DateFormat)); sb.AppendLine("DTEND:" + dtEnd.ToUniversalTime().ToString(DateFormat)); sb.AppendLine("DTSTAMP:" + now); sb.AppendLine("UID:" + Guid.NewGuid()); sb.AppendLine("CREATED:" + now); sb.AppendLine("X-ALT-DESC;FMTTYPE=text/html:" + "<b>OIII</b>"); sb.AppendLine("LAST-MODIFIED:" + now); sb.AppendLine("LOCATION:" + "Sala Principal"); sb.AppendLine("SEQUENCE:0"); sb.AppendLine("STATUS:CONFIRMED"); sb.AppendLine("SUMMARY:" + "Isto é uma reunião"); sb.AppendLine("TRANSP:OPAQUE"); sb.AppendLine("END:VEVENT"); sb.AppendLine("END:VCALENDAR"); var calendarBytes = Encoding.UTF8.GetBytes(sb.ToString()); MemoryStream ms = new MemoryStream(calendarBytes); System.Net.Mail.Attachment attachment = new System.Net.Mail.Attachment(ms, "event.ics", "text/calendar"); message.Attachments.Add(attachment); SmtpClient smtp = new SmtpClient("xxxxxxxxx",587); System.Net.NetworkCredential aCred = new System.Net.NetworkCredential("xxxxx@xxxxx.com.br", "xxxxxxxx"); smtp.EnableSsl = true; smtp.UseDefaultCredentials = false; smtp.Credentials = aCred; smtp.DeliveryMethod = SmtpDeliveryMethod.Network; smtp.Send(message)
Com isso, o sistema deverá enviar um e-mail com um arquivo ICS como anexo, que contém um compromisso/reunião. Você pode customizá-lo para colocar parâmetros dinâmicos, múltiplos remetentes etc.
Um grande abraço a todos!
Refs: https://esausilva.com/2016/11/17/create-ical-ics-files-in-c-asp-net-mvc-several-methods/