如何使用 Python 的 smpplib 一次向多个号码发送短信



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

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()

但该项目的主要目的是同时发送大量数字(至少100万(。我该怎么办?

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

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='904xxxxxxxx',
short_message=b'Test message')

但我怀疑这样做的效率。有没有一种更好、更高效的方法可以使用Python和SMPP发送批量短信?

您可以使用消息代理分布式任务队列(例如,芹菜和rabbitmq.(。

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

附言:如果你使用循环,我建议你添加一个try/except。因此,如果send_message失败,您将不会被迫重新启动。