Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create ics file and send email with Attachment using c#

Tags:

c#

outlook

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();       

}
like image 517
Raja sekhar Avatar asked Mar 19 '18 07:03

Raja sekhar


People also ask

How do I attach an ics file to an email?

Simply download the . ics attachment, and then drag-and-drop that calendar event into an email to send it to recipients.

How do I share an ics file?

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)


2 Answers

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);
like image 67
Anirudha Gupta Avatar answered Sep 18 '22 12:09

Anirudha Gupta


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.

like image 26
Chrᴉz remembers Monica Avatar answered Sep 19 '22 12:09

Chrᴉz remembers Monica