D365/AX7: Attach Report PDF & Send Email using X++/Code

Requirement

Send Email Through X++/Code in D365/AX7

Prerequisites

  1. A valid SMTP mail server
  2. A valid SMTP port number
  3. A valid user name & password

Steps

  1. Go to  System administration – Setup – Email – Email Parameters. Configure the SMTP settings as per below screens.

Untitled.png

Untitled.png

2. Sample Code

Filename fileName = "AbcTest.pdf";
SrsReportRunController controller = new SrsReportRunController();
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();
;

controller.parmReportName(ssrsReportStr(VendBaseData, Report));
controller.parmShowDialog(false);
controller.parmLoadFromSysLastValue(false);
// 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);
}

var messageBuilder = new SysMailerMessageBuilder();
messageBuilder.addTo('myemail@email.com')
.setSubject("Fun")
.setBody("Fun");
messageBuilder.setFrom('noreply@yourdomain.in');
if (stream1 != null)
{
messageBuilder.addAttachment(
stream1,
'abcd.pdf');
}

SysMailerFactory::getNonInteractiveMailer().sendNonInteractive(messageBuilder.getMessage());





Leave a Reply