All Products
Search
Document Center

Simple Message Queue (formerly MNS):Manage queue messages with SMQ SDK for Python

Last Updated:Jun 02, 2026

Send, receive, and delete messages in an SMQ queue using the Python SDK.

Prerequisites

Ensure that:

Important

The following examples load the endpoint from sample.cfg and the AccessKey pair and security token from environment variables. Download the complete sample code from Overview.

SDK classes

The SMQ Python SDK uses three core classes:

Class Role
Account Entry point. Connects to SMQ with an endpoint and credentials
Queue Created from Account. Provides methods to send, receive, and delete messages
Message Represents a single message with a body, message ID, and receipt handle

Typical initialization:

from mns.account import Account

my_account = Account(endpoint, accid, acckey, token)
my_queue = my_account.get_queue("<queue-name>")

Message body encoding

Skip Base64 encoding if the message body contains no special characters.

  • Send without Base64: Call message.setMessageBodyAsRawString to set the message body as a raw string.

  • Receive without Base64: Call message.getMessageBodyAsRawString to retrieve the raw string body.

By default, the SDK uses Base64 encoding. To disable it on the receiving side, call my_queue.set_encoding(False).

Send messages

send_message.py sends messages to a queue.

Run the script

python send_message.py <queue-name>

Replace <queue-name> with your queue name. Defaults to MySampleQueue.

Expected output

==========Send Message To Queue==========
QueueName:MyQueue1
MessageCount:3

Send Message Succeed!  MessageBody:I am test message 0. MessageID:3EBE662B52BC99BC-1-154BD99CCA7-200000001
Send Message Succeed!  MessageBody:I am test message 1. MessageID:64B92941FC57837F-2-154BD99CCCE-200000001
Send Message Succeed!  MessageBody:I am test message 2. MessageID:3EBE662B52BC99BC-1-154BD99CCF0-200000002

Code walkthrough

1. Initialize the account and get the queue.

my_account = Account(endpoint, accid, acckey, token)
queue_name = sys.argv[1] if len(sys.argv) > 1 else "MySampleQueue"
my_queue = my_account.get_queue(queue_name)

2. Create and send a message.

msg_body = u"I am test message 0."
msg = Message(msg_body)
re_msg = my_queue.send_message(msg)

The returned re_msg object contains the message_id assigned by SMQ.

3. Handle errors.

except MNSExceptionBase as e:
    if e.type == "QueueNotExist":
        print("Queue not exist, please create queue before send message.")
        sys.exit(0)
    print("Send Message Fail!  Exception:%s\n" % e)

If the queue does not exist, the SDK raises an MNSExceptionBase with e.type set to QueueNotExist.

Complete core code

my_account = Account(endpoint, accid, acckey, token)
queue_name = sys.argv[1] if len(sys.argv) > 1 else "MySampleQueue"
my_queue = my_account.get_queue(queue_name)

msg_count = 3

print("%sSend Message To Queue%s\nQueueName:%s\nMessageCount:%s\n" % (10*"=", 10*"=", queue_name, msg_count))
for i in range(msg_count):
    try:
        msg_body = u"I am test message %s." % i
        msg = Message(msg_body)
        re_msg = my_queue.send_message(msg)
        print("Send Message Succeed!  MessageBody:%s MessageID:%s ReceiptHandle:%s" % (msg_body, re_msg.message_id, re_msg.receipt_handle))
    except MNSExceptionBase as e:
        if e.type == "QueueNotExist":
            print("Queue not exist, please create queue before send message.")
            sys.exit(0)
        print("Send Message Fail!  Exception:%s\n" % e)

Receive and delete messages

recv_and_del_message.py receives messages with long polling and deletes each one after processing.

Run the script

python recv_and_del_message.py <queue-name>

Replace <queue-name> with your queue name. Defaults to MySampleQueue.

To disable Base64 decoding, pass false as the second argument:

python recv_and_del_message.py <queue-name> false

Expected output

==========Receive And Delete Message From Queue==========
QueueName:MyQueue1
WaitSeconds:3

