/**
 * Insert/Update the data of email address into DB
 *
 * @param array Data of returned email:
 *               'address'
 *               'errormsg'
 *               'message'
 *               'headers'
 *               'errtype'
 */
function dre_save_email_address_data($email_returned)
{
    global $DB;
    if (empty($email_returned['address'])) {
        // No emails, Exit here
        return;
    }
    $EmailAddressCache =& get_EmailAddressCache();
    // Get an existing email address to update if it exist
    $EmailAddress =& $EmailAddressCache->get_by_name($email_returned['address'], false);
    if (!$EmailAddress) {
        // Insert new email address
        $EmailAddress = new EmailAddress();
        $EmailAddress->set('address', $email_returned['address']);
    }
    switch ($email_returned['errtype']) {
        // Error type of the returned email:
        case 'P':
            // Permanent error
            $EmailAddress->increase_counter('prmerror');
            // Update only the adresses with NOT spammer statuses
            $EmailAddress->set_status('prmerror');
            break;
        case 'T':
            // Temporary error
            if (in_array($EmailAddress->get('status'), array('suspicious1', 'suspicious2', 'suspicious3'))) {
                // If current status already is defined as 'suspicious1', 'suspicious2' or 'suspicious3'
                if ($EmailAddress->get('sent_last_returnerror') <= 1) {
                    if ($EmailAddress->get('status') == 'suspicious1') {
                        // Increase status from suspicious1 to suspicious2
                        $EmailAddress->set('status', 'suspicious2');
                    } elseif ($EmailAddress->get('status') == 'suspicious2') {
                        // Increase status from suspicious2 to suspicious3
                        $EmailAddress->set('status', 'suspicious3');
                    }
                }
            } elseif ($EmailAddress->get('status') == 'redemption') {
                // IF current status is 'redemption' we should set it as 'suspicious3'
                $EmailAddress->set_status('suspicious3');
            } else {
                // Update only the email addresses with level status less then Suspicious 1
                $EmailAddress->set_status('suspicious1');
            }
            $EmailAddress->increase_counter('tmperror');
            break;
        case 'S':
            // Spam suspicion
            $EmailAddress->increase_counter('spamerror');
            // Update only the email addresses with 'unknown' status
            $EmailAddress->set_status('warning');
            break;
        default:
            // Other errors
            $EmailAddress->increase_counter('othererror');
            // Update only the email addresses with 'unknown' status
            $EmailAddress->set_status('warning');
            break;
    }
    // Insert/Update an email address
    $EmailAddress->dbsave();
}