Scenario: Send email thru X++ code with the report as attachment
Below is the code responsible for sending email thru code with the attachment
Guide lines to use below code
Just copy paste the code in the runnable class(job), perform below steps
Just replace the report contract name and paramters values
add send from and to email addresses,
Code:
//Set variables
Filename fileName = “attFileName.pdf”;
SrsReportRunController controller = new SrsReportRunController();
ReportContract contract = new ReportContract();
SRSPrintDestinationSettings settings;
Array arrayFiles;
System.Byte[] reportBytes = new System.Byte[0]();
SRSProxy srsProxy;
SRSReportRunService srsReportRunService = new SrsReportRunService();
Microsoft.Dynamics.AX.Framework.Reporting.Shared.ReportingService.ParameterValue[] parameterValueArray;
Map reportParametersMap;
SRSReportExecutionInfo executionInfo = new SRSReportExecutionInfo();
//set the report contract parameters
contract.parm1stParameter(“firstParameter value”);
contract.parm2ndtParameter(‘2ndParamter value’);
//3rd paramter
//4th paramter
//set the report controller paramters
controller.parmArgs(_args);
//set report name and desing name
controller.parmReportName(ssrsReportStr(ReportName, NewDesign));
controller.parmShowDialog(false);
controller.parmLoadFromSysLastValue(false);
controller.parmReportContract().parmRdpContract(contract);
// Provide printer settings
settings = controller.parmReportContract().parmPrintSettings();
settings.printMediumType(SRSPrintMediumType::File);
settings.fileName(fileName);
settings.fileFormat(SRSReportFileFormat::PDF);
// Below is a part of code responsible for rendering the report
controller.parmReportContract().parmReportServerConfig(SRSConfiguration::getDefaultServerConfiguration());
controller.parmReportContract().parmReportExecutionInfo(executionInfo);
srsReportRunService.getReportDataContract(controller.parmreportcontract().parmReportName());
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());
// You can also convert the report Bytes into an xpp BinData object if needed
container binData;
Binary binaryData;
System.IO.MemoryStream mstream = new System.IO.MemoryStream(reportBytes);
binaryData = Binary::constructFromMemoryStream(mstream);
if(binaryData)
{
binData = binaryData.getContainer();
}
System.Byte[] binData1;
System.IO.Stream stream1;
// Turn the Bytes into a stream
for(int i = 0; i < conLen(binData); i++)
{
binData1 = conPeek(binData,i+1);
stream1 = new System.IO.MemoryStream(binData1);
}
//email sending settings
var mail = SysMailerFactory::getNonInteractiveMailer();
var messageBuilder = new SysMailerMessageBuilder();
messageBuilder.reset()
.setFrom(‘example@Email.com’) // From email address
.addTo(‘example@email.com’) // To Email address
.setSubject(‘Email Subject’) // Email Subject
.setBody(‘Email Body’); //Email Body
if (stream1 != null)
{
//add attachment to the email
messageBuilder.addAttachment(stream1,filename+”.pdf”);
}
//send email
mail.sendNonInteractive(messageBuilder.getMessage());
}
Like this:
Like Loading...