在 IMAP 服务器上将电子邮件设置为已查看

Posted

技术标签:

【中文标题】在 IMAP 服务器上将电子邮件设置为已查看【英文标题】:Set an email as SEEN on IMAP server 【发布时间】:2011-10-09 14:14:21 【问题描述】:

我正在尝试从 Imap 服务器 (Gmail) 读取邮件。我会检查是否有新邮件(看不见)并检查它。 我写了这段代码,但是

imap_setflag_full

似乎不起作用。 如果我有一封新邮件,脚本将无法放置 SEEN 标志,它会向我反映始终有一封看不见的邮件。

  $mbox=imap_open( "imap.gmail.com:993/ssl/novalidate-cert" , $this->username, $this->password);
    if ($mbox) 
              echo "Connected\n<br><br>"; 
              else  exit ("Can't connect: " . imap_last_error() ."\n");  echo "FAIL!\n";  ; 

        if ($hdr = imap_check($mbox)) 
          $msgCount = $hdr->Nmsgs;
          echo "There are ".$msgCount." mail";
         else 
          echo "Failed to get mail";

        

        $result = imap_search($mbox, 'UNSEEN');
        echo "<br>Result: ";
        print_r($result);
        if($result==false)
            echo "No email";
        else
            echo "you have mail"; 
            echo("<br>now I set the Seen flag for this mail");
            rsort($result);
            $status = imap_setflag_full($mbox, "1", "\\Seen \\Flagged", ST_UID);      
        

        echo"<br><br>";


        $result = imap_search($mbox, 'UNSEEN');
        echo "<br>Result: ";
        print_r($result);
        if($result==false)
            echo "no mail";
        else
            echo "there are still"; 

        

非常感谢。

【问题讨论】:

【参考方案1】:

我不知道上面的答案是如何工作的,人们正在投票这个答案。 我在那个答案上浪费了一整天。

我终于得到了真正的解决方案。这是有效的。我只是设置未读邮件来阅读邮件。

<?php   
// Connect to gmail
$imapPath = 'imap.gmail.com:993/imap/sslINBOX';
//$imapPath = 'imap.gmail.com:993/imap/ssl/novalidate-certINBOX';
$username = 'Your-email@gmail.com';
$password = 'Your-Password';
$email_read = 'UNSEEN';

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

$emails = imap_search($inbox,$email_read);
$ids = array();
foreach($emails as $key => $mail) 
    $ids [] = $mail;

    // Do here whatever you want.


// Setting flag from un-seen email to seen on emails ID.
imap_setflag_full($inbox,implode(",", $ids), "\\Seen \\Flagged"); //IMPORTANT

// colse the connection
imap_expunge($inbox);
imap_close($inbox);

?>

【讨论】:

在您的回答中,您将所有未查看的电子邮件标记为已读。但是在上面的答案中,我可以根据需要使用不同的条件在foreach 中选择我想要标记为已读的电子邮件。【参考方案2】:

我认为问题在于您硬编码的“1”。我将“1”替换为:

foreach ($result as $mail) 
    $status = imap_setflag_full($mbox, $mail, "\\Seen \\Flagged", ST_UID);

而且它似乎有效。使用 ST_UID 时,这实际上是一个 ID,而不是序列号。

【讨论】:

要返回 UID 而不是序列号,请使用 SE_UID 选项。 只是为了澄清 Matthew 的评论:ST_UID 标志只有在您按内部 ID 搜索消息时才必须传递,而不是按序列号(默认):$result = imap_search($mbox, 'UNSEEN', SE_UID);,问题中没有这样做。

以上是关于在 IMAP 服务器上将电子邮件设置为已查看的主要内容,如果未能解决你的问题,请参考以下文章

android 邮件服务器,全球邮企业邮箱Android(安卓)系统手机 POP3 IMAP协议设置方法

使用 Exchange Web Services 2007 将电子邮件标记为已读

Zend Mail - 如何在不将电子邮件标记为已打开的情况下阅读

imap服务器怎么设置 以QQ邮箱为例设置imap服务器

发啥我手机发送电子邮件发不出去呢?他老是提示“网络服务器错误”,请高手指点。手机该怎样设置?

常用邮箱的 IMAP/POP3/SMTP 设置