code: def publish(self, body, routing_key, exchange='', properties=None,
                  mandatory=False, immediate=False):
          
          self._validate_publish_parameters(body, exchange, immediate, mandatory,
                                            properties, routing_key)
          properties = properties or {}
          body = self._handle_utf8_payload(body, properties)
          properties = specification.Basic.Properties(**properties)
          method_frame = specification.Basic.Publish(exchange=exchange,
                                                     routing_key=routing_key,
                                                     mandatory=mandatory,
                                                     immediate=immediate)
          header_frame = pamqp_header.ContentHeader(body_size=len(body),
                                                    properties=properties)
  
          frames_out = [method_frame, header_frame]
          for body_frame in self._create_content_body(body):
              frames_out.append(body_frame)
  
          if self._channel.confirming_deliveries:
              with self._channel.rpc.lock:
                  return self._publish_confirm(frames_out)
          self._channel.write_frames(frames_out)
docs: Publish a Message.
  
          :param bytes|str|unicode body: Message payload
          :param str routing_key: Message routing key
          :param str exchange: The exchange to publish the message to
          :param dict properties: Message properties
          :param bool mandatory: Requires the message is published
          :param bool immediate: Request immediate delivery
  
          :raises AMQPInvalidArgument: Invalid Parameters
          :raises AMQPChannelError: Raises if the channel encountered an error.
          :raises AMQPConnectionError: Raises if the connection
                                       encountered an error.
  
          :rtype: bool|None