I found a solution. I created a custom "Send an Email" apex page there a user can choose any of opportunity attachment and send it via email, for this functionality I have created an apex controller that can send an email with the attachments. Here is my solution, note the code is not refactored but functionality is doing what I need exactly, Apex page: <apex:page controller="EmailOpportunityAttachment"> <script type="text/javascript"> var delim = ";"; function lookupPick2(editPage, p2_lkid, p2, contactId, contactName, cas4, accountName, cas4_lkid, accountId, h){ document.getElementsByClassName('p2')[0].value = contactName; document.getElementById('p2_lkid').value = contactId; closePopup(); } function pickupValue(additionalToValue, ccValue, bccValue) { //var editPage = document.getElementsByClassName('editPage')[0]; var p24 = document.getElementsByClassName('p24')[0]; var p4 = document.getElementsByClassName('p4')[0]; var p5 = document.getElementsByClassName('p5')[0]; if(additionalToValue != '') { if (p24.value != '') { p24.value += delim; } p24.value += additionalToValue; } if(ccValue != '') { if (p4.value != '') { p4.value += delim; } p4.value += ccValue; } if(bccValue != '') { if (p5.value != '') { p5.value += delim; } p5.value += bccValue; } closePopup(); } function openDocumentUpload(e) { setLastMousePosition(e); openPopup('/widg/filepicker_fs.jsp?lktp=015&mode=1&eid=00Yg0000000aN7g&utype=00P&omode=1&otype=2', 'doc', 450, 450, 'width=450,height=450,scrollbars=yes,toolbar=no,status=no,directories=no,menubar=no,resizable=1', true); } function attachPhxAttachment(e){ var selector = document.getElementById('attS'); var splt = selector.value.split('##'); var id = splt[0]; var size = splt[1]; var tr = document.getElementById('tr_' + id); var fileStr = document.getElementById('fileStr'); fileStr.innerHTML += tr.outerHTML; populateAttIds(); } function populateAttIds(){ var hiddenDv = document.getElementsByClassName('attDvBlock')[0]; var hiddenAttIds = hiddenDv.getElementsByClassName('hiddenAttIds'); var inps = document.getElementsByClassName('attIds')[0]; inps.value = ''; if(hiddenAttIds && hiddenAttIds.length > 0){ for(var i=0; i < hiddenAttIds.length; i++){ inps.value += hiddenAttIds[i].value + delim; } } } function submitFormNoSave() { var nosave = document.getElementById('nosave'); var save = document.getElementById('save'); nosave.value = '1'; save.value = 'nosave'; submitForm(); } function submitForm() { var editPage = document.getElementById('editPage'); editPage.submit(); } function deletePhxAttachment(event) { if (window.confirm('Are you sure?')) { var elem = event.target.parentNode.parentNode; elem.parentNode.removeChild(elem); populateAttIds(); } } </script> <apex:sectionHeader title="Task" subtitle="Send an Email"/> <apex:form id="editPage" onsubmit="if (window.ffInAlert) { return false; }" styleClass="editPage"> <input type="hidden" name="cancelURL" id="cancelURL" value="/{!opptyId}" /> <input type="hidden" name="id" id="id" value="00Yg0000000aN7g" /> <input type="hidden" name="docancel" id="docancel" value="0" /> <input type="hidden" name="new_template" id="new_template" value="0" /> <input type="hidden" name="nosave" id="nosave" value="0" /> <input type="hidden" name="save" id="save" value="0" /> <input type="hidden" name="retURL" id="retURL" value="/{!opptyId}" /> <input type="hidden" name="rtype" id="rtype" value="003" /> <input type="hidden" name="p2_lktp" id="p2_lktp" value="003" /> <input type="hidden" name="p2_lkold" id="p2_lkold" value="" /> <input type="hidden" name="p2_lkid" id="p2_lkid" value="" /> <input type="hidden" name="p2_lspf" id="p2_lspf" value="0" /> <input type="hidden" name="p2_lspfsub" id="p2_lspfsub" value="0" /> <input type="hidden" name="p2_mod" id="p2_mod" value="0" /> <input type="hidden" name="template_id" id="template_id" value="000000000000000" /> <apex:pageblock id="mail" mode="edit"> <apex:pageBlockButtons > <apex:commandButton value="Send" action="{!sendEmail}" id="sendEmailBtn" /> <input type="button" class="btn" value="Select Template" id="sendEmailBtn" /> <input value="Attach File" class="btn" title="Attach File (New Window)" name="attach" onclick="openDocumentUpload(event)" type="button" /> <input type="button" class="btn" value="Check Spelling" id="sendEmailBtn" /> <input type="button" class="btn" value="Cancel" id="cancelBtn" /> </apex:pageBlockButtons> <apex:pageblockSection> <apex:outputText styleClass="err" value="{!errorMsg}"/> <apex:outputText styleClass="success" value="{!successMsg}"/> </apex:pageblockSection> <apex:pageblockSection columns="1" title="Edit Email"> <apex:pageBlockSectionItem > <apex:outputLabel value="From" styleClass="bld"/> <apex:outputpanel layout="block" styleClass="requiredInput"> <apex:outputpanel layout="block" styleClass="requiredBlock" /> <apex:selectList id="p26" value="{!ffrom}" size="1"> <apex:selectOptions value="{!contacts}"></apex:selectOptions> </apex:selectList> </apex:outputpanel> </apex:pageBlockSectionItem> <apex:pageBlockSectionItem> <apex:outputLabel value="To:" styleClass="bld"/> <apex:pageBlockSectionItem> <apex:inputText value="{!to}" maxlength="255" onchange="getElementByIdCS('p2_lkid').value='';getElementByIdCS('p2_mod').value='1';" size="20" styleClass="p2" /> <a href="javascript: openLookup('/_ui/common/data/LookupPage?lkfm=editPage&lknm=p2&lktp=' + getElementByIdCS('p2_lktp').value,670,'1','&lksrch=' + escapeUTF(getElementsByClassName('p2')[0].value.substring(0, 80)))" id="p2_lkwgt" onclick="setLastMousePosition(event)" title="To Lookup (New Window)"> <img src="/s.gif" alt="To Lookup (New Window)" class="lookupIconOn" onblur="this.className = 'lookupIcon';" onfocus="this.className = 'lookupIconOn';" onmouseout="this.className = 'lookupIcon';this.className = 'lookupIcon';" onmouseover="this.className = 'lookupIconOn';this.className = 'lookupIconOn';" title="To Lookup (New Window)" /></a> </apex:pageBlockSectionItem> </apex:pageBlockSectionItem> <apex:pageblockSectionItem> <apex:outputLabel value="Related To" styleClass="bld"/> <apex:pageblockSectionItem> <apex:selectList size="1" style="width: 250px"> <apex:selectOptions value="{!relatedTo}"></apex:selectOptions> <apex:selectOptions value="{!relatedTo}"></apex:selectOptions> <apex:selectOptions value="{!relatedTo}"></apex:selectOptions> </apex:selectList> <apex:inputText maxlength="255" style="margin-left: 4px;" value="{!relatedTo}" /> </apex:pageblockSectionItem> </apex:pageblockSectionItem> <apex:pageblockSectionItem > <apex:outputlink value="javascript: openPopup('/_ui/core/email/author/EmailCCBccLookup?id={!opptyId}', 'CCBCCLookup', 420, 490, 'width=420,height=490,toolbar=no,status=no,directories=no,menubar=no,resizable=yes,scrollable=no', true);" id="p24_lkwgt" onclick="setLastMousePosition(event)" title="Additional To Lookup (New Window)">Aditional To:</apex:outputlink> <apex:pageBlockSectionItem > <apex:inputTextArea value="{!additionalTo}" cols="62" rows="2" styleClass="p24" /> <apex:outputlink value="javascript: openPopup('/_ui/core/email/author/EmailCCBccLookup?id={!opptyId}', 'CCBCCLookup', 420, 490, 'width=420,height=490,toolbar=no,status=no,directories=no,menubar=no,resizable=yes,scrollable=no', true);" id="p24_lkwgt" onclick="setLastMousePosition(event)" title="Additional To Lookup (New Window)"> <img src="/s.gif" alt="Additional To Lookup (New Window)" class="lookupIcon" onblur="this.className = 'lookupIcon';" onfocus="this.className = 'lookupIconOn';" onmouseout="this.className = 'lookupIcon';this.className = 'lookupIcon';" onmouseover="this.className = 'lookupIconOn';this.className = 'lookupIconOn';" title="Additional To Lookup (New Window)" /> </apex:outputlink> </apex:pageBlockSectionItem> </apex:pageblockSectionItem> <apex:pageblockSectionItem > <apex:outputlink value="#" target="_blank">CC:</apex:outputlink> <apex:pageBlockSectionItem > <apex:inputTextArea value="{!cc}" cols="62" id="p4" rows="2" title="CC" styleClass="p4" /> <apex:outputlink value="javascript: openPopup('/_ui/core/email/author/EmailCCBccLookup?id={!opptyId}', 'CCBCCLookup', 420, 490, 'width=420,height=490,toolbar=no,status=no,directories=no,menubar=no,resizable=yes,scrollable=no', true);" id="p4_lkwgt" onclick="setLastMousePosition(event)" title="CC Lookup (New Window)"> <img src="/s.gif" alt="CC Lookup (New Window)" class="lookupIcon" onblur="this.className = 'lookupIcon';" onfocus="this.className = 'lookupIconOn';" onmouseout="this.className = 'lookupIcon';this.className = 'lookupIcon';" onmouseover="this.className = 'lookupIconOn';this.className = 'lookupIconOn';" title="CC Lookup (New Window)" /> </apex:outputlink> </apex:pageBlockSectionItem> </apex:pageblockSectionItem> <apex:pageBlockSectionItem > <apex:outputlink value="#" target="_blank">BCC:</apex:outputlink> <apex:pageBlockSectionItem> <apex:inputTextArea value="{!bcc}" cols="62" id="p5" rows="2" title="BCC" styleClass="p5" /> <apex:outputlink value="javascript: openPopup('/_ui/core/email/author/EmailCCBccLookup?id={!opptyId}', 'CCBCCLookup', 420, 490, 'width=420,height=490,toolbar=no,status=no,directories=no,menubar=no,resizable=yes,scrollable=no', true);" id="p5_lkwgt" onclick="setLastMousePosition(event)" title="BCC Lookup (New Window)"> <img src="/s.gif" alt="BCC Lookup (New Window)" class="lookupIcon" onblur="this.className = 'lookupIcon';" onfocus="this.className = 'lookupIconOn';" onmouseout="this.className = 'lookupIcon';this.className = 'lookupIcon';" onmouseover="this.className = 'lookupIconOn';this.className = 'lookupIconOn';" title="BCC Lookup (New Window)" /> </apex:outputlink> </apex:pageBlockSectionItem> </apex:pageBlockSectionItem> <apex:pageblockSectionItem > <apex:outputLabel value="Subject" styleClass="bld"/> <apex:outputpanel layout="block" styleClass="requiredInput"> <apex:outputpanel layout="block" styleClass="requiredBlock"/> <apex:inputText value="{!subject}" maxlength="100" size="70"/> </apex:outputpanel> </apex:pageblockSectionItem> <apex:pageblockSectionItem > <apex:outputLabel value="Message" styleClass="bld"/> <apex:inputTextArea value="{!message}" rows="15" cols="93" richText="false"/> </apex:pageblockSectionItem> </apex:pageblockSection> <div id="test" style="width: 500px; margin: 20px 0 0 19%;"> <select id="attS" name="attS" style="width: 400px;"> <apex:repeat value="{!attachments}" var="att" id="theRepeat"> <option value="{!att.Id}##{!att.BodyLength}">{!att.Name}</option> </apex:repeat> </select> <input value="Attach File" class="btn" id="attachFile" name="attachFile" onclick="attachPhxAttachment(event)" type="button" /> <div style="margin: 10px 0 0 0;"> <input style="display:none;" value="Attach File" class="btn" title="Attach File (New Window)" id="attach" name="attach" onclick="openDocumentUpload(event)" type="button" /> </div> </div> </apex:pageblock> <div class="bRelatedList"> <!-- Begin ListElement --> <!-- motif: Home --> <!-- WrappingClass --> <div class="listRelatedObject homeBlock"> <div class="bPageBlock brandSecondaryBrd secondaryPalette"> <div class="pbHeader"> <table border="0" cellpadding="0" cellspacing="0"><tbody> <tr> <td class="pbTitle"> <img src="/s.gif" alt="" width="12" height="1" class="minWidth" title="" style="margin-right: 0.25em;margin-right: 0.25em;margin-right: 0.25em;margin-right: 0.25em;margin-right: 0.25em;" /> <h3>Attachments</h3> </td> <td class="pbButton"> <input value="Attach File" class="btn" name="attach" onclick="openDocumentUpload(event)" title="Attach File (New Window)" type="button" /> </td> <td class="pbHelp"> </td> </tr> </tbody> </table> </div> <div class="pbBody attDvBlock"> <table class="list" border="0" cellspacing="0" cellpadding="0"> <tbody id="fileStr"> <tr class="headerRow"> <th class="actionColumn" scope="col">Action</th> <th scope="col" class=" zen-deemphasize">File</th> <th scope="col" class=" zen-deemphasize">Size</th> </tr> </tbody> </table> </div> <div class="pbFooter secondaryPalette"> <div class="bg"></div> </div> </div> </div> <div class="listElementBottomNav"></div> <!-- End ListElement --> </div> <div class="hiddenDv" style="display:none !important;"> <table class="list" border="0" cellspacing="0" cellpadding="0"> <tbody> <apex:repeat value="{!attachments}" var="att2" id="trFileRepeat"> <tr id="tr_{!att2.Id}" class="dataRow even last first highlight" onblur="if (window.hiOff){hiOff(this);}" onfocus="if (window.hiOn){hiOn(this);}" onmouseout="if (window.hiOff){hiOff(this);}" onmouseover="if (window.hiOn){hiOn(this);}"> <td class="actionColumn"> <a href="javascript:;" class="actionLink" onclick="deletePhxAttachment(event)">Del</a> </td> <th scope="row" class=" dataCell "> <a href="/servlet/servlet.FileDownload?file={!att2.Id}" target="_TOP">{!att2.Name}</a> <input type="hidden" value="{!att2.Id}" class="hiddenAttIds" /> </th> <td class=" dataCell ">{!att2.BodyLength} bytes</td> </tr> </apex:repeat> </tbody> </table> </div> <apex:inputText value="{!attachmentIds}" styleClass="attIds" style="" /> </apex:form> </apex:page> Apex controller: public class EmailOpportunityAttachment{ public String to {get;set;} public String additionalTo {get;set;} public String relatedTo {get;set;} public String cc {get;set;} public String bcc {get;set;} public String ffrom {get;set;} public String message {get;set;} public String subject {get;set;} public String errorMsg{get;set;} public String successMsg{get;set;} public List<String> addresses {get;set;} public String opptyId {get;set;} public String accountId {get;set;} public String attachmentIds {get;set;} public boolean flagToSendMail; private static final String DEL = ';'; public EmailOpportunityAttachment(){ this.opptyId = ApexPages.currentPage().getParameters().get('opptyId'); this.accountId = ApexPages.currentPage().getParameters().get('accountId'); } public List<SelectOption> contacts { get { List<SelectOption> contacts = new List<SelectOption>(); List<Contact> cnts = [select Id, Name, Email from Contact where Account.Id =: this.accountid]; for (Contact cnt: cnts) { contacts.add(new SelectOption(cnt.Id, '"' + cnt.Name + '" <' + cnt.Email + '>')); } return contacts; } set; } public Attachment[] getAttachments(){ return [select id, Name, BodyLength, Body from Attachment where parent.id =: this.opptyId]; } public List<Attachment> getAttachmentsByIds(final String[] ids){ String sql = ' select Id, Name, Body, ContentType from Attachment where Name=\'DDDDDDDDDDDDDD\' '; boolean found = false; if(null != ids && ids.size() > 0){ for(String id: ids){ sql += ' OR Id='; sql += '\''; sql += id; sql += '\''; } found = true; } //System.debug(sql); return found ? (List<Attachment>)Database.query(sql) : null; } public String getEmailByUserName(final String userName){ return [select Email from Contact where Name =: userName limit 1].Email; } public PageReference sendEmail() { PageReference pageRef = new PageReference('/'+this.opptyId); if(subject == '' || message == ''){ errorMsg = 'Please enter subject and message.'; return null; } if(to != '' || additionalTo != '' || cc != '' || bcc != ''){ List<String> toAddresses = new List<String>(); List<String> ccAddresses = new List<String>(); List<String> bccAddresses = new List<String>(); List<String> tmpAddr = new List<String>(); if(additionalTo.contains(DEL)){ toAddresses = additionalTo.split(DEL); for(String tmp:toAddresses){ tmpAddr.add(tmp); } }else if(additionalTo != '') { toAddresses.add(additionalTo); tmpAddr.add(additionalTo); } if(to != ''){ final String emailAddr = getEmailByUserName(to); toAddresses.add(emailAddr); tmpAddr.add(emailAddr); } if(cc.contains(DEL)){ ccAddresses = cc.split(DEL); for(String tmp:ccAddresses){ tmpAddr.add(tmp); } }else if(cc != ''){ ccAddresses.add(cc); tmpAddr.add(cc); } if(bcc.contains(DEL)){ bccAddresses = bcc.split(DEL); for(String tmp:bccAddresses){ tmpAddr.add(tmp); } }else if(bcc != ''){ bccAddresses.add(bcc); tmpAddr.add(bcc); } /* Checking whether mail ids are valid */ addresses = tmpAddr; for(String tempStr:addresses){ if(!Pattern.matches('[a-zA-Z0-9._-]+@[a-zA-Z]+.[a-zA-Z]{2,4}', tempStr)){ errorMsg = 'Check To, CC and BCC addresses'; successMsg = ''; flagToSendMail = false; break; }else{ flagToSendMail = true; } } /* Sending Mail */ if(flagToSendMail == true){ Messaging.SingleEmailMessage email = new Messaging.SingleEmailMessage(); if(toAddresses != null){ email.setToAddresses(toAddresses); } if(ccAddresses != null){ email.setccAddresses(ccAddresses); } if(bccAddresses != null){ email.setbccAddresses(bccAddresses); } email.setSubject(subject); email.setHtmlBody(message); List<Messaging.EmailFileAttachment> attachs = null; if('' != attachmentIds){ final String[] attachIds = attachmentIds.split(DEL); if(null != attachIds && attachIds.size() > 0){ final List<Attachment> attechments = getAttachmentsByIds(attachIds); if(null != attechments && attechments.size() > 0){ attachs = new List<Messaging.EmailFileAttachment>(); Messaging.EmailFileAttachment attach = null; for(Attachment att: attechments){ attach = new Messaging.EmailFileAttachment(); attach.setContentType(att.contentType); attach.setFileName(att.Name); attach.setInline(false); attach.setBody(att.Body); attachs.add(attach); attach = null; } } } } if(null != attachs && attachs.size() > 0){ email.setFileAttachments(attachs); } Messaging.sendEmail(new Messaging.SingleEmailMessage[]{email}); errorMsg = ''; successMsg = 'Mail sent successfully to following recipients'; return pageRef; }else{ return null; } }else{ errorMsg = 'Please enter To or CC or BCC address'; return null; } } }