docs: def returner(ret):
      '''
      Send an email with the data
      '''
  
      _options = _get_options(ret)
      from_addr = _options.get('from')
      to_addrs = _options.get('to').split(',')
      host = _options.get('host')
      port = _options.get('port')
      user = _options.get('username')
      passwd = _options.get('password')
      subject = _options.get('subject') or 'Email from Salt'
      gpgowner = _options.get('gpgowner')
      fields = _options.get('fields').split(',') if 'fields' in _options else []
      smtp_tls = _options.get('tls')
  
      renderer = _options.get('renderer') or 'jinja'
      rend = salt.loader.render(__opts__, {})
      blacklist = __opts__.get('renderer_blacklist')
      whitelist = __opts__.get('renderer_whitelist')
  
      if not port:
          port = 25
      log.debug('SMTP port has been set to %s', port)
  
      for field in fields:
          if field in ret:
              subject += ' {0}'.format(ret[field])
      subject = compile_template(':string:',
                                 rend,
                                 renderer,
                                 blacklist,
                                 whitelist,
                                 input_data=subject,
                                 **ret)
      if isinstance(subject, six.moves.StringIO):
          subject = subject.read()
      log.debug("smtp_return: Subject is '%s'", subject)
  
      template = _options.get('template')
      if template:
          content = compile_template(template, rend, renderer, blacklist, whitelist, **ret)
      else:
          template = ('id: {{id}}\r\n'
                      'function: {{fun}}\r\n'
                      'function args: {{fun_args}}\r\n'
                      'jid: {{jid}}\r\n'
                      'return: {{return}}\r\n')
          content = compile_template(':string:',
                                     rend,
                                     renderer,
                                     blacklist,
                                     whitelist,
                                     input_data=template,
                                     **ret)
  
      if gpgowner:
          if HAS_GNUPG:
              gpg = gnupg.GPG(gnupghome=os.path.expanduser('~{0}/.gnupg'.format(gpgowner)),
                              options=['--trust-model always'])
              encrypted_data = gpg.encrypt(content, to_addrs)
              if encrypted_data.ok:
                  log.debug('smtp_return: Encryption successful')
                  content = six.text_type(encrypted_data)
              else:
                  log.error('smtp_return: Encryption failed, only an error message will be sent')
                  content = 'Encryption failed, the return data was not sent.\r\n\r\n{0}\r\n{1}'.format(
                      encrypted_data.status, encrypted_data.stderr)
          else:
              log.error("gnupg python module is required in order to user gpgowner in smtp returner ; ignoring gpgowner configuration for now")
      if isinstance(content, six.moves.StringIO):
          content = content.read()
  
      message = ('From: {0}\r\n'
                 'To: {1}\r\n'
                 'Date: {2}\r\n'
                 'Subject: {3}\r\n'
                 '\r\n'
                 '{4}').format(from_addr,
                               ', '.join(to_addrs),
                               formatdate(localtime=True),
                               subject,
                               content)
  
      log.debug('smtp_return: Connecting to the server...')
      server = smtplib.SMTP(host, int(port))
      if smtp_tls is True:
          server.starttls()
          log.debug('smtp_return: TLS enabled')
      if user and passwd:
          server.login(user, passwd)
          log.debug('smtp_return: Authenticated')
      # enable logging SMTP session after the login credentials were passed
      server.set_debuglevel(1)
      server.sendmail(from_addr, to_addrs, message)
      log.debug('smtp_return: Message sent.')
      server.quit()