Esempio n. 1
0
/**
 * Work in process
 * @private
 * @author Marc Groot Koerkamp
 */
function sqimap_parse_envelope($read, &$i, &$msg)
{
    $arg_no = 0;
    $arg_a = array();
    ++$i;
    for ($cnt = strlen($read); $i < $cnt && $read[$i] != ')'; ++$i) {
        $char = strtoupper($read[$i]);
        switch ($char) {
            case '{':
            case '"':
                $arg_a[] = parseString($read, $i);
                ++$arg_no;
                break;
            case 'N':
                /* probably NIL argument */
                if (strtoupper(substr($read, $i, 3)) == 'NIL') {
                    $arg_a[] = '';
                    ++$arg_no;
                    $i += 2;
                }
                break;
            case '(':
                /* Address structure (with group support)
                 * Note: Group support is useless on SMTP connections
                 *       because the protocol doesn't support it
                 */
                $addr_a = array();
                $group = '';
                $a = 0;
                for (; $i < $cnt && $read[$i] != ')'; ++$i) {
                    if ($read[$i] == '(') {
                        $addr = sqimap_parse_address($read, $i);
                        if ($addr[3] == '' && $addr[2] != '') {
                            /* start of group */
                            $group = $addr[2];
                            $group_addr = $addr;
                            $j = $a;
                        } else {
                            if ($group && $addr[3] == '' && $addr[2] == '') {
                                /* end group */
                                if ($a == $j + 1) {
                                    /* no group members */
                                    $group_addr[4] = $group;
                                    $group_addr[2] = '';
                                    $group_addr[0] = "{$group}: Undisclosed recipients;";
                                    $addr_a[] = $group_addr;
                                    $group = '';
                                }
                            } else {
                                $addr[4] = $group;
                                $addr_a[] = $addr;
                            }
                        }
                        ++$a;
                    }
                }
                $arg_a[] = $addr_a;
                break;
            default:
                break;
        }
    }
    if (count($arg_a) > 9) {
        $d = strtr($arg_a[0], array('  ' => ' '));
        $d = explode(' ', $d);
        if (!$arg_a[1]) {
            $arg_a[1] = '';
        }
        $msg['DATE'] = $d;
        /* argument 1: date */
        $msg['SUBJECT'] = $arg_a[1];
        /* argument 2: subject */
        $msg['FROM'] = is_array($arg_a[2]) ? $arg_a[2][0] : '';
        /* argument 3: from        */
        $msg['SENDER'] = is_array($arg_a[3]) ? $arg_a[3][0] : '';
        /* argument 4: sender      */
        $msg['REPLY-TO'] = is_array($arg_a[4]) ? $arg_a[4][0] : '';
        /* argument 5: reply-to    */
        $msg['TO'] = $arg_a[5];
        /* argument 6: to          */
        $msg['CC'] = $arg_a[6];
        /* argument 7: cc          */
        $msg['BCC'] = $arg_a[7];
        /* argument 8: bcc         */
        $msg['IN-REPLY-TO'] = $arg_a[8];
        /* argument 9: in-reply-to */
        $msg['MESSAGE-ID'] = $arg_a[9];
        /* argument 10: message-id */
    }
}
/**
 * function to process addresses.
 */
function sqimap_parse_address($address, $ar, $addr_ar = array(), $group = '')
{
    $pos = 0;
    $j = strlen($address);
    $name = '';
    $addr = '';
    while ($pos < $j) {
        if ($address[$pos] == '"') {
            /* get the personal name */
            $pos++;
            while ($address[$pos] != '"' && $pos < $j) {
                if (substr($address, $pos, 2) == '\\"') {
                    $name .= $address[$pos];
                    $pos++;
                } elseif (substr($address, $pos, 2) == '\\\\') {
                    $name .= $address[$pos];
                    $pos++;
                }
                $name .= $address[$pos];
                $pos++;
            }
        } elseif ($address[$pos] == '<') {
            /* get email address */
            $addr_start = $pos;
            $pos++;
            while ($address[$pos] != '>' && $pos < $j) {
                $addr .= $address[$pos];
                $pos++;
            }
        } elseif ($address[$pos] == '(') {
            /* rip off comments */
            $addr_start = $pos;
            $pos++;
            while ($address[$pos] != ')' && $pos < $j) {
                $addr .= $address[$pos];
                $pos++;
            }
            $address_start = substr($address, 0, $addr_start);
            $address_end = substr($address, $pos + 1);
            $address = $address_start . $address_end;
            $j = strlen($address);
            $pos = $addr_start;
        } elseif ($address[$pos] == ',') {
            /* we reached a delimiter */
            if ($addr == '') {
                $addr = substr($address, 0, $pos);
            } elseif ($name == '') {
                $name = substr($address, 0, $addr_start);
            }
            $at = strpos($addr, '@');
            $addr_structure = new AddressStructure();
            $addr_structure->personal = $name;
            $addr_structure->group = $group;
            if ($at) {
                $addr_structure->mailbox = substr($addr, 0, $at);
                $addr_structure->host = substr($addr, $at + 1);
            } else {
                $addr_structure->mailbox = $addr;
            }
            $address = substr($address, $pos + 1);
            $j = strlen($address);
            $pos = 0;
            $name = '';
            $addr = '';
            $addr_ar[] = $addr_structure;
        } elseif ($address[$pos] == ":") {
            /* process the group addresses */
            /* group marker */
            $group = substr($address, 0, $pos);
            $address = substr($address, $pos + 1);
            $result = sqimap_parse_address($address, $ar, $addr_ar, $group);
            $addr_ar = $result[0];
            $pos = $result[1];
            $address = substr($address, $pos);
            $j = strlen($address);
            $group = '';
        } elseif ($address[$pos] == ';' && $group) {
            $address = substr($address, 0, $pos - 1);
            break;
        }
        $pos++;
    }
    if ($addr == '') {
        $addr = substr($address, 0, $pos);
    } elseif ($name == '') {
        $name = substr($address, 0, $addr_start);
    }
    $at = strpos($addr, '@');
    $addr_structure = new AddressStructure();
    $addr_structure->group = $group;
    if ($at) {
        $addr_structure->mailbox = trim(substr($addr, 0, $at));
        $addr_structure->host = trim(substr($addr, $at + 1));
    } else {
        $addr_structure->mailbox = trim($addr);
    }
    if ($group && $addr == '') {
        /* no addresses found in group */
        $name = "{$group}: Undisclosed recipients;";
        $addr_structure->personal = $name;
        $addr_ar[] = $addr_structure;
        return array($addr_ar, $pos + 1);
    } else {
        $addr_structure->personal = $name;
        if ($name || $addr) {
            $addr_ar[] = $addr_structure;
        }
    }
    if ($ar) {
        return $addr_ar;
    } else {
        return $addr_ar[0];
    }
}