使用短信验证码时,如何判断任意phone号码的email to sms gateway地址

How to determine the email to sms gateway address of any phone number when using sms code verification

我正在构建一个网络应用程序,用户可以在其中创建帐户。 当用户创建他的帐户时,他提供了他的 phone 号码,应用程序需要通过发送短信验证码来验证该号码。 我使用以下代码发送短信。

<?php

if ( isset( $_REQUEST ) && !empty( $_REQUEST ) ) {
 if (
  isset( $_REQUEST['phoneNumber'], $_REQUEST['carrier'],  
  $_REQUEST['smsMessage'] ) &&
  !empty( $_REQUEST['phoneNumber'] ) &&
  !empty( $_REQUEST['carrier'] )
 ) {
   $message = wordwrap( $_REQUEST['smsMessage'], 70 );
   $to = $_REQUEST['phoneNumber'] . '@' . $_REQUEST['carrier'];
   $result = @mail( $to, '', $message );
   print 'Message was sent to ' . $to;
 } else {
   print 'Not all information was submitted.';
 }
}
?>

代码的问题是用户需要提供他的网络运营商。为了防止用户无法创建帐户,因为他可能不知道他的运营商电子邮件到短信地址,我决定根据提供的 phone 号码 and/or 国家/地区确定运营商地址.

我无法弄清楚如何根据用户的 phone 号码确定运营商。谁能帮我解决一下?

我知道这是可能的,因为 Facebook 正在做类似的事情。请提出其他建议,而不是告诉我这是不可能的...

how to determine the carrier from the user's phone number

你真的不能。您可以尝试使用 phone 前缀,但在某些国家/地区,人们可以将他们的号码迁移到不同的运营商,这基本上意味着您最终不知道它到底是什么运营商。

在我看来,您有两个可能的解决方案。

1) 将邮件发送到各个运营商的短信网关。如果他们不拥有该号码,他们会这样回复:

Error: Invalid user address

Error message below:
550 - Requested action not taken: no such user here

保存工作的网关,如果它停止工作则重复该过程。 (他们更换了供应商)

2) 使用 SMS 提供程序,如 Twilio,或订阅服务来查找网关。

一些解决方案可能是:

  1. Google的libphone号包(https://github.com/google/libphonenumber) that provides carrier lookup (https://github.com/google/libphonenumber#mapping-phone-numbers-to-original-carriers)

  2. 向每个运营商网关发送电子邮件。缺点是这会产生大量被拒绝的 550 条消息,这可能会让您被标记为垃圾邮件发送者。您可以根据该国家/地区的受欢迎程度对运营商进行排名,从而减少被拒绝的消息。如果一个更受欢迎的运营商拒绝该消息,则转到列表中的下一个运营商。但是,这有缺陷,因为并非所有运营商都返回拒绝消息,并且整个过程很慢。

  3. 许多运营商提供“转移我的 phone 号码”功能,可用于查询运营商:https://www.att.com/wireless/transfer-your-number/, https://www.verizon.com/switch-to-verizon/ 等。大多数运营商希望客户转移,如果这不可能,通常是因为客户已经使用了该运营商。这种方法也可以与向运营商网关发送电子邮件结合使用。