(self, subject, message, from_email, recipient_list,
                    messaging_event_id=None, domain=None)
Call with send_mail_async.delay(*args, **kwargs)
    - sends emails in the main celery queue
    - if sending fails, retry in 15 min
    - retry a maximum of 10 times
Call with send_mail_async.delay(*args, **kwargs)
    - sends emails in the main celery queue
    - if sending fails, retry in 15 min
    - retry a maximum of 10 times
Call with send_mail_async . delay ( * args ** kwargs ) - sends emails in the main celery queue - if sending fails retry in 15 min - retry a maximum of 10 times
def send_mail_async(self, subject, message, from_email, recipient_list,
                    messaging_event_id=None, domain=None):
    """ Call with send_mail_async.delay(*args, **kwargs)
    - sends emails in the main celery queue
    - if sending fails, retry in 15 min
    - retry a maximum of 10 times
    """
    from corehq.util.soft_assert import soft_assert
    soft_assert('{}@dimagi.com'.format('skelly'))(
        all(recipient for recipient in recipient_list),
        'Blank email addresses',
        {
            'subject': subject,
            'message': message,
            'recipients': recipient_list
        }
    )

    recipient_list = [_f for _f in recipient_list if _f]

    # todo deal with recipients marked as bounced
    from dimagi.utils.django.email import get_valid_recipients, mark_local_bounced_email
    filtered_recipient_list = get_valid_recipients(recipient_list, domain)
    bounced_recipients = list(set(recipient_list) - set(filtered_recipient_list))
    if bounced_recipients and messaging_event_id:
        mark_local_bounced_email(bounced_recipients, messaging_event_id)

    if not filtered_recipient_list:
        return

    headers = {}

    if settings.RETURN_PATH_EMAIL:
        headers['Return-Path'] = settings.RETURN_PATH_EMAIL

    if messaging_event_id is not None:
        headers[COMMCARE_MESSAGE_ID_HEADER] = messaging_event_id
    if settings.SES_CONFIGURATION_SET is not None:
        headers[SES_CONFIGURATION_SET_HEADER] = settings.SES_CONFIGURATION_SET

    try:
        message = EmailMessage(
            subject=subject,
            body=message,
            from_email=from_email,
            to=filtered_recipient_list,
            headers=headers,
        )
        return message.send()
    except SMTPDataError as e:
        # If the SES configuration has not been properly set up, resend the message
        if (
            "Configuration Set does not exist" in repr(e.smtp_error)
            and SES_CONFIGURATION_SET_HEADER in message.extra_headers
        ):
            del message.extra_headers[SES_CONFIGURATION_SET_HEADER]
            message.send()
            notify_exception(None, message="SES Configuration Set missing", details={'error': e})
        else:
            raise
    except Exception as e:
        notify_exception(
            None,
            message="Encountered error while sending email",
            details={
                'subject': subject,
                'recipients': ', '.join(filtered_recipient_list),
                'error': e,
                'messaging_event_id': messaging_event_id,
            }
        )
        if messaging_event_id is not None:
            mark_subevent_gateway_error(messaging_event_id, e, retrying=True)
        try:
            self.retry(exc=e)
        except MaxRetriesExceededError:
            if messaging_event_id is not None:
                mark_subevent_gateway_error(messaging_event_id, e, retrying=False)
def send_mail_async ( self , subject , message , from_email , recipient_list , messaging_event_id = None , domain = None ) : from corehq . util . soft_assert import soft_assert soft_assert ( '{}@dimagi.com' . format ( 'skelly' ) ) ( all ( recipient for recipient in recipient_list ) , 'Blank email addresses' , { 'subject' : subject , 'message' : message , 'recipients' : recipient_list } ) recipient_list = [ _f for _f in recipient_list if _f ] # todo deal with recipients marked as bounced from dimagi . utils . django . email import get_valid_recipients , mark_local_bounced_email filtered_recipient_list = get_valid_recipients ( recipient_list , domain ) bounced_recipients = list ( set ( recipient_list ) - set ( filtered_recipient_list ) ) if bounced_recipients and messaging_event_id : mark_local_bounced_email ( bounced_recipients , messaging_event_id ) if not filtered_recipient_list : return headers = { } if settings . RETURN_PATH_EMAIL : headers [ 'Return-Path' ] = settings . RETURN_PATH_EMAIL if messaging_event_id is not None : headers [ COMMCARE_MESSAGE_ID_HEADER ] = messaging_event_id if settings . SES_CONFIGURATION_SET is not None : headers [ SES_CONFIGURATION_SET_HEADER ] = settings . SES_CONFIGURATION_SET try : message = EmailMessage ( subject = subject , body = message , from_email = from_email , to = filtered_recipient_list , headers = headers , ) return message . send ( ) except SMTPDataError as e : # If the SES configuration has not been properly set up, resend the message if ( "Configuration Set does not exist" in repr ( e . smtp_error ) and SES_CONFIGURATION_SET_HEADER in message . extra_headers ) : del message . extra_headers [ SES_CONFIGURATION_SET_HEADER ] message . send ( ) notify_exception ( None , message = "SES Configuration Set missing" , details = { 'error' : e } ) else : raise except Exception as e : notify_exception ( None , message = "Encountered error while sending email" , details = { 'subject' : subject , 'recipients' : ', ' . join ( filtered_recipient_list ) , 'error' : e , 'messaging_event_id' : messaging_event_id , } ) if messaging_event_id is not None : mark_subevent_gateway_error ( messaging_event_id , e , retrying = True ) try : self . retry ( exc = e ) except MaxRetriesExceededError : if messaging_event_id is not None : mark_subevent_gateway_error ( messaging_event_id , e , retrying = False )