'Composes an email message based on input data, and then immediately
queues the message for sending.
:type source: string
:param source: The sender\'s email address.
:type subject: string
:param subject: The subject of the message: A short summary of the
content, which will appear in the recipient\'s inbox.
:type body: string
:param body: The message body.
:type to_addresses: list of strings or string
:param to_addresses: The To: field(s) of the message.
:type cc_addresses: list of strings or string
:param cc_addresses: The CC: field(s) of the message.
:type bcc_addresses: list of strings or string
:param bcc_addresses: The BCC: field(s) of the message.
:type format: string
:param format: The format of the message\'s body, must be either "text"
or "html".
:type reply_addresses: list of strings or string
:param reply_addresses: The reply-to email address(es) for the
message. If the recipient replies to the
message, each reply-to address will
receive the reply.
:type return_path: string
:param return_path: The email address to which bounce notifications are
to be forwarded. If the message cannot be delivered
to the recipient, then an error message will be
returned from the recipient\'s ISP; this message
will then be forwarded to the email address
specified by the ReturnPath parameter.
:type text_body: string
:param text_body: The text body to send with this email.
:type html_body: string
:param html_body: The html body to send with this email.'

def send_email(self, source, subject, body, to_addresses, cc_addresses=None, bcc_addresses=None, format='text', reply_addresses=None, return_path=None, text_body=None, html_body=None):

    format = format.lower().strip()
    if (body is not None):
        if (format == 'text'):
            if (text_body is not None):
                raise Warning("You've    passed    in    both    a    body    and    a    text_body;    please    choose    one    or    the    other.")
            text_body = body
        else:
            if (html_body is not None):
                raise Warning("You've    passed    in    both    a    body    and    an    html_body;    please    choose    one    or    the    other.")
            html_body = body
    params = {'Source': source, 'Message.Subject.Data': subject}
    if return_path:
        params['ReturnPath'] = return_path
    if (html_body is not None):
        params['Message.Body.Html.Data'] = html_body
    if (text_body is not None):
        params['Message.Body.Text.Data'] = text_body
    if (format not in ('text', 'html')):
        raise ValueError("'format'    argument    must    be    'text'    or    'html'")
    if (not (html_body or text_body)):
        raise ValueError('No    text    or    html    body    found    for    mail')
    self._build_list_params(params, to_addresses, 'Destination.ToAddresses.member')
    if cc_addresses:
        self._build_list_params(params, cc_addresses, 'Destination.CcAddresses.member')
    if bcc_addresses:
        self._build_list_params(params, bcc_addresses, 'Destination.BccAddresses.member')
    if reply_addresses:
        self._build_list_params(params, reply_addresses, 'ReplyToAddresses.member')
    return self._make_request('SendEmail', params)
