2

誰かがこれを行うことができた場所を読みましたが、それを機能させるのに苦労しています。

基本的に、CSV を作成して受信者に電子メールで送信するコントローラーを持つページへの HTTP コールアウトをスケジュールしています。

予定クラス:

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 コールアウトを実行します: リクエストと共に 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 } );        
    }

}

...何か案は?デバッグ ログはすべて正常であることを示していますが、何も受信されていません。私はこれがコードの壁であることを知っていますが、タスクを達成するために人々が推奨しているようです.

4

1 に答える 1

1

ここに明らかに欠けているものは見当たりません:/

安全のために- getEmailReportOutputgetmailReportOutput同じクラスですか(実際のコードではなく、投稿のタイプミス)?

これは多くのホップをジャンプしているように見えますが、スケジュールされたクラス->RESTコールアウト->アクション付きのVFページ->@future->電子メールを送信することを正しく読んでいますか?ねえ、ここでは多くの問題が発生する可能性があります;)SFが何らかの参照カウンターを保持し、同じインスタンスを呼び出すとpage.getContent...を使用できなくなる可能性があることをどこかで読みました。

レポート本文が見えますSystem.debug(report.getContent().toString());か?このメールを自分のユーザーのタスクとして、またはサンプルアカウント(たとえば(setSaveAsActivity()))で保存してみてください。

露骨なプラグと同じように-私は同様の要件を解決するために異なるパスを使用しました。https://salesforce.stackexchange.com/questions/4303/scheduled-reports-as-attachmentをチェックして、動作させることができるかどうかを確認してください。

于 2013-01-31T00:01:03.453 に答える