php
  • search
  • imap
  • rfc
  • 2016-04-01 11 views 2 likes 
    2

    IMAP検索クエリを作成してPHPコードで特定のメールを除外しようとしています... "OR"検索条件を使用する必要がある状況に押し込まれました。検索コマンドのセクション6.4.4を参照する場合imap_search()不明な検索条件 "OR"

    <?php 
    $search_string = 'OR (SUBJECT "FedEx" SUBJECT "USPS")'; 
    $search_string = 'OR SUBJECT "FedEx" SUBJECT "USPS"'; 
    $search_string = 'SUBJECT "FedEx" OR SUBJECT "USPS"'; 
    $search_string = 'OR (SUBJECT "FedEx") OR (SUBJECT "USPS")'; 
    $search_string = 'OR (SUBJECT "FedEx") (SUBJECT "USPS")'; 
    //all of the search strings when used separately didn't work 
    
    $emails = imap_search($inbox, $search_string); 
    ?> 
    

    しかし、使用された場合、PHPはRFC 2060には、ドキュメントが不正確であるかもしれないと言うphp docs for IMAPを参照し、指示誤差PHP Notice: Unknown: Unknown search criterion: OR (errflg=2) in Unknown on line 0

    をスローするので、それは私達ができることに言及しますOR、NOTおよびいくつかの余分な検索条件を使用して...

    はそうプレフィックス位置、中置位置でそれを使用し、RFC 2060で提案されているよう括弧を使用してみましたが、すべて無駄

    でまた、 php bug entryを訪れましたが、これがバグか他の方法で使用する必要があるかどうかは不明です!

    ソリューション/回避策をお持ちのお客様は誰ですか?

    私はそれが条件を満たしている場合...私はIMAP検索


    編集/アップデート経由で行うことがしたいすべてのメールを反復してコードをチェックインするために嫌いになります。

    imap_search関数はIMAP4と完全に互換性がありません。のとして使用されるC-クライアントは今だけIMAP2をサポートし、いくつかの検索基準はそうと類似のPHPコードなど「OR」

    として使用するために使用することはできません。

    $inbox = imap_open('{imap.example.com:993/imap/ssl}INBOX', '[email protected]', 'pass123', OP_READONLY); 
    $search_string = 'SUBJECT "FedEx" OR SUBJECT "USPS"'; 
    $emails = imap_search($inbox, $search_string); 
    

    がエラーをスローします
    Gitのレポ:https://github.com/php/php-src

    観測と参照 "不明な検索基準" と言って

    PHPソーストレース:(参照:https://github.com/php/php-src/blob/master/ext/imap/php_imap.c
    /ext/imap/php_imap.c - >ラインNo:4126
    imap_search =>ラインNo:4148

    Cクライアントライブラリのソーストレース:
    SRC/C-クライアント/ mail.c - >行番号:3973

    /docs/internal.txt - >行番号:1919 => mail_criteria()
    基準IMAP2形検索条件文字列
    警告:この関数はIMAP4検索条件を受け入れません。

    IMAP2 RFC1064 => [REF:https://tools.ietf.org/html/rfc1064] [ページ:13]
    IMAP4 RFC2060 => [REF:http://www.faqs.org/rfcs/rfc2060.html] [セクション:6.4。4]

    注: コアモジュール(IMAP)のコア検索機能は、PHPではまだ使用できません。これは...開発者コミュニティの関心に

    をもたらすことを願っています。しかし、私はPHPのバージョンはIMAP4互換のCクライアントを使用しています...

    1. は、PHPを強制する方法はありますかについてはよく分かりません最新のCクライアント ライブラリを更新/使用するだけですか?
    2. 最新の(11Apr 2016時点で)c-clientはIMAP2のみをサポートしていますか?
    3. ライブラリのソースコードを変更して、 をインストールする必要がありますか?
    4. それとも我々は は(のOAuth2をサポートしていないそれらのメールプロバイダのための を取得し、IMAPプロトコルのメール検索)同じことを達成するために使用できるサードパーティによって開発された任意の他のPHPライブラリはありますか?
    +0

    あなたのサーバーにバグがないことを確認しましたか?多くの「オフブランド」サーバーには、検索実装が最小限または壊れています。 – Max

    +1

    リンクを見て、PHPのバグのように見えます。それは新しいクライアントを使用することについて何か言いますか? – Max

    +0

    @Max、IMAPサーバはgmailサーバです... imapサーバが故障している可能性はほとんどありません –

    答えて

    0

    これを試しましたか?

    $inbox = imap_open('{imap.example.com:993/imap/ssl}INBOX', '[email protected]', 'pass123', OP_READONLY); 
    
    $search_string = 'SINCE "08-Mar-2011" OR SUBJECT "FedEx" OR SUBJECT "USPS"'; 
    
    $emails = imap_search($inbox, $search_string); 
    
    +0

    "OR"検索条件が全く機能するかどうかチェックしましたか?もし私が 'phpinfo()'を共有してください...私は "c-client"ライブラリ(私は2007fバージョンを持っています)に私の疑惑を持っているかもしれません... –

    +0

    IMAPのマーク "Mark Crespin "が2012年に死んで以来、PHPはIMAPのcクライアントライブラリを更新せず、IMAP2バージョンのみをサポートする古いIMAP-2007fバージョンを使用していました。唯一の方法はimap(私の質問ではOR条件がどれくらいあるかに比例しますが、私の場合は10以上のFEDEX、UPS、USPS、DHL、...などの条件に比例します) IMAPユーザベースが増加し続けている場合、 'imap_search()'はサーバをkillするでしょう。 –

    1

    "OR"をシミュレートするために、これをいくつかのimap_search文章を使って解決しました。

    $criteria = 'UNSEEN FROM "[email protected]"|UNSEEN FROM "@onedomain.com"|UNSEEN FROM "@anotherdomain.org"' 
    $criterias = explode('|', $criteria); 
    $emails = array(); 
    foreach ($criterias as $search) { 
        $emails_ = imap_search($inbox, $search); 
        if ($emails_) 
         $emails = array_merge($emails, $emails_); 
    } 
    $emails = array_unique($emails); 
    
    +0

    最後に、私はあまりにもコードでそれを処理しました。検索文字列を使用して...私の目的は、件名と内容に基づいてフィルタリングすることでしたので、PHPの文字列比較とUNIXのgrepを使ってメールコンテンツを掘り下げて(ファイルとして保存した後)使用しました。 'array_intersect()'と 'array_unique()'を使って他の答えを投稿したコメントも読んでください。 –

    関連する問題