Showing posts with label Email. Show all posts
Showing posts with label Email. Show all posts

Monday, July 11, 2022

Get Email information of current user/worker using x++ in D365FO

 Get Email information of current user/worker using x++ in D365FO.


    private Email getToEmail()
    {
        HcmWorker          hcmWorker;
        // Get information of current user/worker

        select firstOnly RecId, Person from hcmWorker
            where hcmWorker.RecId == HcmWorkerLookup::currentWorker();
                   
        return hcmWorker.email();
    }


Keep Daxing!!



Monday, May 23, 2022

Create excel file and send through email in d365FO

 Hi guys, today we see how to generate excel file and send that file through email using x++ in D365FO.


using System.IO; using OfficeOpenXml; using OfficeOpenXml.Style; using OfficeOpenXml.Table; class SendEmailProcessSevice extends SysOperationServiceBase { Filename fileName; SysEmailSystemTable sysEmailTable; SysEmailMessagesystemTable messageTable; // sending Email with attachment private void sendEmail(System.IO.MemoryStream attachmentStream) { if (attachmentStream != null) { var user = xUserInfo::find(); Map sysMailers = SysMailerFactory::getMailers(); sysEmailTable = SysEmailSystemTable::find('TestEmail'); select firstonly messageTable where messageTable.EmailId == sysEmailTable.EmailId; str s = date2Str(today(), 321, DateDay::Digits2, DateSeparator::Hyphen, // separator1 DateMonth::Digits2, DateSeparator::Hyphen, // separator2 DateYear::Digits4 ); messageBuilder.setSubject(messageTable.Subject + '-' + s); messageBuilder.setBody(messageTable.Mail); messageBuilder.setFrom(sysEmailTable.SenderAddr); var message = messageBuilder.getMessage(); messageBuilder.addAttachment(attachmentStream,fileName); SysIMailer mailer = sysMailers.lookup('SMTP'); SysMailerSMTP smtp = new SysMailerSMTP(); if (mailer is SysIMailerNonInteractive) { SysIMailerNonInteractive nonInteractiveMailer = mailer; messageSent = nonInteractiveMailer.sendNonInteractive(message); } else if (mailer is SysIMailerInteractive) { SysIMailerInteractive interactiveMailer = mailer; messageSent = interactiveMailer.sendInteractive(message);// messageBuilder.getMessage(); } } else { warning("File is empty."); } } // creating excel file public void fileCreation(MyContract contract) { Query query = new Query(); MemoryStream memoryStream = new MemoryStream(); QueryRun qr; RowNumber row = 1; query.addDataSource(tablenum(Mytable)).addRange(fieldnum(Mytable, Feild1)).value(queryValue(contract.parmtype))); using (var package = new ExcelPackage(memoryStream)) { var worksheets = package.get_Workbook().get_Worksheets(); var worksheet = worksheets.Add('Test Records'); var cells = worksheet.get_Cells(); OfficeOpenXml.ExcelRange cell = cells.get_Item(row, 1); cell.set_Value('Field1'); cell = cells.get_Item(row,2); cell.set_Value('Field2'); cell = cells.get_Item(row,3); cell.set_Value('Field3'); qr = new QueryRun(query); while (qr.next()) { Mytable = qr.get(tableNum(Mytable)); row++; cell = null; cell = cells.get_item(row, 1); cell.set_Value(Mytable.Field1); cell = cells.get_item(row, 2); cell.set_Value(Mytable.Field2); cell = cells.get_item(row, 3); cell.set_Value(Mytable.Field3); } package.save(); file::SendFileToUser(memoryStream,fileName); memoryStream.Seek(0, System.IO.SeekOrigin::Begin); this.sendEmail(memoryStream); } } }


Keep Daxing !!

How to send an email in D365FO using x++

 In D365FO requirements most of them need to send  the email. So for that we can have multiple ways. Please check the below code.


Simple Way:

public void sendEmail() { var builder = new SysMailerMessageBuilder(); builder.addTo("To email"); builder.setFrom("sender email"); builder.setSubject("Subject"); builder.setBody("Body"); var message = builder.getMessage(); SysMailerFactory::getNonInteractiveMailer().sendNonInteractive(message); }


With template:

public void sendEmail() { SysEmailTable sysEmailTable = SysEmailTable::find('TestEmail');//Get from template. SysEmailMessageTable sysEmailMessageTable = SysEmailMessageTable::find(
                            sysEmailTable.EmailId, sysEmailTable.DefaultLanguage); var messageBuilder = new SysMailerMessageBuilder(); messageBuilder.addTo("To email"); messageBuilder.setFrom(sysEmailTable.SenderAddr);//, sysEmailTable.SenderName); messageBuilder.setSubject(sysEmailMessageTable.Subject); messageBuilder.setBody(sysEmailMessageTable.Mail); var message = builder.getMessage(); //SysMailerFactory::getNonInteractiveMailer().sendNonInteractive(message); SysIMailer mailer = sysMailers.lookup('SMTP'); if (mailer is SysIMailerNonInteractive) { SysIMailerNonInteractive nonInteractiveMailer = mailer; nonInteractiveMailer.sendNonInteractive(messageBuilder.getMessage()); } else if (mailer is SysIMailerInteractive) { SysIMailerInteractive interactiveMailer = mailer; interactiveMailer.sendInteractive(messageBuilder.getMessage()); } }

--------------------send mail to multiple users-------------

private void sendEmail() { SysEmailSystemTable sysEmailTable; SysEmailMessagesystemTable emailMessageTable; var user = xUserInfo::find(); Map sysMailers = SysMailerFactory::getMailers(); container conCCEmails, conToEmails; MyTable myTable; sysEmailTable = SysEmailSystemTable::find('TestEmail');//Get from template. select firstonly emailMessageTable where emailMessageTable.EmailId == sysEmailTable.EmailId; //emailMessageTable = SysEmailMessageTable::find(sysEmailTable.EmailId, // sysEmailTable.DefaultLanguage); select * from myTable; conCCEmails = str2con(myTable.CCEmailFR,';');// adding emails in CC; ConToEmails = str2con(myTable.ToEmail,';');// To emails. var messageBuilder = new SysMailerMessageBuilder(); for (int i=1; i<=conLen(conCCEmails); i++) { messageBuilder.addCc(conPeek(conCCEmails, i)); } for (int i=1; i<=conLen(ConToEmails); i++) { messageBuilder.addTo(conPeek(ConToEmails, i)); } str curDate = date2Str(today(), 321, DateDay::Digits2, DateSeparator::Hyphen, DateMonth::Digits2, DateSeparator::Hyphen, DateYear::Digits4 ); // We can use below one also /*var messageBuilder = new SysMailerMessageBuilder(); messageBuilder.addTo(myTable.ToEmail) .setSubject(emailMessageTable.Subject) .setBody(emailMessageTable.Mail);*/ //get subject from template messageBuilder.setSubject(emailMessageTable.Subject + '-' + curDate); messageBuilder.setBody(emailMessageTable.Mail);//get body from template messageBuilder.setFrom(sysEmailTable.SenderAddr);// Sender email var message = messageBuilder.getMessage(); messageBuilder.addAttachment(attachmentStream,fileName);//Attach file // We can use below one also //SysMailerFactory::getNonInteractiveMailer().sendNonInteractive(message); SysIMailer mailer; SysMailerSMTP smtp = new SysMailerSMTP(); mailer = sysMailers.lookup('SMTP'); if (mailer is SysIMailerNonInteractive) { SysIMailerNonInteractive nonInteractiveMailer = mailer; nonInteractiveMailer.sendNonInteractive(messageBuilder.getMessage()); } else if (mailer is SysIMailerInteractive) { SysIMailerInteractive interactiveMailer = mailer; interactiveMailer.sendInteractive(messageBuilder.getMessage()); } }

Using Email processing table:


public void sendEmail() { SysEmailTable sysEmailTable = SysEmailTable::find('TestEmail'); SysEmailMessageTable sysEmailMessageTable; SysOutgoingEmailTable sysoutgoingEmailTable; //SysOutgoingEmailData outgoingEmailData; sysEmailMessageTable = SysEmailMessageTable::find(sysEmailTable.EmailId, sysEmailTable.DefaultLanguage); sysoutgoingEmailTable.EmailItemId = EventInbox::nextEventId(); sysoutgoingEmailTable.TemplateId = sysEmailTable.EmailId; sysoutgoingEmailTable.Sender = sysEmailTable.SenderAddr; sysoutgoingEmailTable.SenderName = sysEmailTable.SenderName; sysoutgoingEmailTable.Recipient = 'receiver@test.com'; sysoutgoingEmailTable.Subject = sysEmailMessageTable.Subject; sysoutgoingEmailTable.Message = sysEmailMessageTable.Mail; sysoutgoingEmailTable.Priority = sysEmailTable.Priority; sysoutgoingEmailTable.WithRetries = true; sysoutgoingEmailTable.RetryNum = 0; sysoutgoingEmailTable.UserId = curuserid(); sysoutgoingEmailTable.Status = SysEmailStatus::Unsent; sysoutgoingEmailTable.LatestStatusChangeDateTime = DateTimeUtil::getSystemDateTime(); sysoutgoingEmailTable.insert(); }

Need to run below job.

System administration>Periodic tasks>Email processing>Email distributor batch.

With placeholder:

public void sendEmail() { SysEmailTable sysEmailTable = SysEmailTable::find('TestEmail'); SysEmailMessageTable sysEmailMessageTable = SysEmailMessageTable::find(sysEmailTable.EmailId, sysEmailTable.DefaultLanguage); Map placeholder = new Map(Types::String, Types::String); placeholder.insert("Name", sysEmailTable.SenderName); placeholder.insert("Date", strFmt("%1", DateTimeUtil::getSystemDateTime())); str body = SysEmailMessage::stringExpand(sysEmailMessageTable.Mail, placeholder); str subject = SysEmailMessage::stringExpand(sysEmailMessageTable.Subject, placeholder); var builder = new SysMailerMessageBuilder(); builder.addTo("receiver@test.com"); builder.setFrom(sysEmailTable.SenderAddr);

builder.setSubject(subject); builder.setBody(body); var message = builder.getMessage(); SysMailerFactory::getNonInteractiveMailer().sendNonInteractive(message); }


Keep daxing!!

Wednesday, February 16, 2022

Get email, phone, fax from worker/contact person in D365fo

 Hi guys, Today we see how to get an email, phone, fax from a worker/contact person in D365FO using x++.

In this post, I am using standard table methods to get the details. This will get primary details.

Email:

    public display Email email() { if(this.Worker) { return HcmWorker::findByPersonnelNumber(this.Worker).email(); } else if(this.ContactPersonId) { return ContactPerson::find(this.ContactPersonId).email(); } return nullValueFromType(Types::String); }

Fax: public display TeleFax fax() { if(this.Worker) { return DirParty::primaryElectronicAddress(                                              HcmWorker::findByPersonnelNumber(this.Worker).Person, LogisticsElectronicAddressMethodType::Fax).Locator;

} else if(this.ContactPersonId) { return DirParty::primaryElectronicAddress(                                                                           ContactPerson::find(this.ContactPersonId).Party, LogisticsElectronicAddressMethodType::Fax).Locator;

} return nullValueFromType(Types::String); }

Phone: display Phone phone() { if(this.Worker) { return HcmWorker::findByPersonnelNumber(this.Worker).phone(); } else if(this.ContactPersonId) { return ContactPerson::find(this.ContactPersonId).phone(); } return nullValueFromType(Types::String); }


Keep Daxing!!

Monday, May 17, 2021

Send Email from D365FO using X++

Send Email from D365FO using X++.


    /// <summary>

    /// SenMail alert

    /// </summary>

    /// <param name = "_emailTo">To email id</param>

    /// <param name = "_Subject">email subject line</param>

    /// <param name = "_body">email body text</param>

    public void SendEmail(Description _emailTo, Description _Subject, ErErrorDescription _body)

    {

        SysMailerSMTP   mailer = new SysMailerSMTP();

        SysMailerMessageBuilder builder = new SysMailerMessageBuilder();

        SysEmailParameters parameters = SysEmailParameters::find();

        ;

        //you will have to setup the below parameters in sysadmin module

        if (parameters.SMTPRelayServerName)

        {

            mailer.SMTPRelayServer(parameters.SMTPRelayServerName,

                parameters.SMTPPortNumber,

                parameters.SMTPUserName,

                SysEmailParameters::password(),

                parameters.SMTPUseNTLM);

        }

        else

        {

            warning("SERVER NOT FOUND");

        }



        builder.setFrom(SysEmailParameters::find().SMTPUserName);

        builder.addTo(_emailTo);

        builder.setSubject(_Subject);

        builder.setBody(_body);

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


    }