Как я могу отправить SMS на несколько номеров одновременно, используя smpplib на Python

#python #smpp

#python #smpp

Вопрос:

Я смог отправить 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,
    #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')

  

в цикле, но я сомневаюсь в эффективности этого. Есть ли лучший, более эффективный способ отправки массовых SMS-сообщений с использованием Python и SMPP?

Ответ №1:

Вы можете использовать брокер сообщений и распределенную очередь задач (например, celery и rabbitmq).

С их помощью у вас могут быть асинхронные задачи. Где каждая задача является независимым фрагментом кода, и где одна задача будет отправлять SMS. Таким образом, вместо отправки всех ваших SMS в цикле, вы вместо этого создадите задачи в очереди посредника сообщений. И распределенная служба очереди задач выполнит их.

PS: если вы используете цикл, я советую вам добавить try/except . Поэтому, если send_message произошел сбой, вам не придется начинать заново.

Комментарии:

1. Спасибо @AlexisG. Я прочитал ссылки, они кажутся решением, но, к сожалению, я смог получить четкие указания о том, как применить их к решению моей проблемы. Любые дальнейшие указания будут оценены. PS: я не хочу использовать циклы.

2. Вот руководство о том, как все настроить (возможно, есть что-то получше): linode.com/docs/development/python/task-queue-celery-rabbitmq . И вот пакет celery для установки: pypi.org/project/celery . Я знаю, что это требует больших знаний, но вы узнаете интересные и полезные вещи