你可以使用Twilio可编程消息系统,通过彩信发送vCard格式的联系信息。如果你的企业有很多用户,而且你必须发送联系信息,你应该考虑通过彩信发送。你也可以通过WhatsApp发送vCard,但使用彩信将使你能够接触到任何人,即使他们不使用WhatsApp。在这篇文章中,你将看到如何使用C# .NET以编程方式生成并通过彩信发送vCards。
什么是vCard?
vCard是一种标准格式,用于在人们和应用程序之间分享联系信息。这些信息可能包括个人信息、电话号码、电子邮件地址、就业信息等等。
它被用于Outlook和Gmail等邮件应用,MMS、WhatsApp和Telegram等信息传递系统,以及任何需要传递联系信息的系统中。
配置Twilio
获取你的Twilio证书
在你的Twilio账户中,你需要获得账户SID和Auth Token来使用Twilio SDK。你可以在Twilio控制台的主页上找到你的账户SID和Auth Token。

把它们复制到一个安全的地方,因为你以后会用到它们。
如果你有一个试用账户,你只能向账户中经过验证的号码发送消息。
买一个号码
你需要有一个电话号码来发送彩信。
为了购买一个,在Twilio控制台,你需要进入左侧菜单,选择**"电话号码**"选项,然后**"管理**",最后点击"购买一个号码":

在显示的屏幕上的过滤器中,选择一个有彩信选项的国家,例如,美国:

通过点击"购买"选项,选择一个可用的号码:

在购买之前,将显示一个屏幕,说明你的电话号码的属性。在这里你可以验证发送彩信的能力是否可用。最后,点击**"购买<手机号码>**"


最后,将显示一个屏幕,确认你的新手机号码可以使用。

为短信服务设置你的账户
接下来,你将需要配置信息服务,你可以将你的电话号码与该服务联系起来。
你也可以直接从Twilio电话号码发送彩信,而不需要使用信息服务,然而,在这篇文章的后面,你将使用信息调度,这需要信息服务。
在Twilio控制台点击**"Messaging**"(如果你没有看到它,点击**"Explore Products**",这将显示可用产品的列表,在那里你会看到 "Messaging")。然后,点击"服务":

接下来,在显示的页面上,点击**"创建信息服务**"按钮来配置你的服务:

输入一个名称,以确定你将用你的服务做什么,在可用的列表中选择你要用你的服务做什么,最后点击"创建消息服务":

你的服务已经创建完毕。现在是时候配置一个发件人了,也就是说,一个你要发送信息的电话号码:
你每秒钟只能用一个电话号码或发件人发送这么多信息。有了信息服务,你可以在其发件人池中添加多个发件人,你可以通过信息服务来发送消息,而不是直接从一个发件人发送消息,以提高消息吞吐量。
除了电话号码之外,你还可以添加短代码、字母发件人和WhatsApp号码。

点击"添加发件人"按钮,在显示的模式界面中,在**"发件人类型**"下拉菜单中选择**"电话号码**"选项,最后点击"继续"。

你将看到你账户中可用的电话号码列表(你刚买的那个)。选择该号码的复选框,它出现在第一栏,然后点击**"添加电话号码**"。

然后,点击"设置集成",在这里你可以配置如何处理你的发件人的来电信息,以及你的信息在不被发送之前可以排队的最长时间(如超时)。
选择"删除消息"选项,因为在这个项目中你不会对收到的消息做任何处理:

然后点击"第4步:添加合规比例"按钮:

在这个表格中,你应该配置诸如你的业务简介等主题,以确保你在业务中很好地利用信息传递。
在这个项目中,你将跳过这一步,点击**"完成消息服务设置**"来完成这一过程。

完成这一过程后,将显示一个模式屏幕,确认这一过程。点击"查看我的新消息服务"按钮:

在新服务的屏幕上,你会看到Messaging Service SID ,你应该复制它,因为你将在代码中使用它来发送彩信:

好了,现在你已经为你的项目设置了Twilio号码和消息服务,现在是时候设置一个文件托管服务和你的.NET项目了。
创建一个静态文件主机
要通过Twilio的SDK发送vCard文件,你需要通过一个公共的URL来提供这些文件,为此,你需要使用静态文件托管。在本教程中,你将使用ngrok通过一个公共URL暴露一个本地目录。
首先,创建一个文件夹,你将在其中存储vCard文件。这个文件夹可以位于你机器上的任何地方。
如果这是你第一次使用ngrok,你需要在ngrok的网站上注册,并在控制台中添加认证令牌作为第一个命令:
ngrok authtoken <token from https://dashboard.ngrok.com/get-started/your-authtoken>
现在,用下面的命令运行ngrok,指定一个你要保存vCard文件的文件夹路径:
ngrok http file:///<folder path>
用你的vCard文件所在的文件夹的完整路径替换<folder path> 。
复制ngrok为你创建的转发HTTPS地址,因为你将在你的.NET项目中使用它。

