/** * 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]; } }