如何使用Python的smpplib将SMS一次发送到多个号码

问题描述

我已经能够使用以下代码将SMS发送到电话号码

import smpplib
import settings
import sys

client = smpplib.client.Client(settings.SMS_SYSTEM_HOSTNAME,settings.SMS_SYSTEM_PORT)

# Print when obtain message_id
client.set_message_sent_handler(
  lambda pdu: sys.stdout.write('sent {} {}\n'.format(pdu.sequence,pdu.message_id)))
client.set_message_received_handler(
  lambda pdu: sys.stdout.write('delivered {}\n'.format(pdu.receipted_message_id)))

client.connect()
client.bind_transceiver(system_id=settings.SMS_SYSTEM_ID,password=settings.SMS_SYSTEM_PASSWORD)


pdu = client.send_message(
    source_addr_ton=smpplib.consts.SMPP_TON_INTL,#source_addr_npi=smpplib.consts.SMPP_NPI_ISDN,# Make sure it is a byte string,not unicode:
    source_addr='SENDER',dest_addr_ton=smpplib.consts.SMPP_TON_INTL,#dest_addr_npi=smpplib.consts.SMPP_NPI_ISDN,# Make sure thease two params are byte strings,not unicode:
    destination_addr='90474xxxxx',short_message=b'Test message')

print(pdu.sequence)
client.listen()

但是该项目的主要目的是一次发送大量邮件(至少一百万个)。我该怎么办?

显而易见的解决方案可能是放置

pdu = client.send_message(
    source_addr_ton=smpplib.consts.SMPP_TON_INTL,not unicode:
    destination_addr='904xxxxxxxx',short_message=b'Test message')

是一个循环,但是我对此表示怀疑。是否有更好,更有效的方法来使用Python和SMPP发送批量SMS?

解决方法

您可以使用消息代理分布式任务队列(例如celeryrabbitmq)。

有了这些,您可以拥有异步任务。每个任务是一个独立的代码,而一个任务将发送一个SMS。 因此,您不必在循环中发送所有SMS,而可以在消息代理队列中创建任务。分布式任务队列服务将执行它们。

PS:如果使用循环,建议您添加try/except。因此,如果send_message失败,您将不会被迫重新开始。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...