function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
DY RayDY Ray 

Auto Create Contact with Email to Case

Hi, I'm trying to implement auto creation trigger of contacts for all incoming email to case emails. It should auto create the contact if the contact is not in our system.

The auto creation features works in sandbox and production. However, our agents are not allowed to create a new case in production. Does anyone know why I am getting this error? Thank you for your help!

Here is the error message when creating a new case:
Error Message when creating a new case

Here is the code we used:
trigger TriggertoCreateContactformCase on Case (before insert) {
    List<String> UseremailAddresses = new List<String>();
    //First exclude any cases where the contact is set
    for (Case c:Trigger.new) {
        if (c.ContactId==null &&
            c.SuppliedEmail!=''|| c.SuppliedEmail==null)
        {
            UseremailAddresses.add(c.SuppliedEmail);
        }
    }

    //Now we have a nice list of all the email addresses.  Let's query on it and see how many contacts already exist.
    List<Contact> listofallContacts = [Select Id,Email From Contact Where Email in:UseremailAddresses];
    Set<String> ExstingEmails = new Set<String>();
    for (Contact c:listofallContacts) {
        ExstingEmails.add(c.Email);
    }
    
    Map<String,Contact> emailToContactMap = new Map<String,Contact>();
    List<Case> casesToUpdate = new List<Case>();

    for (Case c:Trigger.new) {
        if (c.ContactId==null &&
            c.SuppliedName!=null &&
            c.SuppliedEmail!=null &&
            c.SuppliedName!='' &&
           !c.SuppliedName.contains('@') &&
            c.SuppliedEmail!='' &&
           !ExstingEmails.contains(c.SuppliedEmail))
        {
            //The case was created with a null contact
            //Let's make a contact for it
            String[] Emailheader = c.SuppliedName.split(' ',2);
            if (Emailheader.size() == 2)
            {
                Contact conts = new Contact(FirstName=Emailheader[0],
                                            LastName=Emailheader[1],
                                            Email=c.SuppliedEmail
                                            );
                emailToContactMap.put(c.SuppliedEmail,conts);
                casesToUpdate.add(c);
            }
        }
    }
    
    List<Contact> newContacts = emailToContactMap.values();
    insert newContacts;
    
    for (Case c:casesToUpdate) {
        Contact newContact = emailToContactMap.get(c.SuppliedEmail);
        
        c.ContactId = newContact.Id;
    }
}

Here is the Apex class we used:
 
@isTest
public class Test_CreateContactFormCase {
    
     static TestMethod  void createData()
     {
           contact c = new contact(FirstName='test',LastName='contact94',Email='abctest@123.com'); 
           insert c;
            case cse1 = new case(subject='Test',suppliedEmail='abctest@123.com',suppliedName='TestUser1');
            insert cse1;
            case cse2 = new case(subject='Test',suppliedEmail='abctest94@123.com',suppliedName='Test User2');
            insert cse2;
     }       
    

}

 
Tyler Brooks 16Tyler Brooks 16
Hi DY Ray,
I am pretty new to Salesforce development, but I think your either your first List of userEmailAddresses or the Query to create the List listOfAllContacts is not being selective enough and is looping through too many records (over 200,000). Try adding an additional filter criteria like case = open or something more specific to your org.

Hope that helps! 
DY RayDY Ray
Hi Tyler, I'm trying to search all of our contacts to see if there is a contact. If I add another filter, it would search a limited scope of contacts? Thank you for your advice!