4

いいえを取得しようとしています。gmail アカウントからの最近の未読メールについて。このために、Ubuntu システムに IMAP をインストールし、いくつかの PHP iMAP 関数を試しました。これが私が今まで試したことです。

/* connect to gmail */
$hostname = '{imap.gmail.com:993/imap/ssl}INBOX';
$username = 'user@gmail.com';
$password = 'user_password';

/* try to connect */
$inbox = imap_open($hostname,$username,$password) or die('Cannot connect to Gmail: ' .    imap_last_error());

今、私はすべての試みを述べています。注意 - テスト用の電子メール ID に新しいメールを送信して、各試行を試みました。

Attempt_1: imap_search() の使用

$recent_emails = imap_search($inbox,'RECENT');
if ($recent_emails)
   echo count($recent_emails);
else
   echo "false return";
imap_close($inbox);

Attempt_1 の出力は "false return" になりました。

Attempt_2: imap_mailboxmsginfo() の使用

$check = imap_mailboxmsginfo($inbox);
if ($check)
    echo "Recent: "   . $check->Recent  . "<br />\n" ;
else
    echo "imap_check() failed: " . imap_last_error() . "<br />\n";
imap_close($inbox);

ここで、出力はRecent:0で、このIDに2つの新しいメールを送信しました

Attempt_3: imap_status() の使用

$status = imap_status($inbox, $hostname, SA_ALL);
if ($status)
  echo "Recent:     " . $status->recent      . "<br />\n";
else
  echo "imap_status failed: " . imap_last_error() . "\n";

//最近の出力:0

Attempt_4: パラメータ NEW を使用して imap_search() を再度使用する

$recent_emails = imap_search($inbox,'NEW');
if ($recent_emails)
   echo count($recent_emails);
else
   echo "false return";
imap_close($inbox);

出力 - false リターン

では、どこが間違っているのでしょうか? 最近の未読メール数を取得するにはどうすればよいですか?

4

2 に答える 2

6

この機能は機能しているようです:

function CountUnreadMail($host, $login, $passwd) {
    $mbox = imap_open($host, $login, $passwd);
    $count = 0;
    if (!$mbox) {
        echo "Error";
    } else {
        $headers = imap_headers($mbox);
        foreach ($headers as $mail) {
            $flags = substr($mail, 0, 4);
            $isunr = (strpos($flags, "U") !== false);
            if ($isunr)
            $count++;
        }
    }

    imap_close($mbox);
    return $count;
}

使用法:

$hostname = '{imap.gmail.com:993/imap/ssl}INBOX';
$username = 'user@gmail.com';
$password = 'user_password';

$count = CountUnreadMail($hostname, $username, $password);

この機能の完全な功績を主張することはできません。PHP Displaying unread mail countに対する sdolgy の回答を少し編集したバージョンです。彼のバージョンは POP メールを想定していました。このバージョンには完全な$hostname. 自分の Gmail アカウントでテストしたところ、受信トレイにある未読メッセージの数が正しく報告されました。

PHP 未読メール数の表示にはかなり良い読み物があります。見てみな。

お役に立てれば。

アップデート

From: Gmail はすべての IMAP 機能をサポートしていますか?

Gmail IMAP1 は IMAP のかなり完全な実装ですが、次の機能は現在サポートされていません。

\Recent flags on messages.

検証場所: Gmail のバグのある IMAP 実装

Gmail は、「\Deleted」、「\Answered」、「\Recent」などの標準の IMAP フラグを処理しません。

参照:可能な解決策については、 Jyoti Ranjan の回答(下記) を参照してください。

于 2011-09-11T02:37:59.557 に答える
4

データベースを使用して解決しました。これが私が行った方法です。

1.users テーブルに列を作成しました。例: 'email_max_uid' INT(11) NOT NULL デフォルト 0

2.ユーザーが最初にこのページをロードすると、SQLクエリを使用して、その特定のユーザーの「email_max_uid」の値を取得しました 3.彼のGmailアカウントに自動的に接続し、未読メールと合計メールを取得しました

$inbox = imap_open('{imap.gmail.com:993/imap/ssl}INBOX','user's email id','user's password') or die('Cannot connect to Gmail: ' . imap_last_error());
        $unread_emails = imap_search($inbox,'UNSEEN');
        $emails = imap_search($inbox,'ALL', SE_UID);

4.その後

if ('email_max_uid') = 0
        $recent_mails_count = count($unread_emails);
    else
        $recent_mails_count = max($emails) - Array['email_max_uid'];

5.最近のメール数を表示する

echo count($recent_mails_count);

6.ユーザーが自分のメール ID とパスワードを聞かずに自分の Gmail アカウントにログインできるようにするリンクを配置しました。ユーザーが自分のアカウントにログインすると、email_max_uid is updated with count($emails)

  1. ここでも、ユーザーがそのページにアクセスすると、上記の手順と彼のノーに従います。最近のメールの数がページに表示されます。

*私の解決策は、ユーザーがこのアプリケーションを介してのみ gmail アカウントにログインできる場合です。外部からアカウントにログインすると、データベースが更新されないため、間違った番号が表示されます。私の問題のケースでは、ユーザーは自分のメールだけを見るために会社から提供された自分の gmail ID とパスワードさえ知りません。そのため、彼はこのアカウントに外部からログインできません。それが、このソリューションが機能する理由です。

これが3日前に解決した方法です。返信が遅くなり申し訳ありません

于 2011-09-16T07:20:15.350 に答える