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!!
No comments:
Post a Comment