有什么方法可以使用Twilio的无服务器选项来检索先前传真的PDF并将其附加到电子邮件中?
通过查看示例,我已经了解了如何在自己的个人Web服务器上的WordPress中使用PHP来执行此操作。这是WordPress PHP代码的一个片段,该片段检索使用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 );
?>
万一有人在学习这些东西,我将上面的代码保存在Web服务器上的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>
然后,在“配置”页面上的接收传真的传真号上,我选择了TwiML,其中显示“ A FAX COMES IN”,然后选择了我的接收传真TwiML Bin。
但是回到我的问题。
我可以在Twilio函数中使用Node.js复制它吗?还是仅使用Twilio而不使用自己的Web服务器的其他方式?有没有一种方法来获取PDF的内容,使用base64对其进行编码,并使用SendGrid或Node.js中的其他一些服务将其附加到电子邮件上?
有人有可行的例子吗?我已经尝试了很多在Web上发现的涉及request.get和got.stream和pipe以及Buffer和fs的东西,但无济于事...
我不是开发人员,我认为我的想法不对劲。非常感谢您的帮助。
答案 0 :(得分:0)
这里是Twilio开发人员的传播者。
是的,您可以在Twilio Function中使用Node.js复制它。使用SendGrid发送电子邮件的方法如下:
request
添加到您的Runtime dependencies中。我使用了2.88.0
版TO_EMAIL_ADDRESS
:要将传真发送到的电子邮件地址。FROM_EMAIL_ADDRESS
:要从中接收传真的电子邮件地址。SENDGRID_API_KEY
:您的SendGrid API密钥创建一个新函数并添加以下代码:
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);
}
}
}
);
});
};
为Function提供路径并保存。
action
属性添加到TwiML bin中的<Receive>
元素。让我知道这是否对您有用,我将在有空的时候写出代码的详细信息。
答案 1 :(得分:0)
如果您使用的是Gmail,还有另一种简单的方法。
创建一个Google Apps脚本,该脚本使用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)]
});
}
将其部署为公开的Web应用。
复制Url并将其插入到TwiML "action"
标记的<Receive/>
属性中。
确保将"method"
设置为"GET"
TwiML应该看起来像这样
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Receive action="YOUR_GOOGLE_WEBAPP_URL" method="GET"/>
</Response>
然后将您的Twilio号码配置为该TwiML文件