I can send email with customer statement pdf with no customer statement content. However, the content does exist by manually with the same parameters. The code is shown as below.
class AutoSendEmailInvoiceStatement extends RunBaseBatch { public void run() { SysMailerMessageBuilder mailer = new SysMailerMessageBuilder(); SysMailerSMTP smtp = new SysMailerSMTP(); str subject, contents, cc; SysEmailParameters SysEmailParameters = SysEmailParameters::find(); CustTable custTable = CustTable::find("US-001"); str custEmail = custTable.InvoiceEmailAddress; CustAccountStatementExtContract contract = new CustAccountStatementExtContract(); CustAccountStatementExtTmp custAccountStatementExtTmp; try { if(custEmail) { mailer = new SysMailerMessageBuilder(); mailer.setSubject("test d365 email"); mailer.setFrom(SysEmailParameters.SMTPUserName); mailer.setBody(strReplace(CustParameters::find().ARStatementEmailBody, "\n", "
")); //mailer.addCc(UserInfo.networkAlias); mailer.addTo(custEmail); CustAccountStatementExtController controller = new CustAccountStatementExtController(); SRSPrintDestinationSettings settings; Filename fileName; SRSProxy srsProxy; SRSReportRunService srsReportRunService = new SrsReportRunService(); Microsoft.Dynamics.AX.Framework.Reporting.Shared.ReportingService.ParameterValue[] parameterValueArray; Map reportParametersMap; SRSReportExecutionInfo executionInfo = new SRSReportExecutionInfo(); System.Byte[] reportBytes = new System.Byte[0](); controller.parmReportName(ssrsReportStr(CustAccountStatementExt, Report)); fileName = "CustAccountStatementExt.pdf"; controller.parmShowDialog(false); controller.parmLoadFromSysLastValue(false); // Provide printer settings settings = controller.parmReportContract().parmPrintSettings(); settings.printMediumType(SRSPrintMediumType::File); settings.fileName(fileName); settings.fileFormat(SRSReportFileFormat::PDF); // Rendering the report controller.parmReportContract().parmReportServerConfig(SRSConfiguration::getDefaultServerConfiguration()); controller.parmReportContract().parmReportExecutionInfo(executionInfo); //set parameters contract.parmFromDate(mkdate(1, mthofyr(today()), year(today()))); contract.parmToDate(today()); contract.parmOnlyOpen(true); contract.parmIncludeReversed(false); contract.parmPrintNonZero(true); contract.parmPrintPaymentSchedule(false); contract.parmPrintCreditLimit(true); contract.parmShowDNCN(custTable.ARStatementPrintDNCN); contract.parmShowNegative(custTable.ARStatementPrintNegative); contract.parmPrintAging(true); contract.parmAgingPeriod(true); contract.parmAgingBucket(CustParameters::find().ARStatementStatRepInterval); contract.parmAgingBucketPrintDescription(true); contract.parmCustAccount("US-001"); contract.parmCustAccountStatementExtTmp(custAccountStatementExtTmp.getPhysicalTableName()); controller.parmReportContract().parmRdlContract().parmLanguageId("en-us"); controller.parmReportContract().parmRdlContract().parmLabelLanguageId("en-us"); controller.parmReportContract().parmRdpContract(Contract); srsReportRunService.getReportDataContract(controller.parmReportContract().parmReportName()); // TODO srsReportRunService.preRunReport(controller.parmReportContract()); reportParametersMap = srsReportRunService.createParamMapFromContract(controller.parmReportContract()); parameterValueArray = SrsReportRunUtil::getParameterValueArray(reportParametersMap); srsProxy = SRSProxy::constructWithConfiguration(controller.parmReportContract().parmReportServerConfig()); // Actual rendering to byte array reportBytes = srsproxy.renderReportToByteArray(controller.parmReportContract().parmReportPath(), parameterValueArray,settings.fileFormat(), settings.deviceinfo()); if (reportBytes) { System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(reportBytes); mailer.addAttachment(memoryStream, fileName, "application/pdf"); } smtp.sendNonInteractive(mailer.getMessage()); } else { warning("No customer email"); } } catch(Exception::CLRError) { SysUserInfo SysUserInfo; str warningMsd; System.Exception netExcepn; netExcepn = CLRInterop::getLastException(); warningMsd = strFmt("Fail to send email %1. ") netExcepn.ToString(); warning(warningMsd); } } public static void main(Args _args) { AutoSendEmailInvoiceStatement instance; ; instance = new AutoSendEmailInvoiceStatement(); if (instance.prompt()) instance.run(); } }