【问题标题】:Using PHP, How to search through Gmail's archived emails使用 PHP,如何搜索 Gmail 的存档电子邮件
【发布时间】:2011-11-17 22:06:16
【问题描述】:

第一次用 PHP 编程。有一些帮助。需要更多。

目标:

从我的 gmail 帐户的给定电子邮件地址中提取 lastContactDate。希望回答这个问题,“我最后一次联系 [Person] 是什么时候”

到目前为止我做了什么:

  • 使用 imap 连接到 gmail(仅限收件箱)
  • 获取日期和时间
  • 打印了此人的姓名和时间戳。

我不能做什么:

  • 搜索已归档的 lastContactDate 电子邮件(我是 inbox=0 的人)

注意事项:

  • 代码很粗糙,但很实用。 php 确实应该分开到不同的页面上,但这是第一次尝试。提前感谢您的帮助!
  • 热爱编程,顺便说一句。在过去的两天里,我不止一次跳了一次@edw519 的小舞。

研究:

目前使用的代码:

    /* 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);
?>

【问题讨论】:

  • +1 个布局合理的问题

标签: php gmail imap-open


【解决方案1】:

问题解决了!

这是解决方案。使用上面的原始代码,我们只修改了程序搜索的位置。而不是收件箱,它是:

    /* 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

但如果没有 Ben 在下面的史诗般的解决方案,这将是不可能的。在很大程度上是因为这一点:

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

print_r 按名称列出了我帐户中的所有文件夹。我们发现了“所有邮件”,在我的例子中 - 22,000+,在 php.net 上找到了一段带有语法的示例代码,将其插入并中提琴!

感谢 mmmshuddup 清理我的代码,尤其感谢 Ben 所做的大量研究工作和领先的解决方案。

这太有趣了。

【讨论】:

  • 谢谢!!...但是就像php.net/manual/en/function.imap-delete.php#113803 的帖子一样,如果我想要所有邮件并且设置了与英语不同的语言,就我而言,我必须将所有邮件翻译成该语言我们有捷克语 lang os 实际上是 [Gmail]/Všechny zprávy
【解决方案2】:

我从未使用过 imap 函数,但翻阅手册,问题可能是您的 imap_search 函数返回简单的消息序列号而不是 UID,我猜这是唯一的消息 ID?

也许有人可以更好地帮助你,我只是尝试一些事情来尝试。

尝试将您的 imap_search 函数更改为:

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

还有你的 fetch 函数:

  $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。不过不确定。

我认为 rsort() 不能使用 UID 方法工作,因此如果您使用该方法,则必须找到一种不同的方法来对它们进行排序。您可能需要获取所有匹配电子邮件标题的数组,然后按这种方式排序。

对不起,我没有更多的帮助,以前从未使用过 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 not detecting all messages in gmail inbox

再次编辑

哇,这真的比我想象的要多……这变成了有史以来最长的答案……

根据您的要求,如果您只需要在存档文件夹中查找邮件,我相信您需要在搜索之前重新打开连接并连接到该特定文件夹,例如:

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。 Custom IMAP command in php

这就是我能找到的所有正式信息。

【讨论】:

  • 你把这个问题搞砸了。刚刚结束会议,现在正在挖掘您的答案。谢谢。看到如此深思熟虑的回应,我很兴奋。
  • 嗯,我希望它有所帮助,但我不会认为它是经过深思熟虑的!
  • 好交易,我不知道有一个 All Folders 文件夹,所以希望这些信息将来能帮助其他人!
  • 我认为下一个问题是,是否可以按被视为“优先”的电子邮件进行排序?
  • 这绝对值得自己提出问题...我在 imap_sort 选项中看不到任何排序选项,我认为您必须获取所有标题并进行自定义排序通过 X-Priority 头字段。但是,使用带有 FLagged 设置的 imap_search 可能会起作用:FLAGGED - 匹配设置了 \\FLAGGED(有时称为重要或紧急)标志的消息再次,值得自己提出问题。
猜你喜欢
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
  • 2015-12-03
  • 1970-01-01
  • 2022-12-28
  • 2014-08-27
  • 2019-05-28
相关资源
最近更新 更多