def salesforce_handler()

in workmail-salesforce-python/src/app.py [0:0]


def salesforce_handler(event, context):
    """
    Basic Integration With Salesforce Using WorkMail Lambda Integration
    Parameters
    ----------
    email_summary: dict, required
        Amazon WorkMail Message Summary Input Format
        For more information, see https://docs.aws.amazon.com/workmail/latest/adminguide/lambda.html
    context: object, required
        Lambda Context runtime methods and attributes. See https://docs.aws.amazon.com/lambda/latest/dg/python-context-object.html
    Returns
    -------
    Amazon WorkMail Sync Lambda Response Format
    For more information, see https://docs.aws.amazon.com/workmail/latest/adminguide/lambda.html#synchronous-schema
    """
    from_address = event['envelope']['mailFrom']['address']
    flow_direction = event['flowDirection']
    message_id = event['messageId']
    subject = event['subject'] if event['subject'] is not None else ''

    logger.info(f"Received email with message ID {message_id}, flowDirection {flow_direction}, from {from_address}")

    try:
        sf_client = sf_utils.create_sf_client()
        # 1. Download and parse the email using messageId
        parsed_email: Message = email_utils.download_email(message_id)
        # 2. Process the parsed email message in Salesforce
        sf_case: SalesforceCase = sf_utils.process_email(sf_client, parsed_email, event)
        # 3. Process the calendar invite in Salesforce if exists
        calendar_item = email_utils.extract_element(parsed_email, 'text/calendar')
        if calendar_item is not None:
            sf_utils.process_meeting_request(sf_client, calendar_item.get_content(), sf_case)

        # 4. Save updated email in WorkMail if required
        if sf_case.is_new_case:
            parsed_email.replace_header('Subject', f"[CaseId:{sf_case.case_id}] {subject}")

            if calendar_item is not None:
                sf_utils.update_icalendar_in_email(calendar_item, sf_case.case_id)
            
            email_utils.update_workmail(message_id, parsed_email)

    except ClientError as e:
        if e.response['Error']['Code'] == 'MessageFrozen':
            # Redirect emails are not eligible for update, handle it gracefully.
            logger.error(f"Message {message_id} is not eligible for update. This is usually the case for a redirected email")
        else:
            # Send some context about this error to Lambda Logs
            logger.error(e)
            if e.response['Error']['Code'] == 'ResourceNotFoundException':
                logger.error(f"Message {message_id} does not exist. Messages in transit are no longer accessible after 1 day")
            elif e.response['Error']['Code'] == 'InvalidContentLocation':
                logger.error('WorkMail could not access the updated email content. See https://docs.aws.amazon.com/workmail/latest/adminguide/update-with-lambda.html')
            raise(e)

    return {
        'actions': [
            {
                'allRecipients': True,  # For all recipients
                'action': {'type': 'DEFAULT'}  # let the email be sent normally
            }
        ]
    }