4

我正在尝试使用以下代码使用 nodemailer 发送会议请求。我面临的问题是会议邀请作为附件 ics 文件而不是可以直接添加的请求。我已经在多个邮件客户端上尝试过。任何指针将不胜感激。

transport.sendMail({
                    from: 'BakBak.io <biplav.saraf@gmail.com>',
                    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!"});
                    }
                });
4

3 回答 3

2

如果发件人和收件人相同,Gmail 不会显示会议请求并提供添加到日历的选项。

这对我有用:

transport.sendMail({
                    from: 'BakBak.io <biplav.saraf@gmail.com>',
                    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!"});
                    }
                });
于 2014-06-20T15:13:30.897 回答
2

这在不使用 ical-generator 的情况下对我有用

const express    = require('express');
const http       = require('http');
const bodyParser = require('body-parser');
const nodeMailer = require('nodemailer');
const cors  = require('cors');

const app = express();

app.use(cors());

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

app.post("/v1/sendemail", (req, res) => {

  let transporter = nodeMailer.createTransport({
    host: "smtp.xxx.de",
    secureConnection: true,
    port: 465,
    tls: {
      chipers: "SSLv3"
    },
    auth: {
      user: "xxx@xxx.xxx",
      pass: "xxx"
    }
  });
  let content = 'BEGIN:VCALENDAR\n' +
        'VERSION:2.0\n' +
        'BEGIN:VEVENT\n' +
        'SUMMARY:Summary123\n' +
        'DTSTART;VALUE=DATE:20201030T093000Z\n' +
        'DTEND;VALUE=DATE:20201030T113000Z\n' +
        'LOCATION:Webex \n' +
        'DESCRIPTION:Description123\n' +
        'STATUS:CONFIRMED\n' +
        'SEQUENCE:3\n' +
        'BEGIN:VALARM\n' +
        'TRIGGER:-PT10M\n' +
        'DESCRIPTION:Description123\n' +
        'ACTION:DISPLAY\n' +
        'END:VALARM\n' +
        'END:VEVENT\n' +
        'END:VCALENDAR';

  let mailOptions = {
    from: "from@xxx.xx",
    to: "to@xxx.xx",
    subject: "Subject",
    text: "Test",
    icalEvent: {
        filename: "invitation.ics",
        method: 'request',
        content: content
        }
      };

  transporter.sendMail(mailOptions, function(error, info) {
    if (error) {
      res.status(500).send({
        message: {
          Error: "Could not sent email"
        }
      })
    }
  });
});

const port = process.env.PORT || '3001';
app.set('port', port);

const server = http.createServer(app);
server.listen(port, () => {
  console.log(`API running on localhost:${port}`);
});
于 2020-08-26T15:57:46.203 回答
0

我认为问题出在此处:"Content-Type": "text/calendar" 如果您只想将内容添加为纯文本或 HTML,用户可以在其中单击电子邮件中的链接来添加它,那么您可能想要使用textHTML标题。您可以简单地将链接发送到 Google 日历,例如,用户可以从那里简单地单击并加入活动。

"Content-Type": "text/calendar"使邮件发件人/客户相信有一个实际文件附加或与电子邮件相关联。

Update:

附加的 ICS 文件必须附加,否则邮件客户端无法判断它是一个事件,您只需要使用正确的标头即可。例如:

Content-Type: text/calendar; method=REQUEST
Content-Transfer-Encoding: Base64
Content-Disposition: attachment; filename=iCal-20140610-083450.ics

附加 .ics 文件。邮件客户端将足够聪明地找出它,并在单击时提供添加到本地日历的选项。

有一些邮件客户端,例如AirMail自动检测文本中的任何日期,不需要附件,并允许用户直接将事件集成到本地日历,但此功能并未广泛使用。

于 2014-06-20T09:43:38.010 回答