We are trying to add attachments to an email template using a component. The code in the email template is:

<messaging:emailTemplate subject="My Subject" recipientType="User" relatedToType="My_Custom_Object__c">
<messaging:htmlEmailBody >


blah, blah, blah

<apex:outputText value="If you have any questions, please email "/>
<apex:outputLink value="mailto:myemail@myemail.com"/>myemail@myemail.com
<messaging:plainTextEmailBody >


blah, blah, blah


<c:IncludeAttachments parentId="{!relatedTo.Id}" include="MostRecent"/>

The component IncludeAttachments code is:

   <apex:component controller="IncludeAttachmentsController" access="global">

    <apex:attribute name="parentId"
        description="Parent Id"
        type="Id" />

    <apex:attribute name="include"
        description="Include parameter"
        type="String" />

    <apex:repeat value="{!attachments}" var="attachment">
        <messaging:attachment renderAs="{!attachment.contentType}" fileName="{!attachment.name}">{!attachment.body}</messaging:attachment>


The IncludeAttachmentsController code is:

global class IncludeAttachmentsController {

/* Variables and Constants */

global Id parentObjectId { get; set; }
global String includeAttachments { get; set; }

private static final String INCLUDE_ALL = 'All';
private static final String INCLUDE_MOST_RECENT = 'MostRecent';

public List<Attachment> attachments {
    get {
        if (INCLUDE_ALL.equalsIgnoreCase(includeAttachments)) {
            return [select 
                       , contentType
                       , body 
                    from Attachment 
                    where parentId = :this.parentObjectId];
        } else {  // include most recent
            return [select 
                       , contentType
                       , body 
                    from Attachment 
                    where parentId = :this.parentObjectId 
                    order by CreatedDate desc
                    limit 1];

Two problems: The email link does not show up as a link, just text.

We get the following error:

Error: Invalid child of messaging:emailTemplate. Only messaging components are allowed as children of messaging:emailTemplate.

Can anyone help us resolve these two problems?

1 Answer 1


1) Error: Invalid child of messaging:emailTemplate. Only messaging components are allowed as children of messaging:emailTemplate.

This is because you are trying to use <messaging:attachment> inside the repeat tag in the component. this is not allowed. Are you trying to send the email with attachment in a .csv or PDF ( not giving the user the choice) if so I can rewrite your code to get a csv out.

2) Email link to show up as a link you need to change the output link to

<apex:outputLink value="mailto:myemail@myemail.com">mailto:myemail@myemail.com </apex:outputlink>

you have closed your outputlinktag before the mailto:myemail@myemail.com text.

  • Thanks, 1. I am using the repeat because there are multiple attachments. How do I handle that? 2. My typo: please see email link now.
    – JimH
    Jun 17, 2013 at 16:55
  • Having said the messaging:attachment has to be a child of messaging:emailTemplate we cannot use repeat over a messaging:attachment inside a tempalte.Will a email event work? check this post out : boards.developerforce.com/t5/Apex-Code-Development/…. Using the above you can make this a batch class and even schedule the emails
    – Rao
    Jun 17, 2013 at 17:01
  • Thanks for the answer to 2. Closing the tag worked. With regard to question 1, we have to do this with an email template.
    – JimH
    Jun 17, 2013 at 17:19
  • It would be hard to do with the template because 1) <attachment> needs to be a child of <messaging:> component. All I can suggest is taking a different approach metioned here ; salesforce.com/us/developer/docs/pages/Content/…
    – Rao
    Jun 17, 2013 at 17:23
  • @JimH were you able to find a solution for the multiple attachments? Apr 11, 2014 at 0:55

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.