[SalesForce] the difference between SingleEmailMessage and EmailMessage

I am creating a custom email client and have all the functionality needed using SingleEmailMessage.

However, I am unable to set a parentId on the SingleEmailMessage. I've tried looking on previous questions and saw people using mail.setSaveAsActivity(true); but its not saving it under a case's related lists.

On EmailMessage there is a parentId field that can be set to the case. But I do not see any examples of anyone sending EmailMessages.

Are EmailMessages basically receipts from a SingleEmailMessage? How can I get the parentId to attach to a case?

public PageReference sendEmail(){
    List<String> recipients = new List<String>();
    List<String> ccs = new List<String>();
    List<String> bcs = new List<String>();
    recipients.add(email);


    for(String additional : additionalTo.split(';')){
        if(additional.trim().length() > 0){
            recipients.add(additional.trim());
        }
    }
    for(String carbonCopy : cc.split(';')){
        if(carbonCopy.trim().length() > 0){
            ccs.add(carbonCopy.trim());
        }
    }
    for(String blindCopy : bc.split(';')){
        if(blindCopy.trim().length() > 0){
            bcs.add(blindCopy.trim());
        }
    }

    Integer numOfEmails = recipients.size() + ccs.size() + bcs.size();
    Messaging.reserveSingleEmailCapacity(numOfEmails);
    Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
    mail.setToAddresses(recipients);
    mail.setCcAddresses(ccs);
    mail.setBccAddresses(bcs);
    mail.setReplyTo(fromAddressesMap.get(fromAddress));
    System.debug('To Address: ' + email);
    mail.setSenderDisplayName('The Vitality Group Customer Support');
    mail.setSubject(subject);
    mail.setBccSender(false);
    mail.setUseSignature(false);
    mail.setPlainTextBody(body);
    mail.setSaveAsActivity(true);
    if(emailAttachment != null){
        Messaging.EmailFileAttachment efa = new Messaging.EmailFileAttachment();
        efa.setFileName(fileName);
        efa.setBody(emailAttachment);
        mail.setFileAttachments(new Messaging.EmailFileAttachment[] {efa});

    }
    if(memberCase != null){
        mail.setSubject(subject + ' ref: ' + memberCase.Id);
        mail.setWhatId(memberCase.Id);
    }
    else{
        mail.setTargetObjectId(con.Id);
    }
    Messaging.SendEmailResult [] r = Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });
    System.debug(r);
    return new PageReference('/' + con.Id);  
}

Best Answer

EmailMessage is a type object that has to do recording emails that are sent/received on cases. You don't use this object to send emails on cases, but simply use this object to log the data. Use Messaging.SingleEmailMessage. Here's a minimal version that you need to send an email, and have it appear on the case:

Messaging.SingleEmailMessage m = new Messaging.SingleEmailMessage();
m.setTargetObjectId(someContactId);
m.setWhatId(someCaseId);
m.setSaveAsActivity(true);
m.setSubject(subject);
m.setPlainTextBody(plainTextBody); // or HTML content using setHtmlBody.
Messaging.sendEmail(new Messaging.Email[] { m });