Receive Message Succeed!  ReceiptHandle:1-ODU4OTkzNDU5My0xNDYzNDcwNDU4LTEtOA== MessageBody:I am test message 0. MessageID:3EBE662B52BC99BC-1-154BD99CCA7-200000001
Delete Message Succeed!  ReceiptHandle:1-ODU4OTkzNDU5My0xNDYzNDcwNDU4LTEtOA==
Receive Message Succeed!  ReceiptHandle:1-ODU4OTkzNDU5NC0xNDYzNDcwNDU4LTEtOA== MessageBody:I am test message 2. MessageID:3EBE662B52BC99BC-1-154BD99CCF0-200000002
Delete Message Succeed!  ReceiptHandle:1-ODU4OTkzNDU5NC0xNDYzNDcwNDU4LTEtOA==
Receive Message Succeed!  ReceiptHandle:1-ODU4OTkzNDU5My0xNDYzNDcwNDU4LTItOA== MessageBody:I am test message 1. MessageID:64B92941FC57837F-2-154BD99CCCE-200000001
Delete Message Succeed!  ReceiptHandle:1-ODU4OTkzNDU5My0xNDYzNDcwNDU4LTItOA==
Queue is empty!

Code walkthrough

1. Initialize the account, get the queue, and configure encoding.

my_account = Account(endpoint, accid, acckey, token)
queue_name = sys.argv[1] if len(sys.argv) > 1 else "MySampleQueue"
base64 = False if len(sys.argv) > 2 and sys.argv[2].lower() == "false" else True
my_queue = my_account.get_queue(queue_name)
my_queue.set_encoding(base64)

set_encoding controls Base64 decoding. Pass False to receive raw string bodies.

2. Receive a message with long polling.

wait_seconds = 3
recv_msg = my_queue.receive_message_with_str_body(wait_seconds)
Parameter Description
wait_seconds Long polling duration in seconds. Blocks until a message arrives or the timeout expires

The SDK provides two receive methods:

Method Returns
receive_message(wait_seconds) Message body as a byte string
receive_message_with_str_body(wait_seconds) Message body as a string

Received message attributes:

Attribute Description
recv_msg.receipt_handle Handle required to delete the message
recv_msg.message_body Content of the message
recv_msg.message_id Unique message identifier

3. Delete the message after processing.

my_queue.delete_message(recv_msg.receipt_handle)

Pass the receipt_handle from the received message. Undeleted messages become available to other consumers after the visibility timeout expires.

4. Handle errors.

except Exception as e:
    if hasattr(e, 'type'):
        if e.type == u"QueueNotExist":
            print("Queue not exist, please create queue before receive message.")
            sys.exit(0)
        elif e.type == u"MessageNotExist":
            print("Queue is empty!")
            sys.exit(0)
    print("Receive Message Fail!  Exception:%s\n" % e)
Error type Meaning
QueueNotExist The specified queue does not exist. Create it before sending or receiving messages
MessageNotExist No messages are available in the queue. The long polling wait timed out

Complete core code

my_account = Account(endpoint, accid, acckey, token)
queue_name = sys.argv[1] if len(sys.argv) > 1 else "MySampleQueue"
base64 = False if len(sys.argv) > 2 and sys.argv[2].lower() == "false" else True
my_queue = my_account.get_queue(queue_name)
my_queue.set_encoding(base64)

wait_seconds = 3
print("%sReceive And Delete Message From Queue%s\nQueueName:%s\nWaitSeconds:%s\n" % (10*"=", 10*"=", queue_name, wait_seconds))
while True:
    try:
        # receive_message returns a byte string body.
        # receive_message_with_str_body returns a string body.
        recv_msg = my_queue.receive_message_with_str_body(wait_seconds)
        print("Receive Message Succeed!  ReceiptHandle:%s MessageBody:%s MessageID:%s" % (recv_msg.receipt_handle, recv_msg.message_body, recv_msg.message_id))
    except Exception as e:
        if hasattr(e, 'type'):
            if e.type == u"QueueNotExist":
                print("Queue not exist, please create queue before receive message.")
                sys.exit(0)
            elif e.type == u"MessageNotExist":
                print("Queue is empty!")
                sys.exit(0)
        print("Receive Message Fail!  Exception:%s\n" % e)
        continue

    try:
        my_queue.delete_message(recv_msg.receipt_handle)
        print("Delete Message Succeed!  ReceiptHandle:%s" % recv_msg.receipt_handle)
    except Exception as e:
        print("Delete Message Fail!  Exception:%s\n" % e)

References