3

我正在使用 Twilio 通过 appengine 发送短信。Twilio 不接受超过 160 个字符的短信,所以我必须拆分它们。我将短信拆分并发送如下:

def send_sms_via_twilio(mobile_number, message_text):
    client = TwilioRestClient(twilio_account_sid , twilio_auth_token)
    message = client.sms.messages.create(to=mobile_number, from_=my_twilio_number, body=message_text)

split_list = split_sms(long_message)
for each_message in split_list:
    send_sms_via_twilio(each_message)

但是我发现发送的顺序不同。例如,有时我会收到 2/5 然后 1/5 然后 4/5 等消息,其他时候顺序是正确的。split_list 的顺序绝对正确。为了克服短信的错误顺序,我试过了

for each_message in split_list:
    deferred.defer(send_sms_via_twilio, each_message, _countdown=1)

但是我遇到了同样的问题。然后我尝试了

for each_message in split_list:
    deferred.defer(send_sms_via_twilio, each_message, _countdown=1, _queue="send-text-message")

并将我的队列定义为

- name: send-text-message
  rate: 1/s
  bucket_size: 10
  max_concurrent_requests: 1
  retry_parameters:   
    task_retry_limit: 5

认为问题是并发性(在 python27 中运行)并且如果我限制 max_concurrent_requests 这个问题将得到解决。但是问题仍然存在,即文本仍然以错误的顺序发送。我检查了日志,但看不到任何关于任务失败的通知——它们似乎只是以错误的顺序执行。

有什么我想念的吗?我该如何解决这个问题。

4

2 回答 2

4

请注意,根据定义,SMS 消息传递(特别是 SMPP 等底层协议)是异步的。这意味着您无法指定不同SMS 消息的顺序。

一种方法可以通过在这些消息的二进制正文中使用 UDH(用户定义的标头)来指定 SMS 数据包的顺序。但这仅适用于长 SMS 消息——那些太长而无法在一条消息中发送的消息。例如,如果您的消息超过 160 个 GSM-7 字符或 80 个 UTF-16 字符,它将作为多条 UDH 消息发送。

在这种情况下,手机将不会在消息部分到达时显示它们。它将在内存中收集它们,直到最后一个出现,然后以正确的顺序组装它们。对于最终用户来说,这只是一条比平时更长的消息,您不必在消息中写“1/3”、“2/3”、...。

免责声明:我在一家公司工作,该公司使您能够发送和接收带有用户指定标头 (UDH) 和/或标准长消息的多条二进制消息。

于 2012-09-17T10:28:42.900 回答
-1

如果您没有绑定到 Twilio,请尝试使用SMSified。他们会自动为您拆分消息,确保其顺序正确,并在消息末尾添加“1/2、2/2...”。换句话说,您只需将完整的消息发送到他们的 REST API,无论长度如何,其余的都由他们处理。由于他们还使用 REST API,您可以继续使用 Python。

于 2012-09-20T15:46:32.187 回答