Отправлено iCal-Entry с nodemailer: обработка и обновление Outlook-Calendar-Entry, когда участник отвечает - PullRequest
0 голосов
/ 28 июня 2019

У меня проблема с обработкой ответов от отправленных iCal-приглашений.У меня есть узел JS-Backend, который отправляет приглашения на собрание в список участников, используя nodemailer и ical-generator .(Код ниже)

Что я обычно делаю:

  1. Создание iCal с посетителями
  2. Настройка органайзера
  3. Отправка всем участниками органайзер (скрытая копия) с методом REQUEST

Теперь я хотел бы предоставить посетителю опцию rsvp, поэтому я установил для этого значения значение true.Теперь, когда участник отвечает «ПРИНЯТ | ТЕНТАТИВНЫЙ | ОТМЕНЕН», учетная запись организатора электронной почты получает ответ, но соответствующая запись iCal вообще не обновляется.

Швы Outlook не могут связать ответ сческих-Entry.Это определенно имеет смысл, потому что iCal был создан не учетной записью организаторов, а самим сервером.

Итак, мой вопрос: есть ли возможность отправить iCal-запись с сервера участникам и организатору, а затем получить ответы от участников с обновлением записи календаря в календаре организаторов?

Я попробовал несколько вещей, играя с UID iCal-Entry, методы переключения (REQUEST, PUBLISH и т. Д.), Но ничего не помогло.

Любые треки в Outlook, которые могли бы дать некоторыевход?Возможно, используя Sharepoint-Calendar или похожий подход?

Действительно застрял на этом и благодарен за любые подсказки.

Кодовые рецепты

Код для созданияiCal-Entry:

createIcal(calTitle, startDate, endDate, esTitle, esDescription, method, attendees) {
        let cal = icalGenerator({
            domain: 'test.de',
            name: calTitle,
            timezone: 'Europe/Berlin',
            method: method
        });
        startDate = new Date(startDate);
        endDate = new Date(endDate);

        cal.prodId({
            company: 'Test AG',
            product: 'Test product',
            language: 'DE'
        });

        let formattedAttendees = [];
        if (attendees) {
            for (let attendee of attendees) {
                formattedAttendees.push({
                    email: attendee.email,
                    rsvp: true,
                    status: 'accepted',
                    type: 'individual',
                    role: (attendee.email === 'organizer@email.de' ? 'chair':'req-participant')
                });
            }
        }


        let ev = cal.createEvent({
            start: startDate,
            end: endDate,
            summary: esTitle,
            description: esDescription,
            location: 'somewhere',
            url: 'https://test.de',
            organizer: {
                name: 'organizer@email.de',
                email: 'organizer@email.de',
                mailto: 'organizer@email.de'
            },
            attendees: formattedAttendees
        });
        return cal.toString();
    }

Код для отправки электронного письма с ics:

async sendmail(receivers, subject, html, iCal, iCalMethod) {
        html = '<html><body>' + html;
        html += '</body></html>';

        let plainText = EmailTemplate.getPlainTextFromHTML(html);

        let smtpOptions = {
            name: 'test.de',
            host: 'mx.test.de',
            port: 587,
            pool: true,
            auth: {
                user: 'test',
                pass: 'test'
            },
            secure: false,
            tls: {
                rejectUnauthorized: false
            }
        };

        let transporter = nodemailer.createTransport(smtpOptions);

        let mailOptions = {
            from: 'admin@test.com',
            bcc: receivers,
            subject: subject,
            html: html,
            text: plainText
        };
        if (iCal) {
            /*mailOptions.alternatives = [{
                contentType: 'text/calendar; charset="utf-8"; method=' + iCalMethod,
                content: iCal
            }]*/
            mailOptions.icalEvent = {
                filename: 'test.ics',
                method: iCalMethod,
                content: iCal
            }
        }

        // verify connection configuration
        transporter.verify(function (error, success) {
            if (error) {
                console.log(error);
            } else {
                console.log("Server is ready to take our messages");
            }
        });

        if (receivers.length > 0) {
            transporter.sendMail(mailOptions, function (error, info) {
                if (error) {
                    console.log(error);
                } else {
                    console.log('Email sent: ' + info.response);
                }
            });
        }
    }
...