我已经能够使用以下代码将短信发送到电话号码
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
失败,您将不会被迫重新启动。