code: async def data(self, email_message):
          
          code, message = await self.do_cmd("DATA", success=(354,))
  
          email_message = SMTP.prepare_message(email_message)
  
          self.writer.write(email_message)  # write is non-blocking.
          await self.writer.drain()  # don't forget to drain.
  
          code, message = await self.reader.read_reply()
  
          return code, message
docs: Sends a SMTP 'DATA' command. - Transmits the message to the server.
  
          If ``email_message`` is a bytes object, sends it as it is. Else,
          makes all the required changes so it can be safely trasmitted to the
          SMTP server.`
  
          For further details, please check out `RFC 5321 § 4.1.1.4`_.
  
          Args:
              email_message (str or bytes): Message to be sent.
  
          Raises:
              ConnectionError subclass: If the connection to the server is
                  unexpectedely lost.
              SMTPCommandFailedError: If the DATA command fails.
  
           Returns:
              (int, str): A (code, message) 2-tuple containing the server last
                  response (the one the server sent after all data were sent by
                  the client).
  
          .. seealso: :meth:`SMTP.prepare_message`
  
          .. _`RFC 5321 § 4.1.1.4`: https://tools.ietf.org/html/rfc5321#section-4.1.1.4