23

PHPでの初めてのプログラミング。助けがありました。もう少し必要です。

ゴール:

Gmailアカウントの特定のメールアドレスからlastContactDateを取得します。「[Person]に最後に連絡したのはいつですか」という質問に答えたいと思っています。

私がこれまでにしたこと:

  • imapを使用してGmailに接続(受信トレイのみ)
  • 日付と時刻を取得しました
  • 人の名前とタイムスタンプを印刷しました。

私ができないこと:

  • アーカイブされたlastContactDateのメールを精査します(私は受信トレイ= 0の人です)

ノート:

  • コードは大まかなものですが、機能的です。PHPは実際には別のページに分割する必要がありますが、これは最初の試みです。助けてくれてありがとう!
  • 愛するプログラミング、ところで。過去2日間に@edw519のダンスを2回以上行いました。

リサーチ:

これまでに使用されたコード:

    /* connect to gmail */
$gmailhostname = '{imap.gmail.com:993/imap/ssl}';
$gmailusername = "___@gmail.com";
$gmailpassword = "___";

    /* try to connect */
$conn = imap_open($gmailhostname,$gmailusername,$gmailpassword) or die('Cannot connect to Gmail: ' . imap_last_error());

$query = mysql_query("SELECT * FROM users");    
    while($row = mysql_fetch_array($query))
    {
        $findemail = $row["email"];

        /* grab emails */
        $emails = imap_search($conn,'FROM "'.$findemail.'"');

        /* if emails are returned, cycle through each... */
        if ($emails) { 
            /* begin output var */
            $output = '';             
            /* put the newest emails on top */
            rsort($emails);

            /* for 5 emails... */
            $emails = array_slice($emails,0,1);

            foreach ($emails as $email_number) {    
                /* get information specific to this email */
                $overview = imap_fetch_overview($conn,$email_number,0);
                $message = imap_fetchbody($conn,$email_number,2);

                /* output the email header information */
                /*
            $output.= '<div class="toggler '.($overview[0]->seen ? 'read' : 'unread').'">';
                $output.= '<span class="subject">'.$overview[0]->subject.'</span> ';
                $output.= '<span class="from">'.$overview[0]->from.'</span>';
            */
                $output.= '<span class="from">'.$overview[0]->from.'</span> ';
                $output.= '<span class="date">on '.$overview[0]->date.'</span> <br /><br />';
                mysql_query("UPDATE users SET lastContactDate = '".$overview[0]->date."' WHERE email = '".$findemail."'") or die(mysql_error());

                /* output the email body */
                /* $output.= '<div class="body">'.$message.'</div>'; */
            }
            echo $output;
        }
    } 
/* close the connection */
imap_close($conn);
?>
4

2 に答える 2

12

問題が解決しました!

これが解決策です。上記の元のコードを使用して、プログラムが検索する場所のみを変更しました。INBOX の代わりに、次のようになります。

    /* connect to gmail */
$gmailhostname = '{imap.gmail.com:993/imap/ssl}[Gmail]/All Mail';

具体的には

[Gmail]/All Mail

ここで構文を見つけました:http://php.net/manual/en/function.imap-delete.php

しかし、以下のベンの壮大なソリューションがなければ不可能だったでしょう..このビットの大部分:

    //You can find out what folders are available with this command:
print_r(imap_list($conn, $gmailhostname, '*'));

print_r は、アカウント内のすべてのフォルダーを名前でリストしました。私の場合、「すべてのメール」を見つけました - 22,000+、php.net で構文のサンプルコードを見つけ、それをプラグインして viola!

私のコードをクリーンアップしてくれた mmmshuddup に感謝します。特に、多大な研究努力と優れたソリューションを提供してくれた Ben に感謝します。

これはめちゃくちゃ楽しいです。

于 2011-11-18T06:19:00.753 に答える
6

私は imap 関数を使用したことがありませんが、マニュアルを見ると、imap_search 関数が UID の代わりに単純なメッセージ シーケンス番号を返していることが問題である可能性があります。

多分誰かがあなたをより良く助けることができるでしょう.

imap_search 関数を次のように変更してみてください。

   $emails = imap_search($conn,'FROM "'.$findemail.'"', SE_UID);

そして、これらへのフェッチ関数:

  $overview = imap_fetch_overview($conn,$email_number, FT_UID);
  $message = imap_fetchbody($conn,$email_number,2, FT_UID);

それでもうまくいかない場合は、代わりに fetch_overview を次のいずれかに設定してみてください。

$overview = imap_fetch_overview($conn,"1:{$email_number}",0);
// Or Maybe:
$overview = imap_fetch_overview($conn,"{$email_number}:{$email_number}",0);

これは、メッセージを 1 から、$email_number が何であれ、一意のメッセージ ID ではなく一連のメッセージ ID に取得するように指示します。よくわかりません。

UID メソッドを使用して rsort() が機能するとは思わないため、そのメソッドを使用した場合は、別の方法で並べ替える必要があります。おそらく、一致するすべての電子メールのヘッダーの配列を取得し、そのように並べ替える必要があります。

申し訳ありませんが、以前は imap を使用したことがありませんでしたが、頑張ってください!

編集:マニュアルページはこれについて非常に奇妙ですが、 imap_sort 関数にも検索基準があるように見えるため、理論的には次のようにすることができます:

  $emails = imap_sort($conn, SORTARRIVAL, 0, SE_UID, 'FROM "'.$findemail.'"');
  // and then grab the first one:
  $emails = array_slice($emails,0,1);

  //And then further down use these two with the UID param
   $overview = imap_fetch_overview($conn,$email_number, FT_UID);
   $message = imap_fetchbody($conn,$email_number,2, FT_UID);

それでもアーカイブからメッセージを取得できない場合は、次の回答をご覧ください。

PHP imap_search が Gmail の受信トレイにあるすべてのメッセージを検出しない

再編集

うわー、これには私が思っていた以上のことが本当にあります....これはこれまでで最も長い答えになっています...

要件によっては、アーカイブ フォルダー内のメッセージのみを検索する必要がある場合は、接続を再度開いて、検索する前にその特定のフォルダーに接続する必要があると思います。たとえば、次のようになります。

imap_reopen($conn, "{$gmailhostname}Archive") or die(implode(", ", imap_errors()));
//You can find out what folders are available with this command:
print_r(imap_list($conn, $gmailhostname, '*'));

すべてのフォルダーを検索する必要がある場合...これは私が見たものよりも難しいです:検索したい各電子メールの受信トレイをループするか、これを使用する方法を見つける必要があります:

http://code.google.com/apis/gmail/imap/#x-gm-raw

カスタム imap ハンドラ、または ZEND が必要になると思います。 PHPのカスタムIMAPコマンド

それが公式に私が見つけたすべての情報です。

于 2011-11-17T23:20:42.913 に答える