I have the following Apex Trigger on the EmailMessage object (cases to email):

trigger EmailMessageTrigger on EmailMessage (after insert) {
    List<CaseComment> CaseComments = new List<CaseComment>();
    List<Attachment> Attachments = new List<Attachment>();

    for (EmailMessage e : Trigger.New) {
        CaseComments.add(new CaseComment(CommentBody=e.FromName +' has added an email to the case: \n https://gnerb-dev-ed.my.salesforce.com/'+e.Id,

        for (attachment a : e.attachments) {
            Attachment newFile = a.clone();
            newfile.ParentId = e.ParentId;

    insert CaseComments;
    insert Attachments;

I need the email attachments to be cloned and attached to the email's parent case. I used the code from:

Copying attachments from object to object trigger

As an example and it doesn't seem to work. No errors are thrown or recorded to the log. I also tried putting the insert lines into a try/catch block to grab errors and no errors were produced. The case comment is added as desired.




Outputs: 0

I tried to modify the for loop to the following:

    for (EmailMessage e : [SELECT Id, FromName, ParentId, (SELECT Id, ParentId FROM Attachments)
    FROM EmailMessage WHERE Id in :Trigger.New]) {

Unfortunately, it still shows 0.

  • 1
    First of all, the attachments (or any sobject) related list won't be in the scope of the trigger.new - they have to be queried for as you noted in your edit. But more importantly, SFDC can't insert the Attachment until the after insert of EmailMessage is finished. You'll need a trigger on Attachment that understands parentId being of sobjecttype EmailMessage – cropredy Nov 3 '15 at 23:15
  • That makes sense; it's pretty much the exact opposite of what I wanted to do though. It just adds another piece to the puzzle. If that's the only option it's easy enough. – gNerb Nov 4 '15 at 0:29

The following answer is based on crop1645's comment to the question:

trigger CaseAttachment on Attachment (after insert) {
    Set<Id> Parents = new Set<Id>();
    List<Attachment> newFiles = new List<Attachment>();

    for (attachment a : Trigger.New) {

    for (EmailMessage e : [SELECT Id, ParentId FROM EmailMessage WHERE Id in :Parents]) { //loop through unique parents
        for (Attachment a : Trigger.New) {
            if (e.Id == a.ParentId) {
                Attachment newFile = a.clone();
                newFile.ParentId = e.ParentId;

    Insert newFiles;

This appears to be working in my tests.

  • Did this work for you ? I have a similar requirement and my trigger/handler is not getting invoked when attachments are created via an email. There is an active platform issue logged for this : Trigger on Attachment does not fire when attachment is created via Email – Jarvis Aug 16 '18 at 13:58
  • Yes this worked for me but this was 3 years ago. It's entirely possible that the issue has been reintroduced. I no longer work for the company that I wrote this code for so I cannot tell you if it is working at present. – gNerb Aug 16 '18 at 14:51

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.