【问题标题】:Trying to send a generated PDF to a google cloud function to send an email with nodemailer尝试将生成的 PDF 发送到谷歌云功能以使用 nodemailer 发送电子邮件
【发布时间】:2020-01-03 23:21:34
【问题描述】:

我们的目标是让用户在表单中输入一些信息并将其输出到 PDF 中。我正在使用 JSPDF 来解析和创建 PDF。我已经成功获得了制作可打印 PDF 的代码,但为了不让纸张在办公室里四处飘荡,我创建了一个云功能,将 PDF 通过电子邮件发送给客户。

这是我在前端的代码。 maildoc 是我制作的pdf,它没有被打印或任何东西。所以它只存在于内存中。

mailDoc = mailDoc.output('datauri');
                mailFunction += "&?data=" + mailDoc;

                //axios request to the cloud function
                axios.get(mailFunction).then( function (response) {
                    console.log(response);
                }).catch(function (error) {
                    console.log(error)
                })

这是我在云功能上的代码

exports.sendMail = functions.https.onRequest((req, res) => {
    cors(req, res, () => {

        // getting dest email by query string
        //?dest= DestinationEmail
        const dest = req.query.dest;
        const data = req.query.data;



        const mailOptions = {
            from: 'whatever <whatever@hoobashaka.com>',
            to: dest,
            subject: "You're Equipment Return to HBCI", // email subject
            attachments :[
                {
                    filename: 'return.pdf',
                    contentType: 'application/pdf',
                    path: data,
                }
            ],
        };
return transporter.sendMail(mailOptions, (erro, info) => {
            if(erro){
                return res.send(erro.toString());
            }
            return res.send('Sended');
        });
    });

如果我尝试通过 URI 发送数据,我会收到 413 错误,可能是因为该 URI 很大。但我想不出另一种将生成的 PDF 发送到函数的方法。

【问题讨论】:

  • 是否可以改为发送 POST 请求并在正文中而不是在 URI 上发送数据

标签: javascript firebase google-cloud-functions jspdf nodemailer


【解决方案1】:

在您的客户端上,我不会将文件作为 datauri 上传,而是使用 POST 并将 PDF 发送到请求正文中(就像您使用表单提交文件一样)。

mailDocBlob = mailDoc.output('blob');

const data = new FormData();
data.set('dest', someEmail);
data.append('file', mailDocBlob, 'return.pdf');

axios({
  method: 'post',
  url: 'https://your-cloud-function.here/sendMail',
  data: data,
  headers: {
    'Content-Type': `multipart/form-data; boundary=${data._boundary}`,
  }
})
.then(function (response) {
  console.log(response);
})
.catch(function (error) {
  console.log(error);
});

在服务器上,您将使用busboy 包处理多部分表单数据。

const BusBoy = require('busboy');

exports.sendMail = functions.https.onRequest((req, res) => {
    cors(req, res, (err) => {
      if (err) {
        // CORS failed. Abort.
        console.log("CORS failed/rejected");
        res.sendStatus(403); // 403 FORBIDDEN
        return;
      }

      if (req.method !== 'POST') {
        res.set('Allow', 'POST, OPTIONS').sendStatus(405); // 405 METHOD_NOT_ALLOWED
        return;
      }

      let busboy = new BusBoy({headers: req.headers, limits: {files: 1}}); // limited to only a single file

      const mailOptions = {
          from: 'whatever <whatever@hoobashaka.com>',
          to: dest,
          subject: "Your Equipment Return to HBCI", // email subject - fixed typo
          attachments: []
      };

      busboy.on('file', (fieldname, file, filename, encoding, mimetype) => {
          // add new file attachment
          mailOptions.attachments.push({
              filename: 'return.pdf',
              contentType: 'application/pdf',
              content: file, // file is a stream
          });
      })
      .on('finish', () => {
        if (mailOptions.attachments.length == 0) {
          // not enough attachments
          res.status(400).send('Error: not enough attachments');
          return;
        }

        return transporter.sendMail(mailOptions, (erro, info) => {
            if (erro) {
                return res.status(500).send('Error: ' + erro.toString());
            }
            return res.send('Sent');
        })
      })
      .on('error', (err) => {
        console.error(err);
        res.status(500).send('Error: ' + err.code);
      });

      req.pipe(busboy);
});

【讨论】:

    猜你喜欢
    • 2021-07-12
    • 2015-02-14
    • 2014-10-26
    • 1970-01-01
    • 2015-05-19
    • 2011-03-21
    相关资源
    最近更新 更多