尝试将生成的PDF发送到谷歌云功能以使用nodemailer发送电子邮件

2024-02-29

目标是让用户在表单中输入一些信息并将其输出到 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 <[email protected] /cdn-cgi/l/email-protection>',
            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 发送到该函数的方法。


在您的客户端上,不要将文件上传为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 <[email protected] /cdn-cgi/l/email-protection>',
          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);
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试将生成的PDF发送到谷歌云功能以使用nodemailer发送电子邮件 的相关文章

  • 在 Node.js 中包含另一个文件中的 JavaScript 类定义

    我正在为 Node js 编写一个简单的服务器 并且使用我自己的类 名为User看起来像 function User socket this socket socket this nickname null just the typical
  • Javascript 无法正确排序 DECIMAL 数字

    我有一些代码可以按字母顺序对名称进行排序 我遇到的问题是它处理小数的方式 它对名称进行排序 如下所示 我宁愿它按数字递增 DOG 1 0510 DOG 1 1031 DOG 11 1792 DOG 12 0920 DOG 12 1170 D
  • Javascript - 使数组索引 toLowerCase() 不起作用

    我试图将所有数组索引设置为小写字符串 但它不起作用 我在这里查看了其他答案并尝试了他们的解决方案 例如使用toString 添加之前toLowerCase但它不起作用 这很奇怪 我创建了一个问题的jsfiddlehere https jsf
  • 如何针对 IE 进行优化?

    我有一个 JS 密集型应用程序 它在 IE 中运行缓慢 我将花费大约一周的时间来优化 IE 并且我想要一些关于尝试的方向 我发现这个线程引用Drip https ieleak svn sourceforge net svnroot iele
  • 通过 Javascript 更改 Webkit 属性?

    请帮助我 可能是因为我对 CSS 动画和 Javascript 相当陌生 但我使用的代码应该更改它的属性 当我运行代码时 它会执行代码中的所有其他操作 除了更改所需 div 的 CSS 属性 我已经尝试了所有这四种方法 但似乎都不起作用 它
  • 从 ES6 模块导入函数表达式或函数声明有什么区别?

    据我了解 参见第 16 3 2 1 节 http exploringjs com es6 ch modules html ES6 允许函数 类导出操作数使用不同的语法 区别在于导出的函数是否需要在导入时解释为函数声明 在这种情况下 您可以编
  • 如何将节点 sqlite3 与 q (promise) 一起使用

    我正在尝试将 Promise 与 sqlite3 一起使用 这是我的源代码的一部分 this deleteTag function tag project var db this db if project return q nfcall
  • Javascript 制作音频 blob

    我正在测试 html 音频标签 我想制作音频 blob url 就像 youtube 或 vimeo 那样 并将其添加到 src 开始播放音频 我一直在测试new Blob and URL createObjectURL 但我不知道如何使用
  • TypeError:cli.init 不是 React Native 的函数

    在 MacBook Air M1 芯片中运行 npx react native init appName 时 TypeError cli init is not a function at run opt homebrew lib node
  • 在each() 和forEach() 中使用break 和 continue

    如果我们不能使用 break 和 continue 关键字 我不确定我是否理解函数式循环 映射的价值 我可以做这个 collections users models forEach function item index can t use
  • 处理时区转换的 JavaScript 库

    是否有一个 JavaScript 库可以处理时区转换 并考虑 DST 规则和此类内容 我知道有类似的问题 但我见过的问题似乎都没有真正适合我的问题的答案 我想在时区 A 创建一个日期并能够对其进行操作 添加天数 小时等 然后将其转换为另一个
  • 用于更改密码的 Firebase 云函数侦听器

    在 Firebase 文档中找不到它 但是是否有像创建帐户时那样的密码更改监听器 functions auth user onCreate 目标 向用户发送一封电子邮件 告知其密码已在 Web 应用程序中更改 No 没有 Firebase
  • 使用淘汰赛动态显示/隐藏元素

    我有一个表 有四列 即代码 名称 数量和价格 其中 我想动态更改数量列的内容 元素 通常 它应该显示其中显示数量的元素 当用户单击元素时 我想显示该元素 以便用户可以编辑数量 我正在尝试按照 示例2 来实现淘汰赛文档链接 http knoc
  • 如何将OpenLayers多边形坐标转换为纬度和经度?

    我正在使用开放层 https openlayers org en latest examples draw freehand html绘制多边形并保存坐标的技术 这是我的代码 var raster new ol layer Tile sou
  • 如何获取 Spotify API 的访问令牌?

    我已经研究 Spotify api 和示例源代码几天了 但我仍然不知道如何获取访问令牌来访问用户的播放列表数据 我已经到达了拉起登录窗口 用户登录 然后收到授权码的地步 此时 我尝试做这样的事情 window open https acco
  • Google Firebase SSL 证书 - 我的证书列出了大量其他网站

    问题 我的 Google Firebase SSL 证书中列出了其他域 我创建了一个 firebase 项目来测试来自 Cloud Functions 的 firebase 身份验证电子邮件 firebase jhanley com htt
  • 为什么我从 c# 到 js 得到不同的 MD5 哈希值?

    我有一个用于加密密码的 C 函数 System Security Cryptography MD5CryptoServiceProvider md5Provider new System Security Cryptography MD5C
  • Dojo“正在加载”消息

    我是 Dojo 新手 所以我需要一些帮助 我的一些链接需要一段时间 当用户单击时 页面开始加载需要几秒钟 我想添加一条 正在加载 消息 我可以用 旧时尚方式 来做 但我想学习新的 更简单 更智能的 Dojo 方式 具体如何工作现在并不重要
  • React Router Tabs——保持组件安装

    我使用 React Router 创建了选项卡 每个选项卡都有不同的路线 但是 我想通过保持隐藏选项卡的安装来维护选项卡转换之间的选项卡状态 我该如何实现这一目标 每次路由切换时 React 路由器都会重新安装每个组件 已经有人问过这个问题
  • 引导网格中的绘图图周围有巨大的空白

    我有一个 Net 应用程序 我试图在其中使用创建一个图表bootstrap js and plotly js 当我创建响应式图表时 我遇到网格中存在巨大空白的问题 我发现问题的一部分是plotly svg container的大小默认高度为

随机推荐