Showing posts with label Sending Emails. Show all posts
Showing posts with label Sending Emails. Show all posts

Thursday, August 18, 2011

Rendering VF page as pdf and sending pdf as an attachment from a list view

Thought i would share something which i needed to work on. I thank Jeff Douglas for his awesome post which helped me in this assignment.

Requirement
    There is a custom visualforce page which is rendered as pdf. There is a button on contact detail page which when clicked would call this vf page. These things were present. In addition to viewing this pdf from contact detail there was also a necessity to email these PDFs that too in bulk from list views.

Solution
list button was created with source as VF page.

<apex:page standardController="contact" recordSetVar="Props" extensions="emailcontact" action="{!sendingemail}">
</apex:page>

Controller is where all the code is

public  class emailcontact {
     public ApexPages.StandardSetController propcontroller{get;set;}
    public list<contact> props{get;set;}  
    public emailcontract(ApexPages.StandardSetController controller) {
    propcontroller =(ApexPages.StandardSetController)controller;   
    }
    public pagereference sendingemail(){
        props = propcontroller.getSelected();// Contains the list of record which is selected from the list  
         
        PageReference pdf = Page.VFpagetoberenderedaspdf;
        for(contact pr : props)
        {
            pdf.getParameters().put('id',pr.Id);
            attachment attach = new attachment();
            Blob body;
            try {
                body = pdf.getContentAsPDF();
                }
            catch (VisualforceException e) {
                body = Blob.valueOf('Missing Text');
                }
            // ********************* for attachment to the contactrecord ******************************   
            try{
            attach.Body = body;        
            attach.Name = 'Contact' +system.today+'.pdf';
            attach.IsPrivate = false;
            attach.ParentId = pr.Id;
            att.add(attach);
            }
            catch(exception e)
            {
           
            }
            // ************************ for email creation************************************   
           
            Messaging.EmailFileAttachment attach2 = new Messaging.EmailFileAttachment();
            attach2.setContentType('application/pdf');
            attach2.setFileName('Contact.pdf');
            attach2.setInline(false);
            attach2.Body = body;
            Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
            String[] toAddresses = new String[] {pr.Email};
            mail.setToAddresses(toAddresses);
            mail.setSubject('Offer for' + pr.name);// alternatively use templates as well
            mail.setFileAttachments(new Messaging.EmailFileAttachment[] { attach2 });
            mail.setHtmlBody('Please find attached a cash offer for your listing at ');           
            em_sent.add(mail);          
        }
    }
    if(att!= null)
    insert att;
    if(em_sent != null)
    Messaging.sendEmail(em_sent);         
    pagereference pr  = new pagereference('/a0e/o');//will redirect to contact tab
    return pr;
    }
}

Also you can add a piece of code to send an email to yourself to indicate the success or failure of the action or display it in the page

Limitations

Major limitation i faced is no of the records the code can process (Governor limits on callouts). It was limited to 10 after which time out error happened. I tried using batch as well as future calls. Both returned me empty PDFs. Waiting for Salesforce to remove these limitations in future.