生成 VCard 并通过 Twilio 发送

Posted

技术标签:

【中文标题】生成 VCard 并通过 Twilio 发送【英文标题】:Generate VCard and Send Via Twilio 【发布时间】:2015-09-20 02:53:18 【问题描述】:

我正在编写一个 Twilio + Parse 应用程序,它允许用户通过 SMS 共享他们的联系信息。我有一个示例 Vcard 作为 javascript 中的字符串:

  message = '';
  message += 'BEGIN:VCARD';
  message += 'BDAY;VALUE=DATE:1963-09-21';
  message += 'VERSION:3.0';
  message += 'N:Stenerson;Derik';
  message += 'FN:Derik Stenerson';
  message += 'ORG:Microsoft Corporation';
  message += 'ADR;TYPE=WORK,POSTAL,PARCEL:;;One Microsoft Way;Redmond;WA;98052-6399;USA';
  message += 'TEL;TYPE=WORK,MSG:+1-425-936-5522';
  message += 'TEL;TYPE=WORK,FAX:+1-425-936-7329';
  message += 'EMAIL;TYPE=INTERNET:deriks@Microsoft.com';
  message += 'END:VCARD';
  message += 'BEGIN:VCARD';
  message += 'VERSION:3.0';
  message += 'N:Ganguly;Anik';
  message += 'FN:Anik Ganguly';
  message += 'ORG: Open Text Inc.';
  message += 'ADR;TYPE=WORK,POSTAL,PARCEL:;Suite 101;38777 West Six Mile Road;Livonia;MI;48152;USA';
  message += 'TEL;TYPE=WORK,MSG:+1-734-542-5955';
  message += 'EMAIL;TYPE=INTERNET:ganguly@acm.org';
  message += 'END:VCARD';
  message += 'BEGIN:VCARD';
  message += 'VERSION:3.0';
  message += 'N:Moskowitz;Robert';
  message += 'FN:Robert Moskowitz';
  message += 'EMAIL;TYPE=INTERNET:rgm-ietf@htt-consult.com';
  message += 'END:VCARD';

我正在尝试弄清楚如何将其作为电子名片发送到电话号码,以便电话检测到它而不是文本。

我有一个方法:

function respondWithMessage(message, response) 
  response.set('Content-Type', 'text/xml');
  var xmlVersion = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n';
  message = '<Message>\n' + message + '\n</Message>';
  message = '<Response>\n' + message + '\n</Response>';
  message = xmlVersion + message;
  response.send(message);

我可以用它发送短信。 在他们的文档中,Twilio 声明这里支持文本/电子名片消息: https://www.twilio.com/docs/api/rest/accepted-mime-types 但我一直无法让它工作。 您能否提供一个示例,说明如何使用 Twilio 通过 SMS 发送此 VCard? 谢谢!

【问题讨论】:

您是在尝试使用 vCard 回复,还是只是发送它?因为您将无法在 TwiML 中包装 vCard,而这正是您要做的事情。能否提供更多信息? 我正在尝试从存储在我的服务器上的用户联系信息生成 vCard,并通过 SMS 将其发送给另一个用户。 【参考方案1】:

如何发送

在 Twilio 中发送联系人卡片非常简单,使用这个 curl 命令,它应该可以工作:

curl -X POST https://api.twilio.com/2010-04-01/Accounts/<account sid>/Messages.json \
--data-urlencode "Body=Your Heart Health Coach contact card" \
--data-urlencode "MediaUrl=https://mighty-health-assets.s3.amazonaws.com/vcf/James%20Li.vcf" \
--data-urlencode "From=<from>" \
--data-urlencode "To=<to>" \
-u <account sid>:<auth token>

您实际上可以将请求中链接的 vCard 用于测试目的。

会出什么问题

如果您的标题配置不正确,联系人卡片将无法在您的 ios/android 手机上正确呈现,即使它看起来是正确的联系人卡片。

标题

iOS 上的联系人卡片只能显示与您的文件相同的文本,因此请使用 Content-Type 上相同的 filename 标头属性命名您的文件,它应该会相应地工作

Content-Type: text/x-vcard
Content-Disposition: inline; filename="<You file name>.vcf"
Cache-Control: no-cache

缓存文件

    当 Twilio 第一次接收文件时,它会缓存 如果您相应地调整标头,它不会影响 VCF 文件的传递,因为它将使用缓存版本 有办法克服这个问题

确保您从第一次开始就正确提交,否则您将不得不接受我在下面建议的更改

Twilio 缓存

要删除文件上的缓存或设置适当的缓存策略,请阅读:https://support.twilio.com/hc/en-us/articles/360024716314-How-Can-I-Change-the-Cache-Behavior-or-Message-Media-Files-

疑难解答我发现 Twilio 不会仅根据 VCF 文件的文件名更改缓存,而是根据文件内容本身更改缓存,因此您必须修改文件才能清除缓存,而不仅仅是名称。

【讨论】:

谢谢!这为我节省了大量的测试时间。对@felipeclopes 的回答稍作修改。在那里交换了 Content-Type 和 Content-Disposition。我用过:response['Content-Type'] = 'text/vcard';response['Content-Disposition'] = f'inline; filename="Full Name Here.vcf"';response['Cache-Control'] = 'no-cache' 虽然Content-Disposition: inline; filename="file.vcf" 对我有用,但这个文档暗示它应该是Content-Disposition: attachment; filename="file.vcf" developer.mozilla.org/en-US/docs/Web/HTTP/Headers/… 这里是一个愚蠢的问题,但是发送消息时我在哪里设置标题? @FabricioG 它是对 MediaUrl 中链接的文件的请求的响应标头【参考方案2】:

这里是 Twilio 开发人员宣传员。如果您尝试开始一条新消息,那么您不需要使用 TwiML,而可以简单地使用其余 API 从您的服务器发送信息。

使用 Parse.com,它应该类似于以下内容:

// Require and initialize the Twilio module with your credentials
var client = require('twilio')('ACCOUNT_SID', 'AUTH_TOKEN');

// Send an SMS message
client.sendSms(
    to:'to', 
    from: 'from', 
    body: 'Hello world!',
    mediaUrl: your-vcard-url
  , function(err, responseData)  
    if (err) 
      console.log(err);
     else  
      console.log(responseData.from); 
      console.log(responseData.body);
    
  
);

因此,您现在需要做的就是确保 Twilio 可以访问 your-vcard-url,并将其 mime 类型设置为 text/vcard

换句话说,你不能只通过短信发送 vcard 的内容,而是需要告诉 Twilio vcard 实际上在哪里,所以它包含在消息中。

vcard 的有效 URL 示例为 this one。希望对你有帮助

【讨论】:

我正在使用上述方法尝试此操作,但我注意到 Twilio 正在发送链接在 Twilio URL 中的 VCard,而不是消息中的原生 VCard。我正在 iOS 上进行测试。 我实际上是通过 MediaUrl 参数发回 Twilio 他们的联系网址“api.twilio.com/2010-04-01/Accounts/…”,但我仍然以一条大短信的形式返回。什么给了?

以上是关于生成 VCard 并通过 Twilio 发送的主要内容,如果未能解决你的问题,请参考以下文章

使用 Twilio 发送的 vCard 未在 iOS 中正确呈现

苹果手机 |通过简单的短信发送电子名片

Python: 利用Twilio给自己手机发送短信

Zapier 到 Twilio 生成动态短信正文

如何使用 twilio 从 MS Access 发送消息?

发送短信