验证短信不再送达:SHAFT过滤规则到底会封锁成人分类广告网站的哪些内容

从不送达的验证码,却没人解释原因
访客注册时输入手机号,等待那条能让他登录的六位验证码。运气好的时候三秒钟就到了。运气不好的时候永远不会到,产品里没有任何提示说明原因。注册表单不会显示错误。运营商不会发出投递失败通知。短信在对方那一端根本就不存在,唯一能看到的迹象只是流失率略微升高,而这完全可以归咎于其他十几种原因。
这种沉默比故障本身更糟糕,因为故障是可以修复的。运营商一侧的内容过滤器悄悄判定你的流量属于被屏蔽的类别,这种问题重启服务器或更换API密钥都解决不了。唯一的解决办法是弄清楚是什么触发了它,而大多数经营者根本走不到这一步,因为拒绝原因藏在他们从不打开的开发者控制台里,用的是写给程序员看的语言,不是写给经营者看的。
这背后的机制不是道听途说。它有一个缩写,一整套由负责传输流量的公司公开发布的错误代码,还与业务名称本身就带着的那个词直接相关:成人。美国运营商通过比对一小组内容类别来过滤商业短信,其中一个类别就是性和成人内容。伴游服务分类广告目录按定义就落在这个类别里,不管短信实际文字内容是什么。
这和本博客其他地方讨论的问题不一样。邮件送达率出问题是因为垃圾邮件过滤器根据发件人信誉和格式给邮件打分,细心的发件人可以通过更好的身份验证和逐步的信誉预热恢复过来。针对成人内容的短信过滤方式完全不同:它不是一个随时间恢复的信誉分数,而是运营商系统在注册时一次性核对的类别匹配,而且往往根本不允许重新提交申请。
SHAFT过滤:运营商用自己的语言明确标注的拦截对象
业内对被屏蔽类别的通俗缩写是SHAFT:性、仇恨、酒精、枪械和烟草(英文原文sex, hate, alcohol, firearms, tobacco)。这不是运营商为营销造出来的词;它直接出现在消息平台申请失败时返回的拒绝代码里。Twilio自己的错误文档中关于代码30953明确说明,某个活动被拒绝是因为它包含违反CTIA的SHAFT准则的性或成人内容,并补充了一个比拒绝本身更重要的细节:这一类拒绝不允许重新提交。没有申诉表格,没有能挽救结果的修改措辞,通过正常注册流程也没有第二次机会。
同样的模式也出现在免费电话号码一端,很多经营者恰恰是因为觉得它比标准本地号码注册流程少一些官僚程序而选它。错误代码30441对应的是免费号码验证被拒的情况,原因是审核人员在查看实际网站、同意流程或申请中附带的示例短信后,判定该使用场景"看起来与性有关"。拒绝并不只针对单条短信说了什么。它审查的是该号码注册用来代表的网站,而对分类广告目录来说,那就是整个业务本身。
这和支付处理商关闭账户的不同之处,在于完全没有一个审查对话的过程。支付处理商终止商户账户时会有提前通知期、原因代码,有时还有一位愿意讨论此事的合规官。而运营商的自动内容过滤器只是在开发者控制台里返回一个拒绝代码,然后就不再理会。运营商内部没有人在决定你的业务不配得到服务;一条多年前出于其他原因写下的规则在自动执行这件事,它不知道也不在乎这些短信只是无害的六位登录验证码。
类别匹配发生在已注册的品牌和使用场景层面,而不仅仅是每条短信里的文字。一项活动在注册时要提供业务名称、消息用途说明,还常常要提供网站链接。只要这三项中有任何一项读起来像成人内容,过滤器就可能拒绝整个活动,即便短信实际文本不过是一个数字加上"验证码"两个字。这正是经营者最常忽略的细节:清理消息正文本身,并不能清理背后的注册信息。
为什么"直接换用Verify"不是完整的解决方案
一旦经营者理解了问题,常见的建议是不再尝试注册完整的商业消息活动,而是改用专门的身份验证产品,比如Twilio的Verify API或其他供应商的同类产品。这条建议在一定程度上是对的:专门为一次性验证码设计的产品明确豁免了触发SHAFT过滤的完整品牌与活动注册流程,Twilio自己的接入文档也确认,只发送OTP验证码的业务在使用该产品时不需要注册品牌或活动。
这个豁免附带一个条件,而这个条件很少出现在同行之间互相传授的建议里:它专门适用于通过供应商自有的共享、池化号码发送,而不适用于把验证码路由到业务自己注册并持有的电话号码上。把同样的OTP流量指向自己注册的号码,通常的注册规则就会重新生效,SHAFT类别也不例外。这条变通路径是真实存在的,但它绑定在特定的投递路径上,并不是对任何恰好包含六位验证码的短信的普遍豁免。
接受这个豁免也是有代价的。运营商会给已注册、经过审核的活动更高的投递优先级和更大的吞吐量,恰恰因为其背后的业务已经经过核查。承载类似未注册流量的共享池化号码在优先级排序中处于更靠后的位置,表现为投递延迟小幅但真实的增加,以及在高流量时段偶尔出现的限速,比如促销活动或功能上线后新注册激增的时候。对一个小型目录站点来说,这通常没什么影响。但对一个正在做促销或经历新广告主季节性激增的站点来说,"两秒送达"和"二十秒送达"之间的差距,就是完成注册和放弃注册之间的差距。
决定短信能否通过的过滤器,还会看投递路径之外的信号,这些信号经营者往往无法直接控制:消息实际内容与已批准使用场景的匹配程度,以及发送号码信誉的变化趋势。这里发一条客服消息,那里发一条促销活动,通过同一条本来是为干净的OTP投递而设置的渠道发出,即便没有任何一个字带有性暗示,也可能改变这个信号。让验证渠道与业务发送的任何其他类型消息完全分离,在这里不是一个可有可无的加分项;这是让豁免持续有效的唯一办法。
绕开注册这条路已经走不通了
在这种过滤趋严之前,常见的变通做法就是干脆不注册:买一个本地号码,发送消息,接受一部分会被过滤掉,把这部分损失当作经营成本。这条变通路径已经不存在了。Twilio自己关于关闭未注册美国10DLC消息服务的更新日志描述了一个在2023年年中不断收紧的过滤体制,而在那年8月底之后,变成了对所有未注册的美国境内流量的全面封锁,以错误代码30034的形式返还给发送方。这不是加收附加费的更严格过滤,而是根本无法送达的流量,没有任何费用可以把它赎回来。
这个区别很重要,因为一个曾经注册过一次、被标记过、然后悄悄不再关注自己注册状态的业务,同样不属于那个更宽松的旧体制。一个信任分数下降的活动,不论是因为内容不匹配、退订投诉激增,还是单纯的不活跃,都会滑向和未注册流量相同的处理方式:更低的吞吐量,更严格的过滤,而且不会有明确的通知说明发生了什么变化,因为封锁发生在运营商的基础设施上,距离业务查看自己日志的地方隔着好几层。
这与本博客之前描述过的主机、CDN和域名基础设施风险属于同一类型:一个和产品之间隔着好几层的供应商,可以按自己的时间表、出于自己的政策原因关掉其中一部分,而第一个迹象就是某个原本能用的东西不再能用了。短信过滤的不同之处在于,这个"开关"不是某一家公司的决定。它是美国所有主要运营商共同执行的一条规则,不管中间是哪个消息平台都统一适用,这意味着换个供应商并不能像换主机有时能绕开单一公司的政策那样绕开这条规则。
在注册时把成人分类广告目录伪装成别的东西以躲避类别匹配,没有合法的做法。这样做会让该活动类型仅有的一次申请机会承担永久拒绝的风险,而因虚假陈述导致的拒绝,结果比从未注册还要糟糕,因为它同时关闭了合法的路径。诚实地走这条路,不管多么不便,是唯一能留下第二次机会的做法。
在电话号码变得不可靠之前该建立什么
第一个具体步骤是不再把电话号码当作有保障的基础设施,从一开始就在注册和登录流程里内置第二条通道,而不是等第一张关于验证码没收到的客服工单出现之后才动手。身份验证器应用生成的验证码、通过邮件发送的魔法链接,或者注册时生成的备用码,都能完全绕开运营商的过滤器,因为它们都不依赖电话网络正在扫描的消息类别。这些选项都必须在为它们专门搭建的流程里才能发挥作用,所以现在至少搭建一个,成本远比等过滤器已经吞掉一部分明显的注册量之后再补救要低得多。
第二个步骤是彻底分离渠道:发送一次性验证码的号码或产品,永远不应该同时用来发送促销短信、重新激活提醒或付款提醒。在同一条发送路径上混用不同类型的消息,恰恰是那种会侵蚀过滤器所监测的信誉信号的模式,而且这样做是拿业务真正需要的那条唯一渠道,即登录验证码,去为一个本来有其他选择的营销渠道担风险。
第三个步骤是诚实注册,并把结果当作最终结果来对待。由于SHAFT类别的拒绝通常不能重新提交,注册应该只进行一次,提供准确的业务描述,并且提前决定好业务能不能接受Verify式豁免在吞吐量和优先级上的取舍,或者是否需要完整注册并做好被拒绝的准备。靠猜测和侥幸只会浪费那唯一重要的一次机会。
第四个步骤是直接盯着投递数据,而不是等用户来投诉。每个主流消息平台都会为每条消息提供投递收据和错误代码;像30034这样的代码占比上升,或者验证渠道的投递率单独出现下滑,是能够拿到的最早信号,说明有什么地方变了,而这个信号出现的时间,比月度报表里注册完成率下降反映出来要早得多。每月检查这个数字的经营者,能在几周内察觉过滤规则的变化。只看转化率的经营者,要等一个季度才能察觉,而那时已经真实损失了业务。
这一切都不会让电话号码变得没用。它只是把电话号码放回它本来的位置:一条业务向运营商借来的渠道,而这些运营商在建设它时根本没考虑过成人分类广告目录,并且保留着不作解释就说不的权利。这样对待它,配上真正的备用方案,以及对它承载内容的清晰分离,才是让登录流程在过滤器判定你的业务正是它当初设计来拦截的那类对象的那一天,仍能正常运转的原因。


