Saturday, January 14, 2017

How to send a meeting request correctly with nodemailer?

I am trying to use the following code to send out meeting request using nodemailer. The problem I am facing is that the meeting invite is going as an attachment ics file instead of request where one can directly add. I have tried it on multiple mail client. Any pointers would be highly appreciated.
transport.sendMail({
                    from: 'BakBak.io ',
                    to: 'biplav.saraf@gmail.com',
                    subject: 'Meeting',
                    //html: "Hi",
                    text: "Hola!!",
                    alternative: {
                      contentType: "text/calendar; method=REQUEST; name='meeting.ics';component=VEVENT",
                      contents: new Buffer(cal.toString()),
                      contentEncoding:"7bit",
                      "Content-Class":"urn:content-classes:calendarmessage"
                    },
                    headers: {
                              "Content-Type": "text/calendar", 
                              //"charset":"utf-8",
                              "method":"REQUEST",
                              "component":"VEVENT",
                              "Content-Class":"urn:content-classes:calendarmessage"
                            }//,
                    //attachments : [{filename:'invite.ics',contents: cal.toString()}]
                    }, function(err, responseStatus) {
                    if (err) {
                        console.log(err);
                        res.render('schedule',{errors: err.message});
                    } else {
                        console.log(responseStatus.message);
                        res.render('schedule',{success_msg: "Successfully Created!"});
                    }
                });

Answer:
Gmail does not show meeting request and give an option to add to calendar if sender and receiver are same.
This is what worked for me:
transport.sendMail({
                    from: 'BakBak.io ',
                    to: 'donateoldspectacles@gmail.com',
                    subject: 'Meeting',
                    html: "Hiya!!",
                    text: "Hola!!",
                    alternatives: [{
                      contentType: "text/calendar",
                      content: new Buffer(ical)
                    }]
                    }, function(err, responseStatus) {
                    if (err) {
                        console.log(err);
                        res.render('schedule',{errors: err.message});
                    } else {
                        console.log(responseStatus.message);
                        res.render('schedule',{success_msg: "Successfully Created!"});
                    }
                });
function createIcal(params,uid) {
start = new Date(params.start);
end = new Date(params.end);
ts = new Date();
start = getTZFormat(start);
end = getTZFormat(end);
ts = getTZFormat(ts);
uid = replaceAll('-','',guid());
main_email = params.email;
part_email = params.main_email;
org_name = "BakBak Scheduler";
org_email = "donateoldspectacles@gmail.com";
subject = params.subject;
agenda = params.agenda;
url = 'http://www.bakbak.io/schedule/meeting/parts?users='+main_email+','+part_email;
escaped_url = ' <'+url+'>';
return 'BEGIN:VCALENDAR\r\n'
+'PRODID:-//Bakbak//BakBak Scheduler Calendar 1.0//EN\r\n'
+'VERSION:2.0\r\n'
+'CALSCALE:GREGORIAN\r\n'
+'METHOD:REQUEST\r\n'
+'BEGIN:VEVENT\r\n'
+'DTSTAMP:'+ts+'\r\n'
+'DTSTART:'+start+'\r\n'
+'DTEND:'+end+'\r\n'
+'SUMMARY:'+subject+escaped_url+'\r\n'
+'UID:'+ uid +'\r\n'
+'DESCRIPTION:'+ agenda +' \r\n'
+'LOCATION: Web Location'+escaped_url+'\r\n'
+'ORGANIZER;CN='+org_name+':mailto:'+org_email+'\r\n'
+'ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN='+part_email+';X-NUM-GUESTS=0:mailto:'+part_email+'\r\n'
+'ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN='+main_email+';X-NUM-GUESTS=0:mailto:'+main_email+'\r\n'
+'SEQUENCE:0\r\n'
+'LAST-MODIFIED:'+ts+'\r\n'
+'CREATED:'+ts+'\r\n'
+'TRANSP:OPAQUE\r\n'
+'STATUS:CONFIRMED\r\n'
+'END:VEVENT\r\n'
+'END:VCALENDAR\r\n';
}