I need to send calendar appointment email attached with ics file contains appointment details, I am getting Mails but Attachment is missing help me, someone to overcome this
Need to create simple ics file and attach it with the email.
Please Look at below code as I tried
public IHttpActionResult cal(calendar objApptEmail)
{
MailMessage msg = new MailMessage();
//Now we have to set the value to Mail message properties
//Note Please change it to correct mail-id to use this in your application
msg.From = new MailAddress("[email protected]", "ABC");
msg.To.Add(new MailAddress("[email protected]", "BCD"));
// msg.CC.Add(new MailAddress("[email protected]", "DEF"));// it is optional, only if required
// msg.Headers.Add("Content-class", "urn:content-classes:calendarmessage");
msg.Subject = "Send mail with ICS file as an Attachment";
msg.Body = "Please Attend the meeting with this schedule";
// Now Contruct the ICS file using string builder
StringBuilder str = new StringBuilder();
str.AppendLine("BEGIN:VCALENDAR");
str.AppendLine("PRODID:-//Schedule a Meeting");
str.AppendLine("VERSION:2.0");
str.AppendLine("METHOD:REQUEST");
str.AppendLine("BEGIN:VEVENT");
str.AppendLine(string.Format("DTSTART:{0:yyyyMMddTHHmmssZ}", DateTime.Now.AddMinutes(+330)));
str.AppendLine(string.Format("DTSTAMP:{0:yyyyMMddTHHmmssZ}", DateTime.UtcNow));
str.AppendLine(string.Format("DTEND:{0:yyyyMMddTHHmmssZ}", DateTime.Now.AddMinutes(+660)));
str.AppendLine("LOCATION: " + objApptEmail.Location);
str.AppendLine(string.Format("UID:{0}", Guid.NewGuid()));
str.AppendLine(string.Format("DESCRIPTION:{0}", msg.Body));
str.AppendLine(string.Format("X-ALT-DESC;FMTTYPE=text/html:{0}", msg.Body));
str.AppendLine(string.Format("SUMMARY:{0}", msg.Subject));
str.AppendLine(string.Format("ORGANIZER:MAILTO:{0}", msg.From.Address));
str.AppendLine(string.Format("ATTENDEE;CN=\"{0}\";RSVP=TRUE:mailto:{1}", msg.To[0].DisplayName, msg.To[0].Address));
str.AppendLine("BEGIN:VALARM");
str.AppendLine("TRIGGER:-PT15M");
str.AppendLine("ACTION:DISPLAY");
str.AppendLine("DESCRIPTION:Reminder");
str.AppendLine("END:VALARM");
str.AppendLine("END:VEVENT");
str.AppendLine("END:VCALENDAR");
System.Net.Mime.ContentType contype = new System.Net.Mime.ContentType("text/calendar");
contype.Parameters.Add("method", "REQUEST");
// contype.Parameters.Add("name", "Meeting.ics");
AlternateView avCal = AlternateView.CreateAlternateViewFromString(str.ToString(), contype);
msg.AlternateViews.Add(avCal);
//Now sending a mail with attachment ICS file.
System.Net.Mail.SmtpClient smtpclient = new System.Net.Mail.SmtpClient();
smtpclient.Host = "smtp.gmail.com"; //-------this has to given the Mailserver IP
smtpclient.EnableSsl = true;
smtpclient.Credentials = new System.Net.NetworkCredential("[email protected]", "xxxxx");
smtpclient.Send(msg);
return Ok();
}
Simply download the . ics attachment, and then drag-and-drop that calendar event into an email to send it to recipients.
Enter your email address and password and Sign In to 'Outlook on the web' (OWA) Select the Calendar you want to share. For Select permissions select Full Details and click the Save button. Copy the 'ICS' link (this is the link you need to paste into app you want to share the calendar with)
I removed all the code and enter the code after testing it on my machine. This is working fine in my case. In your case it's not working try to setup Less secure app in Gmail (I see you are using gmail to send emails)
System.Net.Mail.MailMessage msg = new MailMessage("[email protected]","[email protected]");
StringBuilder str = new StringBuilder();
str.AppendLine("BEGIN:VCALENDAR");
str.AppendLine("PRODID:-//Schedule a Meeting");
str.AppendLine("VERSION:2.0");
str.AppendLine("METHOD:REQUEST");
str.AppendLine("BEGIN:VEVENT");
str.AppendLine(string.Format("DTSTART:{0:yyyyMMddTHHmmssZ}", DateTime.Now.AddMinutes(+330)));
str.AppendLine(string.Format("DTSTAMP:{0:yyyyMMddTHHmmssZ}", DateTime.UtcNow));
str.AppendLine(string.Format("DTEND:{0:yyyyMMddTHHmmssZ}", DateTime.Now.AddMinutes(+660)));
str.AppendLine("LOCATION: " + "abcd");
str.AppendLine(string.Format("UID:{0}", Guid.NewGuid()));
str.AppendLine(string.Format("DESCRIPTION:{0}", msg.Body));
str.AppendLine(string.Format("X-ALT-DESC;FMTTYPE=text/html:{0}", msg.Body));
str.AppendLine(string.Format("SUMMARY:{0}", msg.Subject));
str.AppendLine(string.Format("ORGANIZER:MAILTO:{0}", msg.From.Address));
str.AppendLine(string.Format("ATTENDEE;CN=\"{0}\";RSVP=TRUE:mailto:{1}", msg.To[0].DisplayName, msg.To[0].Address));
str.AppendLine("BEGIN:VALARM");
str.AppendLine("TRIGGER:-PT15M");
str.AppendLine("ACTION:DISPLAY");
str.AppendLine("DESCRIPTION:Reminder");
str.AppendLine("END:VALARM");
str.AppendLine("END:VEVENT");
str.AppendLine("END:VCALENDAR");
byte[] byteArray = Encoding.ASCII.GetBytes(str.ToString());
MemoryStream stream = new MemoryStream(byteArray);
Attachment attach = new Attachment(stream,"test.ics");
msg.Attachments.Add(attach);
System.Net.Mime.ContentType contype = new System.Net.Mime.ContentType("text/calendar");
contype.Parameters.Add("method", "REQUEST");
// contype.Parameters.Add("name", "Meeting.ics");
AlternateView avCal = AlternateView.CreateAlternateViewFromString(str.ToString(), contype);
msg.AlternateViews.Add(avCal);
//Now sending a mail with attachment ICS file.
System.Net.Mail.SmtpClient smtpclient = new System.Net.Mail.SmtpClient();
smtpclient.Host = "smtp.gmail.com"; //-------this has to given the Mailserver IP
smtpclient.EnableSsl = true;
smtpclient.Credentials = new System.Net.NetworkCredential("[email protected]", "testing");
smtpclient.Send(msg);
I once had the same requirement and went well with the assembly Ical.Net.
With this library you dont need to parse all by hand but can use "normal programming" :)
using Ical.Net;
using Ical.Net.DataTypes;
using Ical.Net.Serialization.iCalendar.Serializers;
private static Calendar CreateCalendarEntry(DateTime? start, DateTime? end, string title, string description, string location)
{
Calendar iCal = new Calendar();
iCal.Method = "PUBLISH";
// Create the event, and add it to the iCalendar
Event evt = iCal.Create<Event>();
// Set information about the event
evt.Start = new CalDateTime(start.Value);
evt.End = new CalDateTime(end.Value); // This also sets the duration
evt.Description = description;
evt.Location = location;
evt.Summary = title;
// Create a reminder 24h before the event
Alarm reminder = new Alarm();
reminder.Action = AlarmAction.Display;
reminder.Trigger = new Trigger(new TimeSpan(-24, 0, 0));
evt.Alarms.Add(reminder);
return iCal;
}
You can download the assembly here
After creating the Calendar
, you can easily send it by mail via a stream.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With