AX 2012: Mailversand mit Attachements

In Dynamics AX 2012 gibt es - wie auch schon in früheren Versionen - mehrere Möglichkeiten E-Mails zu versenden.
Eine recht komfortable und bekannte Möglichkeit bietet die Tabelle SysOutgoingEmailTable und die dazugehörige Klasse SysEmailDistributor. Diese Tabelle ist über den Client unter Systemverwaltung > Periodisch > E-Mail-Verarbeitung > E-Mail-Sendestatus einsehbar.

Screenshot

Die Verarbeitung dieser Datensätze wird unter  Systemverwaltung > Periodisch > E-Mail-Verarbeitung > Stapel initiert und setzt voraus, daß die E-Mail-Parameter unter Systemverwaltung > Einstellungen > System entsprechend gepflegt sind.

Weniger bekannt ist, daß es über dieses Framework auch möglich ist, Mails mit Attachements zu verschicken. Dazu muss eine weitere Tabelle namens SysOutgoingEmailData entsprechend befüllt werden.

Im folgenden nun ein kurzer Job, der demonstriert, wie diese Tabellen per Code befüllt werden. 

static void SendMailWithAttachementUsingEmailTable(Args _args)
{
    SysOutgoingEmailTable   SysOutgoingEmailTable;   
    SysOutgoingEmailData    SysOutgoingEmailData;
    SysEmailItemId          nextEmailItemId;   
    Map                     map;   
    str                     SenderName;
    str                     SenderEmail;
    str                     ToEmail;
    str                     Subject;
    str                     Body;
    fileName                attachmentFilename;
    filePath                filePath;
    filename                filename;
    filename                fileExtension;
    binData                 binData;
    container               embeddedBinaryData;
    int                     i = 1;
   
    SenderName          = "Firstname Lastname";
    SenderEmail         = "sender@domain.net";
    ToEmail             = "recipient@domain.net";
    Subject             = "Subject";
    Body                = "<B>Hello World</B>";
    attachmentFilename  = @"\\servername\c$\file.txt";   
   
    nextEmailItemId = EventInbox::nextEventId();
   
    SysOutgoingEmailTable.EmailItemId   = nextEmailItemId;
    SysOutgoingEmailTable.IsSystemEmail = NoYes::No;
    SysOutgoingEmailTable.Sender        = SenderEmail;
    SysOutgoingEmailTable.SenderName    = SenderName;
    SysOutgoingEmailTable.Recipient     = ToEmail;
    SysOutgoingEmailTable.Subject       = SysEmailMessage::stringExpand(Subject, map);
    SysOutgoingEmailTable.Priority      = eMailPriority::Normal;
    SysOutgoingEmailTable.WithRetries   = false;
    SysOutgoingEmailTable.RetryNum      = 0;
    SysOutgoingEmailTable.UserId        = curUserId();
    SysOutgoingEmailTable.Status        = SysEmailStatus::Unsent;
    SysOutgoingEmailTable.Message       = Body;
    SysOutgoingEmailTable.LatestStatusChangeDateTime = DateTimeUtil::getSystemDateTime();
    SysOutgoingEmailTable.insert();
   
    // Attachement
    if (attachmentFilename && WinAPI::fileExists(attachmentFilename))
    {
        if (WinAPI::fileSize(attachmentFilename) < (SysEmailParameters::find().maxEmailAttachmentSize * 1000000))
        {
            binData = new BinData();

            binData.loadFile(attachmentFilename);
            embeddedBinaryData = binData.getData();

            SysOutgoingEmailData.clear();
            SysOutgoingEmailData.EmailItemId    = SysOutgoingEmailTable.EmailItemId;
            SysOutgoingEmailData.DataId         = i;    // Counter for file(s)
            SysOutgoingEmailData.EmailDataType  = SysEmailDataType::Attachment;
            SysOutgoingEmailData.Data           = embeddedBinaryData;
            [filePath, filename, fileExtension] = Global::fileNameSplit(attachmentFilename);
            SysOutgoingEmailData.FileName       = filename;
            SysOutgoingEmailData.FileExtension  = fileExtension;

            SysOutgoingEmailData.insert();
        }
    }
}

Dieses Framework hat allerdings auch ein paar Nachteile. Beispielsweise kann immer nur ein Empfänger, d.h. eine Mail-Adresse angegeben werden und die Möglichkeit CCs oder BCCs anzugeben fehlt komplett.

Allerdings bietet die im Hintergrund verwendete Klasse SysMailer einige dieser Funktionen wie CCs und mehrere Mail-Empfänger. Man müsste lediglich die Tabelle SysOutgoingEmailTable um entsprechende Felder erweitern und die Methode processEmails() der Klasse SysEmailDistributor entsprechend anpassen.

Lediglich BCCs können auch durch einen solchen Eingriff in die Logik nicht ermöglicht werden.

Dieser Beitrag bezieht sich auf die Version:
Dynamics AX 2012

 
 

 

 
 
 
Beiträge des aktuellen Monats
November 2024
MoDiMiDoFrSaSo
 123
45678910
11121314151617
18192021222324
252627282930 
 
© 2006-2024 Heinz Schweda | Impressum | Kontakt | English version | Mobile Version
Diese Webseite verwendet Cookies, um Benutzern einen besseren Service anzubieten. Wenn Sie weiterhin auf der Seite bleiben, stimmen Sie der Verwendung von Cookies zu.  Mehr dazu