MailQueue#

PUBLIC INTERFACE#

new()#

Create a MailQueue object. Do not use it directly, instead use:

my $MailQueueObject = $Kernel::OM->Get('Kernel::System::MailQueue');

Create()#

Create a new queue element.

my $Result = $MailQueue->Create(
    ArticleID => '...',         # optional
    MessageID => '...',         # optional (in case article id was passed this should be also)
    Sender    => '...',
    Recipient => '...' || [],
    Message   => '...',
    Attempts  => '...',         # optional
);

Returns 1 or undef.

List()#

Get a list of the queue elements.

my $List = $MailQueue->List(
    ID        => '...', # optional
    ArticleID => '...', # optional
    Sender    => '...', # optional
    Recipient => '...', # optional
    Attempts  => '...', # optional
);

This returns something like:

my $List = [
    {
        ID              => '...',
        ArticleID       => '...',
        Attempts        => '...',
        Sender          => '...',
        Recipient       => ['...'],
        Message         => '...',
        DueTime         => '...',
        LastSMTPCode    => '...',
        LastSMTPMessage => '...',
    },
    # ...
]

Get()#

Get a queue element.

my $Item = $MailQueue->Get(
    ID        => '...', # optional
    ArticleID => '...', # optional
);

This returns something like:

$Item = {
    ID              => '...',
    ArticleID       => '...',
    Attempts        => '...',
    Sender          => '...',
    Recipient       => ['...'],
    Message         => '...',
    DueTime         => '...',
    LastSMTPCode    => '...',
    LastSMTPMessage => '...',
};

or and empty hashref if element not found.

Update()#

Update queue elements.

my $Result = $MailQueue->Update(
    Filters => {},
    Data    => {},
);

Returns 1 or undef.

Delete()#

Delete queue elements.

my $Result = $MailQueue->Delete(
    %Filters,       # See _FiltersSQLAndBinds
);

Returns 1 or undef.

Send()#

Send/Process a mail queue element/item.

my $List = $MailQueue->Send(
    ID        => '...',
    Sender    => '...',
    Recipient => '...',
    Message   => '...',
    Force     => '...',     # optional, to force the sending even if isn't time
);

This returns something like:

$List = {
    Status  => '(Failed|Pending|Success)',
    Message => '...',                      # undef if success.
};

PRIVATE INTERFACE#

_SendSuccess()#

This method is called after a MailQueue item is successfully sent. It clears the item from the MailQueue, closes the communication log and triggers a Event Notification.

my $Result = $Object->_SendSuccess(
    Item => {
        ID                     => ...,
        ArticleID              => ...,  # optional
        UserID                 => ...,
        CommunicationLogObject => ...,
    }
);

Returns 1 or undef.

_SendError()#

Handles Send errors. Situations where the mail queue item is deleted:

  • SMTP 5?? errors codes, considered permanent errors.

  • reached maximum attempts

$Object->_SendError(
    Item       => '...',
    SendResult => '...',
);

This always returns undef.

_SetArticleTransmissionError()#

Creates or Updates the Article Transmission Error record with the error message. Then, fires a Notification Event.

my $Result = $Object->_SetArticleTransmissionError(
    ArticleID              => 123,
    Message                => '...',
    MessageID              => 123,
    UserID                 => 1,
    ForceUpdate            => '...',
    CommunicationLogObject => '...',
);

Returns 1 or undef.

_SendEventNotification()#

Formats a Notification and asks Event Handler to send it.

my $Result = $Object->_SendEventNotification(
    ArticleID => 123,
    Status    => "Queued|Sent|Error",
    Message   => '...',
    UserID    => 1,
);

This returns something like:

my $Result = {
    Status  => 'Failed',
    Message => 'Need ArticleID',
};

in case of missing or invalid arguments, or the status of the EventHandler call.

_FiltersSQLAndBinds()#

Build the filter sql and associated binds.

my ( $FilterSQL, $Binds ) = $MailQueue->_FiltersSQLAndBinds(
    ID              => 1,       # optional
    ArticleID       => 123,     # optional
    CommunicationID => 123,     # optional
    Sender          => '...',   # optional
    Recipient       => '...',   # optional
    Attempts        => '...',   # optional
);

This returns something like:

$FilterSQL = '...';
$Binds     = \[...];

_CheckValidEmailAddresses()#

Check if the provided email address(es) is valid.

my $IsValid = $MailQueue->_CheckValidEmailAddresses(
    ParamName => '...',         # name of the parameter that we are checking
    Addresses => '...', || []   # email addresses to validate
);

Returns 1 or undef.

_CheckValidMessageData()#

Check if the provided data is a non-empty hash-ref.

my $IsValid = $MailQueue->_CheckValidMessageData(
    Data => {
        # ...
    },
);

Returns 1 or undef.

_SerializeMessage()#

Serialize a simple perl structure to be save in the database.

Returns an encoded or a storable string.

_DeserializeMessage()#

Deserialize a simple perl structure to the original format.

_IsArticleAlreadyQueued()#

Checks if the article is already queued.

Returns 1 or undef.

_DBInsert()#

Inserts a new record in the table and returns the newly record id. Returns a number (id of the new record inserted) or undef.

_CreateCommunicationLogLookup()#

Creates the mail-queue item communication-log message association. It will also create the association for the article if any ArticleID was passed. Returns 1 always.

_GetCommunicationLog()#

Get the communication log associated to the queue item, if not found, creates a new one.

my $CommunicationLog = $Self->_GetCommunicationLog(
    ID => '...',    # mail-queue item ID
);

Returns communication-log object.