在 php 网站上集成 IMAP

Posted

技术标签:

【中文标题】在 php 网站上集成 IMAP【英文标题】:Integrating IMAP on php website 【发布时间】:2015-11-27 11:15:24 【问题描述】:

我正在尝试借助 php 在我的网站上创建 IMAP 服务。它基本上只有几个步骤。

我想要的主要部分是我得到一个gmail帐户的文件夹列表,点击一个特定的文件夹,该文件夹中的邮件列表应该打开,点击任何特定的邮件,它的详细信息应该打开。

我有文件夹列表,我有邮件列表,我有邮件详细信息,但它们是独立的部分,但我希望组合并创建一个如上所述的流程。

下面给出3个步骤的代码

第 1 步 列出文件夹:它将列出gmail的所有文件夹。我的代码是

$folders = imap_list($imap, "imap.gmail.com:993/imap/ssl", "*");
echo "<ul>";
foreach ($folders as $folder) 
    $folder = str_replace("imap.gmail.com:993/imap/ssl", "", $folder);
     $folder = str_replace("[Gmail]/", "", $folder);
    echo '<li>' . $folder . '</li>';

echo "</ul>";

第1步的o/p

INBOX
DRAFT
SENT
TRASH

第 2 步 列出电子邮件(单击文件夹邮件列表应该会打开)

$numMessages = imap_num_msg($imap);

for ($i = $numMessages; $i > ($numMessages - 20); $i--)
    
        $header = imap_header($imap, $i);
        $fromInfo = $header->from[0];
        $replyInfo = $header->reply_to[0];

        $details = array(
        "fromAddr" => (isset($fromInfo->mailbox) && isset($fromInfo->host))
            ? $fromInfo->mailbox . "@" . $fromInfo->host : "",
        "fromName" => (isset($fromInfo->personal))
            ? $fromInfo->personal : "",
        "replyAddr" => (isset($replyInfo->mailbox) && isset($replyInfo->host))
            ? $replyInfo->mailbox . "@" . $replyInfo->host : "",
        "replyName" => (isset($replyTo->personal))
            ? $replyto->personal : "",
        "subject" => (isset($header->subject))
            ? $header->subject : "",
        "udate" => (isset($header->udate))
            ? $header->udate : ""
        );

    $uid = imap_uid($imap, $i);

    $datee= gmdate("F j, Y, g:i a", $details["udate"] );

    echo "<ul>";
    echo "<li><strong>From:</strong>" . $details["fromName"];
    echo " " . $details["fromAddr"] . "</li>";
    echo "<li><strong>Subject:</strong> " . $details["subject"] . "</li>";
    echo "<li><strong>DATE:</strong> " . $datee . "</li>";

     

步骤 2 的o/p(单击该邮件的特定邮件内容应该会打开)

From:ABC
Subject: TOPIC
DATE: September 2, 2015, 9:00 am

第 3 步 查看消息

$message_count = imap_num_msg($imap);

    for ($i = 1; $i <= $message_count; ++$i) 
        $header = imap_header($imap, $i);
        $body = trim(substr(imap_body($imap, $i), 0, 100));
        $prettydate = date("jS F Y", $header->udate);

        if (isset($header->from[0]->personal)) 
            $personal = $header->from[0]->personal;
         else 
            $personal = $header->from[0]->mailbox;
        

        $email = "$personal <$header->from[0]->mailbox@$header->from[0]->host>";
        echo "On $prettydate, $email said \"$body\".\n";
    

谁能告诉我如何达到上述要求

【问题讨论】:

请注意,在 Google 允许您通过 IMAP 访问电子邮件之前,您可能必须验证服务器的 IP。 (github.com/rapideinternet/php-validate-imap-ip-gmail) 【参考方案1】:

有几种方法可以做到这一点。

一种方法是:

您可以考虑使用为文件夹结构和消息列表中的项目创建超链接,然后将 javascript 函数与这些超链接相关联

改变 echo '&lt;li&gt;' . $folder . '&lt;/li&gt;';echo '&lt;li&gt;&lt;a name="' . $folder . '" onClick="listFolder(this.name)" href="#"&gt;'. $folder . '&lt;/a&gt;&lt;/li&gt;'; 将创建每个文件夹名称作为超链接,单击该超链接可以触发 javascript 函数。

您必须编写 javascript 函数,例如。 listFolder() 列出文件夹的内容。

【讨论】:

【参考方案2】:

如果您想在每次选择后不重新加载页面,则必须使用 AJAX 请求。您将需要:

1) 一个在下拉列表中列出可用文件夹的普通页面。在下拉列表中选择一个文件夹将需要触发一个执行 AJAX 请求的 Javascript 函数。

2) 然后您需要处理来自步骤 1) 的 AJAX 请求并返回一个包含所有可用消息的数据结构。在步骤 1) 中再次使用 JS 在同一页面上填充表格或列表或任何内容。

3) 最后,您需要将另一个 Javascript 方法附​​加到步骤 2) 中定义的消息,以向服务器发出另一个 AJAX 请求以返回单个消息内容,然后使用 JS 将其插入到消息窗格中步骤 1) 中的页面。

如果你想让生成 AJAX 请求变得容易,我当然可以推荐 JQuery - https://api.jquery.com/jquery.ajax/

其次,为了帮助 PHP 代码与 IMAP 服务器交互,我还强烈推荐 Fetch 库,它可以帮助您避免代码中的许多陷阱和抽象复杂性。 https://github.com/tedious/Fetch

【讨论】:

以上是关于在 php 网站上集成 IMAP的主要内容,如果未能解决你的问题,请参考以下文章

在centos集成服务器上安装imap扩展

PHP绿色集成环境在服务器上的应用,PHPWAMP在服务器上搭建网站。

PHP Paypal 标准集成

贝宝支付与 PHP 集成

使用 JAVA/PHP 将 Netbanking 集成到网站(在印度)[关闭]

Paypal与PHP逐步集成[关闭]