通过ngrok,你可以快速运行一个公共文件服务器,但你可以使用任何文件托管服务,甚至从ASP.NET Core提供文件。如果你只想让Twilio能够读取你的文件,你可以验证X-Twilio-Signature header,如果无效就拒绝HTTP请求。在这里阅读更多关于验证Twilio请求的信息。
创建一个控制台项目
你将需要使用.NET CLI创建一个控制台项目。打开一个控制台终端,运行以下命令,创建一个包含你的项目的文件夹:
mkdir TwilioMMSvCard
cd TwilioMMSvCard
接下来,用下面的命令创建项目:
dotnet new console
在项目中添加API密钥
为了将Twilio凭证添加到你的项目中,你将使用用户秘密,因为它是本地开发的一个很好的选择,易于管理,更安全,并遵循良好的开发实践。
要为你的项目设置用户秘密,请在你的项目根目录下的命令行运行以下命令:
dotnet user-secrets init
dotnet user-secrets set "TwilioAccountSid" "<Twilio Account SID>"
dotnet user-secrets set "TwilioAuthToken" "<Twilio Auth Token>"
dotnet user-secrets set "TwilioMessagingServiceSid" "<Twilio Messaging Service Sid>"
用Twilio账户SID替换<Twilio Account SID> ,用Auth Token替换<Twilio Auth Token> ,用你之前复制的Messaging Service Sid替换<Twilio Messaging Service Sid> 。
要加载用户秘密,你必须添加Microsoft.Extensions.Configuration.UserSecrets NuGet包。使用以下命令添加该包。
dotnet add package Microsoft.Extensions.Configuration.UserSecrets
安装Twilio和vCard库
你可以自己写代码来生成vCard文件,或者使用一个现有的库来为你做这个。在本教程中,你将使用vCardLib来创建vCard以分享联系信息:
dotnet add package vCardLib.dll
此外,你将安装Twilio SDK来发送MMS信息:
dotnet add package Twilio
配置项目
现在,在Program.cs文件中,用以下代码替换所有现有代码:
using vCardLib.Models;
using vCardLib.Enums;
using vCardLib.Serializers;
using Twilio;
using Twilio.Rest.Api.V2010.Account;
using Microsoft.Extensions.Configuration;
using Twilio.Types;
上面的代码添加了你将在项目中使用的所有命名空间。
接下来,你要添加从你的用户秘密中加载配置的代码,你在那里存储了Twilio凭证。你还将添加ngrok给你的转发URL,以及存储vCard文件的文件夹的完整路径:
IConfigurationRoot configuration = new ConfigurationBuilder()
.AddUserSecrets<Program>()
.Build();
string twilioAccountSid = configuration["TwilioAccountSid"];
string twilioAuthToken = configuration["TwilioAuthToken"];
string twilioMessagingServiceSid = configuration["TwilioMessagingServiceSid"];
string serverUrl = "<ngrok URL>/"; // has to end with one '/'
string vCardFolder = "<full folder path>";
用ngrok的转发URL替换<ngrok URL> ,用存储vCard文件的文件夹的完整路径替换<full folder path> 。
用vCard创建联系信息
接下来,你要用vCardLib库来生成一个人的联系信息。在下面的代码中,你要添加名字、姓氏和一个电话号码(你可以指定它是一个工作电话、个人电话或其他)。然后,你将信息序列化,得到一个字符串,其中的数据符合vCard标准,最后将其保存为相应文件夹中的文件:
vCard vCardData = new vCard
{
FamilyName = "Campos",
GivenName = "Néstor",
PhoneNumbers = new List<TelephoneNumber>{
new TelephoneNumber {
Type = TelephoneNumberType.Work,
Value = "<phone number>",
CustomTypeName = "Main contact"
}
}
};
string serializedvCardData = Serializer.Serialize(vCardData);
string vCardFileName = "ncampos.vcf";
string savePath = Path.Combine(vCardFolder, vCardFileName);
File.WriteAllText(savePath, serializedvCardData);
按照你的意愿改变联系信息。
你刚刚做的是生成一个vCard文件,你可能以前作为用户在手机上发送或接收联系人时使用过。现在是使用Twilio SDK通过彩信发送的时候了。
通过彩信分享联系人信息
要发送彩信,你必须用你的凭证(账户SID和Auth Token)初始化Twilio SDK,用一些选项创建信息,然后发送它。正如你所看到的,你将使用带有一些属性的CreateMessageOptions 类,首先在构造函数中指定消息的目标电话号码。接下来,在Body 属性中配置一个文本消息,在MediaUrl 中指定通过ngrok公开提供的vCard文件的URL,在SendAsMms 中指定它将是一个MMS消息,最后在MessagingServiceSid 中指定先前创建的消息服务的标识符:
TwilioClient.Init(twilioAccountSid, twilioAuthToken);
var messageOptions = new CreateMessageOptions(new PhoneNumber("<to number>"));
messageOptions.Body = "This is the main contact for Néstor.";
messageOptions.MediaUrl = new List<Uri>() { new Uri(serverUrl + vCardFileName) };
messageOptions.MessagingServiceSid = twilioMessagingServiceSid;
var message = MessageResource.Create(messageOptions);
Console.WriteLine($"Message SID: {message.Sid}");
Console.WriteLine($"Message Status: {message.Status}");
// wait a couple of seconds before deleting the file,
// so Twilio can download the file and send it as MMS
await Task.Delay(5000);
File.Delete(savePath);
用你的个人电话号码代替<to number> ,以便测试。
另外,在Twilio中创建你的消息后,该文件将被删除,因为它可能不再需要了。
现在,运行你的控制台项目,用MMS发送你的第一个vCard联系人:
dotnet run
要在Visual Studio Code中运行该项目,请按Ctrl + F5 来运行。
几秒钟后,你应该收到一条带有联系卡的消息。
根据你的移动设备、消息应用程序、你的移动供应商和国家的不同,vCard文件出现的方式可能会有所不同。在某些情况下,它不是直接以联系卡的形式出现,而是以Twilio链接的形式出现,下载该文件,你就可以成功导入到你的手机中。
安排消息的时间
当你发送消息时,尤其是发送量很大,而且用户之前没有要求时,你必须注意不要在用户的正常时间之外发送(晚上,清晨),以避免被认为是垃圾邮件,无论是你的用户还是你发送消息的国家的移动供应商。
要做到这一点,用同样的CreateMessageOptions 类,你可以用SendAt 属性指定以后发送彩信。消息将在Twilio API中以 "预定 "状态创建,Twilio将在指定时间到达时发送彩信。
你还必须通过ScheduleType 属性指定时间表类型:
TwilioClient.Init(twilioAccountSID, twilioAuthToken);
var messageOptions = new CreateMessageOptions(new PhoneNumber("<to number>"));
messageOptions.Body = "This is the main contact for Néstor.";
messageOptions.MediaUrl = new List<Uri>() { new Uri(serverUrl + vCardFileName) };
messageOptions.SendAsMms = true;
messageOptions.MessagingServiceSid = twilioMessagingServiceSid;
messageOptions.SendAt = DateTime.UtcNow.AddMinutes(20);
messageOptions.ScheduleType = MessageResource.ScheduleTypeEnum.Fixed;
var message = MessageResource.Create(messageOptions);
Console.WriteLine($"Message SID: {message.Sid}");
Console.WriteLine($"Message Status: {message.Status}");
你可以在SendAt 选项中指定从当前时间算起,最少15分钟,最多7天。
由于消息还没有被处理和发送,你不能从你的文件托管服务器删除vCard文件,直到它被发送。
现在再次运行控制台。你将能够验证该消息的状态从队列变为预定:
dotnet run

未来的改进
现在你可以通过MMS发送联系信息了,但你还可以进一步改进它:
- vCard 是一个非常完整的标准,你在发送前添加的联系人信息越多,收件人就越容易知道用哪种方式写信或打电话给对方,他们在哪个公司工作,等等。vCardLib库为你提供了更多的类来添加所有这些信息。
- 你可以使用一个真正的静态文件主机服务,它将与你的应用程序一起扩展。或者,你可以通过ASP.NET Core来提供你的文件,并验证HTTP请求是否来自Twilio,如果不是,就拒绝它。
- 你可以在你的消息中添加webhooks来检查消息的最终状态(发送、拒绝、有错误等)。
- 你可以每隔几秒钟轮询一次MMS的状态,检查消息是否已经发送,然后删除vCard文件。