def process_email()

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


def process_email(sf_client, parsed_email, event):
    from_address = event['envelope']['mailFrom']['address']
    contact_id, account_id = process_contact_and_account_id(sf_client, parsed_email, event, from_address)
    # Fetch or create Salesforce opportunity
    subject = event['subject'] if event['subject'] is not None else ''
    date = parsed_email['Date']
    case_id = email_utils.extract_case_id(subject)
    opportunity_id = None
    is_new_case = False
    if case_id is None:
        # Generate a new 8 digit alphanumeric caseId
        case_id = ''.join(secrets.choice(string.ascii_uppercase + string.digits) for i in range(8))
        is_new_case = True
        subject = f"[CaseId:{case_id}] {subject}"
        logger.info(f"Could not find exisiting case, generated new CaseId: {case_id}")
    else:
        opportunity_id = run_sf_query(sf_client, f"SELECT Id FROM Opportunity WHERE TrackingNumber__c='{case_id}'", 'Id')
    if opportunity_id is None:
        close_date = dateutil.parser.parse(date) + default_case_duration
        opportunity_id = sf_client.Opportunity.create({'Name':subject, 'StageName':'Qualification', 'TrackingNumber__c':case_id , 'AccountId':account_id, 'CloseDate':close_date.strftime('%Y-%m-%d')})['id']
        logger.info(f"Opportunity: {opportunity_id} created for CaseId: {case_id}")
    else:
        logger.info(f"CaseId: {case_id} is already related to Opportunity: {opportunity_id}")

    # Associate contact with opportunity if they aren't associated already
    if run_sf_query(sf_client, f"SELECT Id FROM OpportunityContactRole WHERE ContactId='{contact_id}'", 'Id') is None:
        sf_client.OpportunityContactRole.create({'ContactId':contact_id, 'OpportunityId': opportunity_id})

    # Finally, add the the email to the opportunity
    contents = email_utils.extract_text_body(parsed_email)

    is_incoming_email = True if event['flowDirection'] == 'INBOUND' else False
    sf_client.EmailMessage.create({'RelatedToId': opportunity_id, 'Subject': subject, 'TextBody': contents, 'FromAddress': from_address, 'MessageDate': date, 'Incoming': is_incoming_email, 'ToAddress': event['envelope']['recipients'][0]['address']})
    logger.info(f"Associated email with Opportunity!")
    return SalesforceCase(account_id, opportunity_id, contact_id, case_id, is_new_case)