【问题标题】:How do I retrieve the Twilio fax PDF and attach it to an email using Node.js inside a Twilio function?如何在 Twilio 函数中使用 Node.js 检索 Twilio 传真 PDF 并将其附加到电子邮件中?
【发布时间】:2018-11-22 07:57:40
【问题描述】:

有什么方法可以使用 Twilio 的无服务器选项来检索之前传真的 PDF 并将其附加到电子邮件中?

通过查看示例,我学会了如何在我自己的个人 Web 服务器上的 WordPress 中使用 PHP 执行此操作。这是一个 WordPress PHP 代码的 sn-p 代码,它检索使用 Twilio 传真的 PDF,然后发送带有 PDF 作为附件的电子邮件:

<?php
  $mediaurl = $_GET["MediaUrl"];
  $path = '/some/path/on/your/web/server/where/to/save/the/PDF';
  $attachment = $filename = $path . $_GET["FaxSid"] . '.pdf';
  require_once('wp-load.php');
  $response = wp_remote_get( $mediaurl, array( 'timeout' => '300', 'stream' => true, 'filename' => $filename ) );
  wp_mail( 'somebody@somewhere.com', 'You have a fax', 'See attached PDF', 'From: <someone@someplace.com>', $attachment );
?>

如果有人正在了解这些事情,我将上述代码保存在我的网络服务器上的twilio-fax-receive.php 文件中。为了在每次收到传真时运行它,我在 Twilio 上设置了一个 TwiML Bin——我称之为 receive-fax——其中包含以下代码:

<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Receive action="https://www.somewhere.com/twilio-fax-receive.php" method="GET"/>
</Response>

然后,在接收传真的传真号码的“配置”页面上,我选择了显示“A FAX COMES IN”的 TwiML,然后选择了我的接收传真 TwiML Bin。

但回到我的问题。

我可以在 Twilio 函数中使用 Node.js 复制它吗?或者其他方式只使用 Twilio,没有我自己的网络服务器?有没有办法获取 PDF 的内容,使用 base64 对其进行编码,然后使用 SendGrid 或 Node.js 中的其他服务即时附加到电子邮件?

有人有一个可行的例子吗?我已经尝试了很多我在网上找到的涉及 request.get 和 got.stream 和 pipe 以及 Buffer 和 fs 的东西,但无济于事......

我不是开发人员,我认为我的想法有点过头了。非常感谢您的帮助。

【问题讨论】:

    标签: node.js twilio twilio-api


    【解决方案1】:

    这里是 Twilio 开发者宣传员。

    是的,您可以在 Twilio Function 中使用 Node.js 复制它。以下是使用 SendGrid 发送电子邮件的方法:

    1. request 添加到您的Runtime dependencies。我使用版本2.88.0
    2. 将以下环境变量添加到您的Functions config
      • TO_EMAIL_ADDRESS:您要将传真发送到的电子邮件地址。
      • FROM_EMAIL_ADDRESS:您要接收传真的电子邮件地址。
      • SENDGRID_API_KEY:您的 SendGrid API 密钥
    3. 保存配置部分
    4. 新建一个函数,添加如下代码:

      const request = require('request');
      
      exports.handler = function(context, event, callback) {
        const faxUrl = event.MediaUrl;
      
        const email = {
          personalizations: [{ to: [{ email: context.TO_EMAIL_ADDRESS }] }],
          from: { email: context.FROM_EMAIL_ADDRESS },
          subject: `New fax from ${event.From}`,
          content: [
            {
              type: 'text/plain',
              value: 'Your fax is attached.'
            }
          ],
          attachments: []
        };
      
        request.get({ uri: faxUrl, encoding: null }, (error, response, body) => {
          if (!error && response.statusCode == 200) {
            email.attachments.push({
              content: body.toString('base64'),
              filename: `${event.FaxSid}.pdf`,
              type: response.headers['content-type']
            });
          }
          request.post(
            {
              uri: 'https://api.sendgrid.com/v3/mail/send',
              body: email,
              auth: {
                bearer: context.SENDGRID_API_KEY
              },
              json: true
            },
            (error, response, body) => {
              if (error) {
                return callback(error);
              } else {
                if (response.statusCode === 202) {
                  return callback(null, new Twilio.twiml.VoiceResponse());
                } else {
                  return callback(body);
                }
              }
            }
          );
        });
      };
      
    5. 给函数一个路径并保存它。

    6. 将路径作为action 属性添加到TwiML bin 中的&lt;Receive&gt; 元素。
    7. 发送传真并观看它到达您的收件箱。

    如果这对你有用,请告诉我,我会在有时间的时候更详细地写下代码的工作原理。

    【讨论】:

    • 哇!!谢谢菲尔!我会试一试并报告。
    • 像魅力一样工作! email.attachments.push 非常巧妙——我认为我在之前看过的任何示例中都没有看到过这一点。 request.post 块中有return callback(err)——这是不是应该是return callback(error) 的错字?我很想知道return callback(null, new Twilio.twiml.VoiceResponse()) 的用途。如果你有时间解释这一切是如何运作的,那肯定很棒。再次感谢您,@philnash!
    • 很高兴它有效!我会在某个时候写下来,但你对err 错字是正确的。否则返回 new Twilio.twiml.VoiceResponse() 只会向 Twilio 发送一个空的 XML &lt;Response/&gt;,让他们知道一切正常。
    • 顺便说一句,我修改了你的整个代码,并从另一个函数中将函数 URL 设为我的 statusCallback。这样,在我发送传真后,收件人会像往常一样收到传真,我还会收到一封电子邮件,其中包含传真传输详细信息以及 Twilio 传真的附件 PDF。律师希望他们的案件有这种详细程度。我的下一步是研究安全传输 - 即,可能会在成功交付后立即删除所有可公开访问的传真。
    • 刚刚看到您的评论是错字和 VoiceResponse。说得通。谢谢。
    【解决方案2】:

    如果您使用的是 Gmail,还有另一种简单的方法。

    创建一个谷歌应用程序脚本,使用 MailApp 将电子邮件发送到您想要的任何地方。 使用“MediaUrl”参数作为附件发送。

    function doGet(e) {
            var emailAddress = "EMAIL_ADDR_TO_SEND_TO";
            var from = e.parameter.From;
            var subject = "New Fax from  " + from;
            var body = "New fax attached";
            var fileUrl = e.parameter.MediaUrl;
            var file = UrlFetchApp.fetch(fileUrl);
    
              MailApp.sendEmail(emailAddress, subject, body, {
            attachments: [file.getAs(MimeType.PDF)]
          });
          }
    

    将其部署为公开的网络应用。

    复制 URL 并将其插入到 TwiML &lt;Receive/&gt; 标记的 "action" 属性中。 确保将"method" 设置为"GET"

    TwiML 应该是这样的

    <?xml version="1.0" encoding="UTF-8"?>
    <Response>
      <Receive action="YOUR_GOOGLE_WEBAPP_URL" method="GET"/>
    </Response>
    

    然后将您的 Twilio 编号配置到该 TwiML 文件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 2015-11-13
      • 2016-06-13
      • 2017-11-01
      • 2014-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多