• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • imap_search()

    (PHP 4, PHP 5, PHP 7)

    This function returns an array of messages matching the given search criteria

    说明

    imap_search(resource $imap_stream,string $criteria[,int $options= SE_FREE[,string $charset= NULL]]): array

    This function performs a search on the mailbox currently opened in the given IMAP stream.

    For example, to match all unanswered messages sent by Mom, you'd use:"UNANSWERED FROM mom". Searches appear to be case insensitive. This list of criteria is from a reading of the UW c-client source code and may be incomplete or inaccurate(see also » RFC2060, section 6.4.4).

    参数

    $imap_stream

    由imap_open()返回的 IMAP 流。

    $criteria

    A string, delimited by spaces, in which the following keywords are allowed. Any multi-word arguments(e.g.FROM "joey smith")must be quoted. Results will match all$criteriaentries.

    • ALL - return all messages matching the rest of the criteria
    • ANSWERED - match messages with the ANSWERED flag set
    • BCC "string"- match messages with "string" in the Bcc: field
    • BEFORE "date"- match messages with Date: before "date"
    • BODY "string"- match messages with "string" in the body of the message
    • CC "string"- match messages with "string" in the Cc: field
    • DELETED - match deleted messages
    • FLAGGED - match messages with the FLAGGED(sometimes referred to as Important or Urgent)flag set
    • FROM "string"- match messages with "string" in the From: field
    • KEYWORD "string"- match messages with "string" as a keyword
    • NEW - match new messages
    • OLD - match old messages
    • ON "date"- match messages with Date: matching "date"
    • RECENT - match messages with the RECENT flag set
    • SEEN - match messages that have been read(the SEEN flag is set)
    • SINCE "date"- match messages with Date: after "date"
    • SUBJECT "string"- match messages with "string" in the Subject:
    • TEXT "string"- match messages with text "string"
    • TO "string"- match messages with "string" in the To:
    • UNANSWERED - match messages that have not been answered
    • UNDELETED - match messages that are not deleted
    • UNFLAGGED - match messages that are not flagged
    • UNKEYWORD "string"- match messages that do not have the keyword "string"
    • UNSEEN - match messages which have not been read yet
    $options

    Valid values for$optionsare SE_UID, which causes the returned array to contain UIDs instead of messages sequence numbers.

    $charset

    MIME character set to use when searching strings.

    返回值

    Returns an array of message numbers or UIDs.

    Return FALSE if it does not understand the search$criteriaor no messages have been found.

    范例

    Example #1 imap_search() example

    <?php
    $conn   = imap_open('{imap.example.com:993/imap/ssl}INBOX', 'foo@example.com', 'pass123', OP_READONLY);
    $some   = imap_search($conn, 'SUBJECT "HOWTO be Awesome" SINCE "8 August 2008"', SE_UID);
    $msgnos = imap_search($conn, 'ALL');
    $uids   = imap_search($conn, 'ALL', SE_UID);
    print_r($some);
    print_r($msgnos);
    print_r($uids);
    ?>
    

    以上例程的输出类似于:

    Array
    (
        [0] => 4
        [1] => 6
        [2] => 11
    )
    Array
    (
        [0] => 1
        [1] => 2
        [2] => 3
        [3] => 4
        [4] => 5
        [5] => 6
    )
    Array
    (
        [0] => 1
        [1] => 4
        [2] => 6
        [3] => 8
        [4] => 11
        [5] => 12
    )
    

    参见

    The date format for e.g. SINCE is, according to rfc3501:
    date      = date-text / DQUOTE date-text DQUOTE
    date-day    = 1*2DIGIT
              ; Day of month
    date-day-fixed = (SP DIGIT) / 2DIGIT
              ; Fixed-format version of date-day
    date-month   = "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" /
             "Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec"
    date-text    = date-day "-" date-month "-" date-year
    So a valid date is e.g. "22-Jul-2012" with or without the double quotes.
    Hi, 
    be aware, that imap_search() does NOT (as you may exspect) return an empty array, if nothing was found! 
    As the manual says, it returns FALSE.
    Do not test the result like "count($array)" as I did. 
    This gives you 1 for an empty result. Took me an hour to found out why :-( RTFM
    To set your own CHARSET, which is useful if you are dealing with Chinese Japanese and Korean queries.
    <?php imap_search($inbox,'BODY "'.$keyword.'"', SE_FREE, "UTF-8"); ?>
    
    imap_search() always returns false when op_silent flag is set in the connection parameters.
    imap_search function is not fully compatible with IMAP4. the c-client used as of now supports only IMAP2 and some search criterion will not be available for use such as "OR"
    So a php code similar to:
    $inbox  = imap_open('{imap.example.com:993/imap/ssl}INBOX', 'foo@example.com', 'pass123', OP_READONLY);
    $search_string = 'SUBJECT "FedEx" OR SUBJECT "USPS"';  
    $emails = imap_search($inbox, $search_string);
    will throw an error saying "Unknown search criterion"
    observations and reference:
    PHP source trace:(ref: https://github.com/php/php-src/blob/master/ext/imap/php_imap.c)
      /ext/imap/php_imap.c -> line no : 4126
      imap_search => line no : 4148
    c-client library source trace:
    src/c-client/mail.c -> line no : 3973
    internal.txt -> line no : 1919 => mail_criteria()
      criteria IMAP2-format search criteria string
      WARNING: This function does not accept IMAP4 search criteria.
    IMAP2 RFC1064 => [ref: https://tools.ietf.org/html/rfc1064] [page: 13]
    IMAP4 RFC2060 => [ref: http://www.faqs.org/rfcs/rfc2060.html] [section: 6.4.4]
    Note:
    The core search functionality in a core module(IMAP) is still not available in PHP. Hope this will be brought to the developer community's attention...
    It's not possible to find strings containing double quotes using this function.
    For example, if you got a message named : Hello, this is "Bob"
    You can try :
       imap_search($inbox, 'SUBJECT "Hello, this is "Bob""')
    Or
       imap_search($inbox, "SUBJECT 'Hello, this is \"Bob\"'")
    But both are false, because you did not escape double quotes in the first case, and you can NOT use simple quotes in the imap_search criteria in the second case.
    The real problem is that you cannot use simple quotes to surround your criteria in the 2nd argument of imap_search, after SUBJECT.
    imap_search() only supports IMAP2 search criterias, because the function mail_criteria() (from c-client lib) is used in ext/imap/php_imap.c for parsing the search string.
    IMAP2 search criteria is defined in RFC 1176, section "tag SEARCH search_criteria".
    utf-8 charset isn't supported on outlook 365. So you might get a false return value here, if you pass that charset.
    This is the correct way to use the imap_search with ON "date"
    $date = date("j F Y");
    $emails = imap_search($inbox,'ON "'.$date.'"' );
    the second parameter about Criteria does not work well on ON criterion.
    In facts if I wish to put parameters from $_get into the format Day-Month-Year (01-01-14 for example) will return Unknown criterion etc.
    Probably is not the right format ?
    Even with for example Thu-Jan-2014 get the same message.
    I haven't found any documentation of the allowed date formats, but (for example) "14 May 2012" works.
    // Find UIDs of messages within the past week
    $date = date ( "d M Y", strToTime ( "-7 days" ) );
    $uids = imap_search ( $mbox, "SINCE \"$date\"", SE_UID );
    This search looks for messages matching ALL criteria, not ANY criteria. For example the search 
    imap_search($mailbox,'FROM "user" TO "user"')
    Will return message that have "user" in both the from and to headers, but not messages with "user" in either the from or to header.
    imap_search() return false if it does not understand the search condition or no messages have been found.
    $emails imap_seach($mbox, "UNDELETED SENTSINCE 01-Jan-2002");
    if($emails === false)
     echo "The search failed";
    about my previous note:
    <<the second parameter about Criteria does not work well on ON criterion.
    In facts if I wish to put parameters from $_get into the format Day-Month-Year (01-01-14 for example) will return Unknown criterion etc.
    Probably is not the right format ?
    Even with for example Thu-Jan-2014 get the same message. >>
    ------------------------------------------------------------------------
    Now works ;) 
    Just to pass not a date string into criteria parameter but a timestamp returned by mktime function, where you can put your date string.
    Solution for any date/time criterion is a unix timestamp.
    If email subject is encoded than use encoding charset and option in search to find something.
    Mail Header:
    Subject: =?UTF-8?Q?XYZ?=
    <?php imap_search($inbox,'SUBJECT "'.$keyword.'"', SE_FREE, "UTF-8"); ?>
    
    the function "imap_search" not work for some mails , maybe that because header syntax or some bug .
    thanks a lot