如何用C#和.NET发送带有彩信的vCard(详细教程)

256 阅读11分钟

你可以使用Twilio可编程消息系统,通过彩信发送vCard格式的联系信息。如果你的企业有很多用户,而且你必须发送联系信息,你应该考虑通过彩信发送。你也可以通过WhatsApp发送vCard,但使用彩信将使你能够接触到任何人,即使他们不使用WhatsApp。在这篇文章中,你将看到如何使用C# .NET以编程方式生成并通过彩信发送vCards。

什么是vCard?

vCard是一种标准格式,用于在人们和应用程序之间分享联系信息。这些信息可能包括个人信息、电话号码、电子邮件地址、就业信息等等。

它被用于Outlook和Gmail等邮件应用,MMS、WhatsApp和Telegram等信息传递系统,以及任何需要传递联系信息的系统中。

配置Twilio

获取你的Twilio证书

你的Twilio账户中,你需要获得账户SIDAuth Token来使用Twilio SDK。你可以在Twilio控制台的主页上找到你的账户SID和Auth Token。

Twilio console home page showing Account SID and Auth Token to copy them and use them in the application through SDK or some client.

把它们复制到一个安全的地方,因为你以后会用到它们。

如果你有一个试用账户,你只能向账户中经过验证的号码发送消息。

买一个号码

你需要有一个电话号码来发送彩信。

为了购买一个,在Twilio控制台,你需要进入左侧菜单,选择**"电话号码**"选项,然后**"管理**",最后点击"购买一个号码":

Left side menu specifying the "Buy a number" option in the "Phone Numbers" category.

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

Form to filter Twilio Phone Numbers to buy, with the phone country options, and the available functions, SMS, MMS, Fax and Voice.

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

List of phone numbers available to buy with the filters applied in the form.

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

Modal screen with the phone number to buy, with monthly cost and available capacities.

Footer of the modal screen with the phone number to buy, with the "Buy <number>" button to confirm it.

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

Confirmation screen of the phone number purchased.

为短信服务设置你的账户

接下来,你将需要配置信息服务,你可以将你的电话号码与该服务联系起来。

你也可以直接从Twilio电话号码发送彩信,而不需要使用信息服务,然而,在这篇文章的后面,你将使用信息调度,这需要信息服务。

在Twilio控制台点击**"Messaging**"(如果你没有看到它,点击**"Explore Products**",这将显示可用产品的列表,在那里你会看到 "Messaging")。然后,点击"服务":

Left side menu with the Messaging menu open, and the Services option selected.

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

Messaging Service home page explaining the functionality and with the "Creating Messaging Service" button

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

Messaging Service creation screen, with the name of the service, the list of options on the use of the service and the button to create it.

你的服务已经创建完毕。现在是时候配置一个发件人了,也就是说,一个你要发送信息的电话号码:

每秒钟只能用一个电话号码或发件人发送这么多信息。有了信息服务,你可以在其发件人池中添加多个发件人,你可以通过信息服务来发送消息,而不是直接从一个发件人发送消息,以提高消息吞吐量。

除了电话号码之外,你还可以添加短代码字母发件人和WhatsApp号码。

Second step in "Messaging Service Setup", to configure the Sender Pool with the option to add new senders (phone numbers, whatsapp numbers) with the "Add Senders" button, which can be used when sending messages through the Messaging Service created.

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

Modal screen to add a sender, specifying that it will be a phone number

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

List of phone numbers available as senders in your account to add them in the messaging service

然后,点击"设置集成",在这里你可以配置如何处理你的发件人的来电信息,以及你的信息在不被发送之前可以排队的最长时间(如超时)。

选择"删除消息"选项,因为在这个项目中你不会对收到的消息做任何处理:

Integration screen, with the "Drop the message" option for incoming messages and keeping the default value for the "Validity Period" field.

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

Footer of the integration form, with the button "Step 4: Add compliance info"

在这个表格中,你应该配置诸如你的业务简介等主题,以确保你在业务中很好地利用信息传递。

在这个项目中,你将跳过这一步,点击**"完成消息服务设置**"来完成这一过程。

Footer of the compliance step, with the "Complete Messaging Service Setup" button

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

Modal confirmation screen of the messaging service created, with the options to view the service and try to send a message.

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

Summary screen of the created service, with the name of the service, the selected use case and the unique SID that will be used in the project.

好了,现在你已经为你的项目设置了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项目中使用它。

Command line with the execution of ngrok, which shows various data, including the Forwarding (HTTPS address) must be copied to be used in the project.

通过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

Console screen with the generated message ID and the scheduled status.

未来的改进

现在你可以通过MMS发送联系信息了,但你还可以进一步改进它:

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