text: # -*- coding: utf-8 -*-
  """
  Created on Thur Apr 20 13:56:10 2017
  
  @author: richard.mathie@amey.co.uk
  
  mirror of the message class in flask_mail
  """
  from flask import current_app
  
  from .attachment import Attachment
  
  
  class BadHeaderError(Exception):
      pass
  
  
  class Message(object):
      """Encapsulates an email message.
      :param subject: email subject header
      :param recipients: list of email addresses
      :param body: plain text message
      :param html: HTML message
      :param alts: A dict or an iterable to go through dict() that contains multipart alternatives
      :param sender: email sender address, or **MAIL_DEFAULT_SENDER** by default
      :param cc: CC list
      :param bcc: BCC list
      :param attachments: list of Attachment instances
      :param reply_to: reply-to address
      :param date: send date
      :param charset: message character set
      :param extra_headers: A dictionary of additional headers for the message
      :param mail_options: A list of ESMTP options to be used in MAIL FROM command
      :param rcpt_options:  A list of ESMTP options to be used in RCPT commands
      """
  
      def __init__(
          self,
          subject="",
          recipients=None,
          body=None,
          html=None,
          amp_html=None,
          alts=None,
          sender=None,
          cc=None,
          bcc=None,
          attachments=None,
          reply_to=None,
          date=None,
          charset=None,
          extra_headers=None,
          mail_options=None,
          rcpt_options=None,
      ):
  
          sender = sender or current_app.extensions["mail"].default_sender
  
          if isinstance(sender, tuple):
              sender = "{0} <{1}>".format(*sender)
  
          self.recipients = recipients or []
          self.subject = subject
          self.sender = sender
          self.reply_to = reply_to
          self.cc = cc or []
          self.bcc = bcc or []
          self.body = body
          self.alts = dict(alts or {})
          self.html = html
          self.amp_html = amp_html
          self.date = date
          self.charset = charset
          self.extra_headers = extra_headers
          self.mail_options = mail_options or []
          self.rcpt_options = rcpt_options or []
          self.attachments = attachments or []
  
      @property
      def html(self):
          return self.alts.get("html")
  
      @html.setter
      def html(self, value):
          if value is None:
              self.alts.pop("html", None)
          else:
              self.alts["html"] = value
  
      def send(self, connection):
          """Verifies and sends the message."""
  
          connection.send(self)
  
      def add_recipient(self, recipient):
          """Adds another recipient to the message.
          :param recipient: email address of recipient.
          """
  
          self.recipients.append(recipient)
  
      def attach(
          self,
          filename=None,
          content_type=None,
          data=None,
          disposition=None,
          headers=None,
      ):
          """Adds an attachment to the message.
          :param filename: filename of attachment
          :param content_type: file mimetype
          :param data: the raw file data
          :param disposition: content-disposition (if any)
          """
          self.attachments.append(
              Attachment(filename, content_type, data, disposition, headers)
          )
  