This is resolved with @klincecum 's input, however I had to make it work since it was not quite working.
First I added these references:

Then I added these Assemblies:

The last 2 are not required, I forgot to remove them since I used a different method to send the email.
And this is the code:
//using Erp.Tablesets;
//using Newtonsoft.Json;
//ref: Assembly -> Newtonsoft.Json
//ref: Libraries -> EmailLibrary
//ref: Services -> ERP.Rpt.SalesOrderAck
//ref: Tables -> ICE.SysRptLst (Read Only)
//ref: Tables -> ICE.SysTask (Read Only)
string company = "";
int custnum = 0;
int btcustnum = 0;
int shiptocustnum = 0;
string shiptonum = "";
string billto = "";
string soldto = "";
string shipto = "";
int ordernum = 0;
int ponum = 0;
string shipviacomment = "";
Func<int, byte[]> GetASalesOrderPDF = (poNum) =>
{
byte[] reportPDF = null;
// Correct service call usage
var serviceAgent = Ice.Assemblies.ServiceRenderer.GetService<Erp.Contracts.POFormSvcContract>(Db);
string taskNote = Guid.NewGuid().ToString(); // Unique identifier for this task
var poAckTS = serviceAgent.GetNewParameters();
var paramRow = poAckTS.POFormParam.First();
paramRow.PONum = poNum;
paramRow.AgentID = "SystemTaskAgent";
paramRow.AutoAction = "SSRSGENERATE";
paramRow.ReportStyleNum = 1006;
paramRow.TaskNote = taskNote;
// Execute the service operation
serviceAgent.RunDirect(poAckTS);
// Fetch the report data
reportPDF = (from sysRpt in Db.SysRptLst
join sysTask in Db.SysTask on
new { sysRpt.Company, sysRpt.SysTaskNum } equals
new { sysTask.Company, sysTask.SysTaskNum }
where sysTask.TaskNote == taskNote
select sysRpt.RptData).FirstOrDefault();
return reportPDF;
};
foreach(var poheaderrow in ttPOHeader){
company = poheaderrow.Company;
ponum= poheaderrow.PONum;
}
foreach (var PORelRow in (from PORel_Row in Db.PORel
where PORel_Row.Company == company && PORel_Row.PONum == ponum
select PORel_Row))
{
ordernum = PORelRow.BTOOrderNum;
}
foreach (var OrderHedRow in (from OrderHed_Row in Db.OrderHed
where OrderHed_Row.Company == company && OrderHed_Row.OrderNum == ordernum
select OrderHed_Row))
{
custnum = OrderHedRow.CustNum;
btcustnum = OrderHedRow.BTCustNum;
shiptocustnum = OrderHedRow.ShipToCustNum;
shiptonum = OrderHedRow.ShipToNum;
shipviacomment = OrderHedRow["DefaultShipViaComment_c"].ToString();
}
foreach (var CustomerRow in (from Customer_Row in Db.Customer
where Customer_Row.Company == company && Customer_Row.CustNum == custnum
select Customer_Row))
{
soldto = CustomerRow.Name;
}
foreach (var CustomerRow in (from Customer_Row in Db.Customer
where Customer_Row.Company == company && Customer_Row.CustNum == btcustnum
select Customer_Row))
{
billto = CustomerRow.Name;
}
foreach (var ShipToRow in (from ShipTo_Row in Db.ShipTo
where ShipTo_Row.Company == company && ShipTo_Row.CustNum == shiptocustnum && ShipTo_Row.ShipToNum == shiptonum
select ShipTo_Row))
{
shipto = ShipToRow.Name;
}
try{
Dictionary<string, byte[]> dicReports = new Dictionary<string, byte[]>();
int salesOrder1 = ponum;
//int salesOrder2 = 26680;
dicReports.Add($"Report_{salesOrder1}.pdf", GetASalesOrderPDF(salesOrder1));
//dicReports.Add($"Report_{salesOrder2}.pdf", GetASalesOrderPDF(salesOrder2));
string jsonDicReports = JsonConvert.SerializeObject(dicReports);
//this.EfxLib.EmailLibrary.Email(fromEmail, toEmail, "Test 2 Report Attachments", "Hello, here are two reports", jsonDicReports, false, false, "", "", "", "", "");
string body = "Please accept this PO for parts purchase.<br><br><br>"+ "Sold To:"+soldto+"<br>"+"Bill To To:"+billto+"<br>"+"Ship To:"+shipto+"<br>"+"<br>" +"ShipVia Default Comment:"+shipviacomment+"<br><br>" +"Please add sales@ABC.com to UPS Tracking<br>"+"Please add to Reference Number 3:"+ponum.ToString()+"<br>"+"Please add to Reference Number 4:"+ordernum+"<br>";
string subject = "Part Order Approved" ;
//var mailer = this.GetMailer(async: true);
//var message = new Ice.Mail.SmtpMail();
var mailer = this.GetMailer(async: true);
var message = new Ice.Mail.SmtpMail();
message.SetFrom("epicor@ABC.com");
message.SetTo(body);
message.SetTo("shizar@ABC.com;");
message.SetCC("shizar@ABC.com;");
//message.SetBcc()
//message.SetBody("Test");
message.SetBody(body);
message.SetSubject(subject);
message.IsBodyHtml = true;
mailer.Send(message,dicReports);
}
catch(Exception e)
{
string body = e.ToString();
this.PublishInfoMessage(body, Ice.Common.BusinessObjectMessageType.Information, Ice.Bpm.InfoMessageDisplayMode.Individual, "FirstVar","SecondVar");
}
I also caught the trigger on Pre and transferred it to Post (should be Method Directive, Update) and this code is in Post.
