code: def _send_mail(self, receivers_list, subject, body, log_files=None):
          if not receivers_list:
              self.log.info('no valid addresses in requested addresses. Doing nothing')
              return
  
          self.log.info('sending notification to %s ...', receivers_list)
  
          
          if log_files:
              msg = MIMEMultipart()
              msg.attach(MIMEText(body))
              for entry in log_files:
                  log_mime = MIMEBase('application', "octet-stream")
                  log_file = entry[0]  # Output.file
                  log_file.seek(0)
                  log_mime.set_payload(log_file.read())
                  encoders.encode_base64(log_mime)
                  log_mime.add_header('Content-Disposition',
                                      'attachment; filename="{}"'.format(entry[1]['filename']))
                  msg.attach(log_mime)
          else:
              msg = MIMEText(body)
          msg['Subject'] = subject
          msg['From'] = self.from_address
          msg['To'] = ', '.join([x.strip() for x in receivers_list])
  
          s = None
          try:
              s = get_smtp_session(self.workflow, self.smtp_fallback)
              s.sendmail(self.from_address, receivers_list, msg.as_string())
          except (socket.gaierror, smtplib.SMTPException):
              self.log.error('Error communicating with SMTP server')
              raise
          finally:
              if s is not None:
                  s.quit()
docs: Actually sends the mail with `subject` and `body` and optionanl log_file attachements
          to all members of `receivers_list`.