是否可以使用 nodeJS 创建 outlook 的会议请求?

Is it possible to create a meeting request for outlook with nodeJS?

我正在使用 Angular 和 Node 开发一个非常基本的日历,我还没有找到任何代码。

工作流程如下:创建一个事件,输入收件人的 e-mail 地址,验证事件。 这会触发发送给收件人的 e-mail。邮件应采用 outlook 会议请求格式(不是附件 object)。

这意味着当在 Outlook 中收到会议时,会自动添加到日历中。

这可能吗?如果是,是否可以在节点端仅使用 javascript?

只要您可以在 Node 中使用 SOAP,并且如果您可以使用 NTLM 身份验证与 Node 交换,应该是可能的。我相信每个都有模块。

我发现这个 blog 在使用 PHP

设计类似系统时非常有用

对于那些仍在寻找答案的人,以下是我如何设法为我找到完美的解决方案。 我使用 iCalToolkit 创建了一个日历 object。

确保所有相关字段都已设置(组织者和与会者 RSVP)很重要。

最初我使用 Postmark API 服务来发送我的电子邮件,但这个解决方案只能通过发送 ics.file 附件来工作。

我切换到 Postmark SMTP 服务,您可以在其中将 iCal 数据嵌入邮件中,为此我使用了 nodemailer。

这是它的样子:

        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: 'message@domain.com',
            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);  
            }
        });

这会发送一个带有“接受”、“拒绝”和“拒绝”按钮的真实会议请求。

如此微不足道的功能需要完成的工作量以及所有这些都没有得到很好的记录,真是令人难以置信。 希望这有帮助。

如果您不想在早期接受的解决方案中使用 smtp 服务器方法,您可以使用以 Exchange 为中心的解决方案。当前接受的答案有什么问题?它不会在发件人的日历中创建会议,您没有会议项目的所有权供发件人进一步修改 Outlook/OWA。

这里是 javascript 中使用 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("user1@constoso.com");
appointment.RequiredAttendees.Add("user2@constoso.com");
appointment.OptionalAttendees.Add("user3@constoso.com");

appointment.Save(ews.SendInvitationsMode.SendToAllAndSaveCopy).then(function () {
    console.log("done - check email");
}, function (error) {
    console.log(error);
});

我没有使用 'ical-generator',而是使用 'ical-toolkit' 来构建日历邀请活动。 使用它,邀请直接附加在电子邮件中而不是附加的 .ics 文件对象中。

这是一个示例代码:

const icalToolkit = require("ical-toolkit");

//Create a builder
var builder = icalToolkit.createIcsFileBuilder();
builder.method = "REQUEST"; // The method of the request that you want, could be REQUEST, PUBLISH, etc

//Add events
builder.events.push({
  start: new Date(2020, 09, 28, 10, 30),
  end: new Date(2020, 09, 28, 12, 30),
  timestamp: new Date(),
  summary: "My Event",
  uid: uuidv4(), // a random UUID
  categories: [{ name: "MEETING" }],
  attendees: [
    {
      rsvp: true,
      name: "Akarsh ****",
      email: "Akarsh **** <akarsh.***@abc.com>"
    },
    {
      rsvp: true,
      name: "**** RANA",
      email: "**** RANA <****.rana1@abc.com>"
    }
  ],
  organizer: {
    name: "A****a N****i",
    email: "A****a N****i <a****a.r.n****i@abc.com>"
  }
});

//Try to build
var icsFileContent = builder.toString();

//Check if there was an error (Only required if yu configured to return error, else error will be thrown.)
if (icsFileContent instanceof Error) {
  console.log("Returned Error, you can also configure to throw errors!");
  //handle error
}

var mailOptions = { // Set the values you want. In the alternative section, set the calender file
            from: obj.from,
            to: obj.to,
            cc: obj.cc,
            subject: result.email.subject,
            html: result.email.html,
            text: result.email.text,
            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);  
            }
        });

请检查以下示例:

const options = {
    authProvider,
};

const client = Client.init(options);

const onlineMeeting = {
  startDateTime: '2019-07-12T14:30:34.2444915-07:00',
  endDateTime: '2019-07-12T15:00:34.2464912-07:00',
  subject: 'User Token Meeting'
};

await client.api('/me/onlineMeetings')
    .post(onlineMeeting);

更多信息:https://docs.microsoft.com/en-us/graph/api/application-post-onlinemeetings?view=graph-rest-1.0&tabs=http