Solución:
Para aquellos que aún buscan una respuesta, así es como logré obtener la solución perfecta para mí. Usé iCalToolkit para crear un objeto de calendario.
Es importante asegurarse de que todos los campos relevantes estén configurados (organizador y asistentes con RSVP).
Inicialmente, estaba usando el servicio Postmark API para enviar mis correos electrónicos, pero esta solución solo funcionaba enviando un archivo adjunto ics.file.
Cambié al servicio Postmark SMTP donde puede incrustar los datos de iCal dentro del mensaje y para eso usé nodemailer.
Esto es lo que parece :
var icalToolkit = require('ical-toolkit');
var postmark = require('postmark');
var client = new postmark.Client('xxxxxxxKeyxxxxxxxxxxxx');
var nodemailer = require('nodemailer');
var smtpTransport = require('nodemailer-smtp-transport');
//Create a iCal object
var builder = icalToolkit.createIcsFileBuilder();
builder.method = meeting.method;
//Add the event data
var icsFileContent = builder.toString();
var smtpOptions = {
host:'smtp.postmarkapp.com',
port: 2525,
secureConnection: true,
auth:{
user:'xxxxxxxKeyxxxxxxxxxxxx',
pass:'xxxxxxxPassxxxxxxxxxxx'
}
};
var transporter = nodemailer.createTransport(smtpTransport(smtpOptions));
var mailOptions = {
from: '[email protected]',
to: meeting.events[0].attendees[i].email,
subject: 'Meeting to attend',
html: "Anything here",
text: "Anything here",
alternatives: [{
contentType: 'text/calendar; charset="utf-8"; method=REQUEST',
content: icsFileContent.toString()
}]
};
//send mail with defined transport object
transporter.sendMail(mailOptions, function(error, info){
if(error){
console.log(error);
}
else{
console.log('Message sent: ' + info.response);
}
});
Esto envía una solicitud de reunión real con el botón Aceptar, rechazar y Rechazar.
Es realmente increíble la cantidad de trabajo que necesita para realizar una funcionalidad tan trivial y cómo todo esto no está bien documentado. Espero que esto ayude.
Si no desea utilizar el enfoque de servidor smtp en una solución aceptada anteriormente, tiene disponible una solución enfocada en Exchange. ¿Qué está mal en la respuesta aceptada actual? no crea una reunión en el calendario del remitente, usted no es propietario del elemento de la reunión para que el remitente Outlook / OWA lo modifique más.
aquí está el fragmento de código en javascript usando el paquete npm ews-javascript-api
var ews = require("ews-javascript-api");
var credentials = require("../credentials");
ews.EwsLogging.DebugLogEnabled = false;
var exch = new ews.ExchangeService(ews.ExchangeVersion.Exchange2013);
exch.Credentials = new ews.ExchangeCredentials(credentials.userName, credentials.password);
exch.Url = new ews.Uri("https://outlook.office365.com/Ews/Exchange.asmx");
var appointment = new ews.Appointment(exch);
appointment.Subject = "Dentist Appointment";
appointment.Body = new ews.TextBody("The appointment is with Dr. Smith.");
appointment.Start = new ews.DateTime("20170502T130000");
appointment.End = appointment.Start.Add(1, "h");
appointment.Location = "Conf Room";
appointment.RequiredAttendees.Add("[email protected]");
appointment.RequiredAttendees.Add("[email protected]");
appointment.OptionalAttendees.Add("[email protected]");
appointment.Save(ews.SendInvitationsMode.SendToAllAndSaveCopy).then(function () {
console.log("done - check email");
}, function (error) {
console.log(error);
});