我读过有人能够做到这一点的地方,但我很难让它上班。
基本上,我正在为具有控制器的页面调度HTTP标注,该控制器构建CSV并将其通过电子邮件发送给收件人。
预定课程:
global class ReportExporter implements System.Schedulable {
global void execute(SchedulableContext sc) {
getmailReportOutput ex = new getmailReportOutput();
ex.exportCSV();
}
}
getEmailReportOutput类:
public class getmailReportOutput{
public Static String strSessionID;
public getmailReportOutput() {
}
public void exportCSV() {
makeReportRequest();
}
@future (callout=true)
public Static void makeReportRequest() {
strHost ='c.cs4.visual.force.com';
strSessionID = UserInfo.getSessionId();
String requestUrl = 'https://' + strHost + '/apex/TestSendReport#';
HttpRequest req = new HttpRequest();
req.setEndpoint(requestUrl);
req.setMethod('GET');
req.setHeader('Cookie','sid=' + strSessionID );
String output = new Http().send(req).getBody();
System.debug('HTTP RESPONSE RETURNED: ' + output);
}
}
getEmailReportOutput类对VF页面执行HTTP Callout:我确保发送带有请求的sessionID: 而“TestSendReport”只是对控制器的一个简单标注:
<apex:page controller="Exporter" action="{!runrpt}">
</apex:page>
...控制器正在调用报告内容:
public class Exporter {
public static Boolean isTest;
public static String strEmailAddr;
public void runrpt() {
executeRpt();
}
@future
public static void executeRpt() {
System.debug('CALLING REPORT EXPORTER...');
String ReportName__c = '00OP0000000Jp3N';
String strEmailAddr = 'myname@email.com';
ApexPages.PageReference report = new ApexPages.PageReference( '/' + RptName__c + '?csv=1');
Messaging.EmailFileAttachment attachment = new Messaging.EmailFileAttachment();
attachment.setFileName('report.csv');
attachment.setBody(report.getContent());
attachment.setContentType('text/csv');
Messaging.SingleEmailMessage message = new Messaging.SingleEmailMessage();
message.setFileAttachments(new Messaging.EmailFileAttachment[] { attachment } );
message.setSubject('Report');
message.setPlainTextBody('The report is attached.');
message.setToAddresses( new String[] { strEmailAddr } );
Messaging.sendEmail( new Messaging.SingleEmailMessage[] { message } );
}
}
......有什么想法吗?调试日志显示一切正常,但没有收到任何信息。我知道这是一堵代码墙,但它似乎是人们推荐的完成任务 - 我只是看不出任何错误。
答案 0 :(得分:1)
我在这里看不到任何明显的遗漏:/
为了安全起见 - getEmailReportOutput
&amp; getmailReportOutput
是同一个类(帖子中的拼写错误,而不是实际代码中的错误)?
这看起来像跳了很多跳,我是否正确地读了它的预定类 - &gt; REST标注 - &gt;带动作的VF页面 - &gt; @future - &gt;发送电子邮件? Geez,这里可能出错很多;)I've read somewhere that SF will keep some kind of reference counter并且调用同一个实例可能会阻止你使用page.getContent ......
您能看到报告正文System.debug(report.getContent().toString());
吗?您是否可以尝试将此电子邮件保存为您自己用户的任务或示例帐户(setSaveAsActivity()
)?
作为一个明显的插件 - 我使用了不同的路径来解决类似的要求。查看https://salesforce.stackexchange.com/questions/4303/scheduled-reports-as-attachment并查看是否可以将其投入使用?