使用python和python-smpp接收短信

时间:2018-06-06 11:56:20

标签: python-3.x smpp

我是SMPP的新手,但我需要通过SMPP协议模拟流量。我找到了教程如何使用Python How to Send SMS using SMPP Protocol

中的smpp lib发送短信

我正在尝试编写接收器,但我无法让它工作。请帮忙。 我的代码是:

 import smpplib


class ClientCl():
    client=None
    def receive_SMS(self):
        client=smpplib.client.Client('localhost',1000)

        try:
            client.connect()          
            client.bind_receiver("sysID","login","password")
            sms=client.get_message()
            print(sms)

        except : 
            print("boom! nothing works")           
            pass


sms_getter=ClientCl.receive_SMS

1 个答案:

答案 0 :(得分:2)

据我所了解,您正在使用的smpplib是$regex上可用的smpplib。查看您的代码和客户端代码,我找不到函数client.get_message。也许您有一个旧版本的库?或我的图书馆有误。无论如何,get_message函数很可能不会阻塞并等待消息到达。

看客户端代码,您似乎有两个选择:

  • 轮询库,直到收到有效消息
  • 设置库以侦听SMPP端口并在消息到达后调用函数。

如果您查看github文件,它将显示如何设置该库以实现第二个选项(这是更好的选择)。

...
client = smpplib.client.Client('example.com', SOMEPORTNUMBER)

# 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='login', password='secret')

for part in parts:
  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='SENDERPHONENUM',

    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='PHONENUMBER',
    short_message=part,

    data_coding=encoding_flag,
    esm_class=msg_type_flag,
    registered_delivery=True,
)
print(pdu.sequence)
client.listen()
...

当接收到消息或送达回执时,将调用client.set_message_received_handler()中定义的功能。在示例中,它是lambda函数。还有一个示例,说明如何设置线程侦听。

如果您更喜欢简单的轮询选项,则应使用poll函数。对于最简单的实现,您需要做的是:

while True:
  client.Poll()

像以前一样,一旦收到消息,就会调用client.set_message_received_handler()中设置的函数。