Ingo_Script_Procmail_Recipe::__construct PHP Method

__construct() public method

Constructs a new procmail recipe.
public __construct ( array $params = [], array $scriptparams = [] )
$params array Array of parameters. REQUIRED FIELDS: 'action' OPTIONAL FIELDS: 'action-value' (only used if the 'action' requires it) 'disable'
$scriptparams array Array of parameters passed to Ingo_Script_Procmail.
    public function __construct($params = array(), $scriptparams = array())
    {
        $this->_disable = !empty($params['disable']);
        $this->_params = array_merge($this->_params, $scriptparams);
        $delivery = '';
        if (isset($this->_params['transport'][Ingo::RULE_ALL]['params']['delivery_agent'])) {
            $delivery = '| ' . $this->_params['transport'][Ingo::RULE_ALL]['params']['delivery_agent'] . ' ';
        }
        if (isset($this->_params['transport'][Ingo::RULE_ALL]['params']['delivery_mailbox_prefix'])) {
            $delivery .= ' ' . $this->_params['transport'][Ingo::RULE_ALL]['params']['delivery_mailbox_prefix'];
        }
        if (!empty($this->_params['transport'][Ingo::RULE_ALL]['params']['date'])) {
            $this->_params['date'] = $this->_params['transport'][Ingo::RULE_ALL]['params']['date'];
        }
        if (!empty($this->_params['transport'][Ingo::RULE_ALL]['params']['echo'])) {
            $this->_params['echo'] = $this->_params['transport'][Ingo::RULE_ALL]['params']['echo'];
        }
        if (!empty($this->_params['transport'][Ingo::RULE_ALL]['params']['ls'])) {
            $this->_params['ls'] = $this->_params['transport'][Ingo::RULE_ALL]['params']['ls'];
        }
        switch ($params['action']) {
            case 'Ingo_Rule_User_Keep':
                // Note: you may have to set the DEFAULT variable in your
                // backend configuration.
                $this->_action[] = $delivery .= '$DEFAULT';
                break;
            case 'Ingo_Rule_User_Move':
                $this->_action[] = $delivery .= $this->procmailPath($params['action-value']);
                break;
            case 'Ingo_Rule_User_Discard':
                $this->_action[] = '/dev/null';
                break;
            case 'Ingo_Rule_User_Redirect':
                $this->_action[] = '! ' . $params['action-value'];
                break;
            case 'Ingo_Rule_User_RedirectKeep':
                $this->_action[] = '{';
                $this->_action[] = '  :0 c';
                $this->_action[] = '  ! ' . $params['action-value'];
                if (strpos($this->_flags, 'c') === false) {
                    $this->_action[] = '';
                    $this->_action[] = '  :0' . (isset($this->_params['delivery_agent']) ? ' w' : '');
                    $this->_action[] = '  ' . $delivery . '$DEFAULT';
                }
                $this->_action[] = '}';
                break;
            case 'Ingo_Rule_User_Reject':
                $this->_action[] = '{';
                $this->_action[] = '  :0 h';
                $this->_action[] = '  SUBJECT=| formail -xSubject:';
                $this->_action[] = '';
                $this->_action[] = '  :0 h';
                $this->_action[] = '  SENDER=| formail -zxFrom:';
                $this->_action[] = '';
                $this->_action[] = '  :0 Wh';
                $this->_action[] = '  * !^FROM_DAEMON';
                $this->_action[] = '  * !^X-Loop: $SENDER';
                $this->_action[] = '  | (formail -rA"X-Loop: $SENDER" \\';
                $reason = $params['action-value'];
                if (Horde_Mime::is8bit($reason)) {
                    $this->_action[] = '    -i"Subject: Re: $SUBJECT" \\';
                    $this->_action[] = '    -i"Content-Transfer-Encoding: quoted-printable" \\';
                    $this->_action[] = '    -i"Content-Type: text/plain; charset=UTF-8" ; \\';
                    $reason = Horde_Mime_QuotedPrintable::encode($reason);
                } else {
                    $this->_action[] = '    -i"Subject: Re: $SUBJECT" ; \\';
                }
                $reason = addcslashes($reason, "\\\n\r\t\"`");
                $this->_action[] = '    ' . $this->_params['echo'] . ' -e "' . $reason . '" \\';
                $this->_action[] = '  ) | $SENDMAIL -oi -t';
                $this->_action[] = '}';
                break;
            case 'Ingo_Rule_System_Vacation':
                $days = $params['action-value']['days'];
                $timed = !empty($params['action-value']['start']) && !empty($params['action-value']['end']);
                $this->_action[] = '{';
                foreach ($params['action-value']['addresses'] as $address) {
                    if (empty($address)) {
                        continue;
                    }
                    $this->_action[] = '  :0';
                    $this->_action[] = '  * ^TO_' . $address;
                    $this->_action[] = '  {';
                    $this->_action[] = '    FILEDATE=`test -f ${VACATION_DIR:-.}/\'.vacation.' . $address . '\' && ' . $this->_params['ls'] . ' -lcn --time-style=+%s ${VACATION_DIR:-.}/\'.vacation.' . $address . '\' | ' . 'awk \'{ print $6 + (' . $days * 86400 . ') }\'`';
                    $this->_action[] = '    DATE=`' . $this->_params['date'] . ' +%s`';
                    $this->_action[] = '    DUMMY=`test -f ${VACATION_DIR:-.}/\'.vacation.' . $address . '\' && ' . 'test $FILEDATE -le $DATE && ' . 'rm ${VACATION_DIR:-.}/\'.vacation.' . $address . '\'`';
                    if ($timed) {
                        $this->_action[] = '    START=' . $params['action-value']['start'];
                        $this->_action[] = '    END=' . $params['action-value']['end'];
                    }
                    $this->_action[] = '';
                    $this->_action[] = '    :0 h';
                    $this->_action[] = '    SUBJECT=| formail -xSubject:';
                    $this->_action[] = '';
                    $this->_action[] = '    :0 Wc: ${VACATION_DIR:-.}/vacation.lock';
                    if ($timed) {
                        $this->_action[] = '    * ? test $DATE -gt $START && test $END -gt $DATE';
                    }
                    $this->_action[] = '    {';
                    $this->_action[] = '      :0 Wh';
                    $this->_action[] = '      * ^TO_' . $address;
                    $this->_action[] = '      * !^X-Loop: ' . $address;
                    $this->_action[] = '      * !^X-Spam-Flag: YES';
                    if (count($params['action-value']['excludes']) > 0) {
                        foreach ($params['action-value']['excludes'] as $exclude) {
                            if (!empty($exclude)) {
                                $this->_action[] = '      * !^From.*' . $exclude;
                            }
                        }
                    }
                    if ($params['action-value']['ignorelist']) {
                        $this->_action[] = '      * !^FROM_DAEMON';
                    }
                    $this->_action[] = '      | formail -rD 8192 ${VACATION_DIR:-.}/.vacation.' . $address;
                    $this->_action[] = '      :0 eh';
                    $this->_action[] = '      | (formail -rI"Precedence: junk" \\';
                    $this->_action[] = '       -a"From: <' . $address . '>" \\';
                    $this->_action[] = '       -A"X-Loop: ' . $address . '" \\';
                    $reason = Ingo_Rule_System_Vacation::vacationReason($params['action-value']['reason'], $params['action-value']['start'], $params['action-value']['end']);
                    if (Horde_Mime::is8bit($reason)) {
                        $this->_action[] = '       -i"Subject: ' . Horde_Mime::encode($params['action-value']['subject'] . ' (Re: $SUBJECT)') . '" \\';
                        $this->_action[] = '       -i"Content-Transfer-Encoding: quoted-printable" \\';
                        $this->_action[] = '       -i"Content-Type: text/plain; charset=UTF-8" ; \\';
                        $reason = Horde_Mime_QuotedPrintable::encode($reason);
                    } else {
                        $this->_action[] = '       -i"Subject: ' . Horde_Mime::encode($params['action-value']['subject'] . ' (Re: $SUBJECT)') . '" ; \\';
                    }
                    $reason = addcslashes($reason, "\\\n\r\t\"`");
                    $this->_action[] = '       ' . $this->_params['echo'] . ' -e "' . $reason . '" \\';
                    $this->_action[] = '      ) | $SENDMAIL -f' . $address . ' -oi -t';
                    $this->_action[] = '      :0';
                    $this->_action[] = '      /dev/null';
                    $this->_action[] = '    }';
                    $this->_action[] = '  }';
                }
                $this->_action[] = '}';
                break;
            case 'Ingo_Rule_System_Forward':
                /* Make sure that we prevent mail loops using 3 methods.
                 *
                 * First, we call sendmail -f to set the envelope sender to be the
                 * same as the original sender, so bounces will go to the original
                 * sender rather than to us.  This unfortunately triggers lots of
                 * Authentication-Warning: messages in sendmail's logs.
                 *
                 * Second, add an X-Loop header, to handle the case where the
                 * address we forward to forwards back to us.
                 *
                 * Third, don't forward mailer daemon messages (i.e., bounces).
                 * Method 1 above should make this redundant, unless we're sending
                 * mail from this account and have a bad forward-to account.
                 *
                 * Get the from address, saving a call to formail if possible.
                 * The procmail code for doing this is borrowed from the
                 * Procmail Library Project, http://pm-lib.sourceforge.net/.
                 * The Ingo project has the permission to use Procmail Library code
                 * under Apache licence v 1.x or any later version.
                 * Permission obtained 2006-04-04 from Author Jari Aalto. */
                $this->_action[] = '{';
                $this->_action[] = '  :0 ';
                $this->_action[] = '  *$ ! ^From *\\/[^  ]+';
                $this->_action[] = '  *$ ! ^Sender: *\\/[^   ]+';
                $this->_action[] = '  *$ ! ^From: *\\/[^     ]+';
                $this->_action[] = '  *$ ! ^Reply-to: *\\/[^     ]+';
                $this->_action[] = '  {';
                $this->_action[] = '    OUTPUT = `formail -zxFrom:`';
                $this->_action[] = '  }';
                $this->_action[] = '  :0 E';
                $this->_action[] = '  {';
                $this->_action[] = '    OUTPUT = $MATCH';
                $this->_action[] = '  }';
                $this->_action[] = '';
                /* Forward to each address on our list. */
                foreach ($params['action-value'] as $address) {
                    if (!empty($address)) {
                        $this->_action[] = '  :0 c';
                        $this->_action[] = '  * !^FROM_MAILER';
                        $this->_action[] = '  * !^X-Loop: to-' . $address;
                        $this->_action[] = '  | formail -A"X-Loop: to-' . $address . '" | $SENDMAIL -oi -f $OUTPUT ' . $address;
                    }
                }
                /* In case of mail loop or bounce, store a copy locally.  Note
                 * that if we forward to more than one address, only a mail loop
                 * on the last address will cause a local copy to be saved.  TODO:
                 * The next two lines are redundant (and create an extra copy of
                 * the message) if "Keep a copy of messages in this account" is
                 * checked. */
                $this->_action[] = '  :0 E' . (isset($this->_params['delivery_agent']) ? 'w' : '');
                $this->_action[] = '  ' . $delivery . '$DEFAULT';
                $this->_action[] = '  :0 ';
                $this->_action[] = '  /dev/null';
                $this->_action[] = '}';
                break;
            default:
                $this->_valid = false;
                break;
        }
    }