使用 Zend 框架阅读 gmail

Posted

技术标签:

【中文标题】使用 Zend 框架阅读 gmail【英文标题】:Read gmail with Zend Framework 【发布时间】:2012-04-12 09:18:21 【问题描述】:

我正在尝试使用 Zend 框架从 gmail 应用程序帐户读取邮件。我刚刚将 Zend Framework 目录转移到我的服务器(路径:/Zend/library/)。

如何加载 Zend Framework 和 Mail 模块?以及如何进一步阅读邮件?

我尝试了以下方法,但没有结果:

$path = 'Zend/library/';
set_include_path(get_include_path() . PATH_SEPARATOR . $path);

我相信阅读收件箱的语法类似于:

$mail = new Zend_Mail_Storage_Imap(array('host' => 'imap.gmail.com', 'user' => "name@domain.com", 'password' => "mypassword", 'ssl' => 'SSL'));

编辑

以下代码有效:

$path = 'Zend/library/';
set_include_path(get_include_path() . PATH_SEPARATOR . $path);

require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance();

$mail = new Zend_Mail_Storage_Imap(array('host'     => 'imap.gmail.com',
                                         'user'     => 'mail@domain.com',
                                         'password' => 'password',
                                         'ssl'      => 'SSL'));
echo $mail->countMessages();`

...但是当我尝试回显未读电子邮件时:

echo "Unread mails:\n";
foreach ($mail as $message) 
    if ($message->hasFlag(Zend_Mail_Storage::FLAG_SEEN)) 
        continue;
    
    // mark recent/new mails
    if ($message->hasFlag(Zend_Mail_Storage::FLAG_RECENT)) 
        echo '! ';
     else 
        echo '  ';
    
    echo $message->subject . "\n";

我收到以下消息:

Fatal error: Uncaught exception 'Zend_Mail_Storage_Exception' with message 'cannot login, user or password wrong' in /var/www/zvinx.dk/test/Zend/library/Zend/Mail/Storage/Imap.php:279 Stack trace: #0 /var/www/zvinx.dk/test/gmail.php(11): Zend_Mail_Storage_Imap->__construct(Array) #1 main thrown in /var/www/zvinx.dk/test/Zend/library/Zend/Mail/Storage/Imap.php on line 279

它说用户名或密码错误,这很奇怪,因为我没有从它工作的时候更改它......为什么会出现这个错误?

【问题讨论】:

嗯,对我来说,错误信息非常明显cannot login, user or password wrong 确实——但是当我只是回显消息的数量时它工作正常,但在尝试回显未读消息时却不行。至少对我来说没有任何意义.. 尝试添加端口我猜端口是995 你在 gmail 上启用 imap 了吗? 是的.. 我不明白如何在我的收件箱中获取我的电子邮件数量,但是当我尝试回显这些消息时,它说登录失败 【参考方案1】:

gmail 设置有点棘手。试试:

$mail = new Zend_Mail_Storage_Imap(array('host'     => 'imap.gmail.com',
                                         'user'     => 'mail@domain.com',
                                         'port'     => '993',
                                         'password' => 'password',
                                         'ssl'      => 'tls',
                                         'auth'     => 'login'
                                          ));

注意:gmail 使用的 SSL/TLS 协议显然与标准 SSL 不同。

【讨论】:

@Greg Forbes 我收到“无法连接到主机;错误 = 连接超时 (errno = 110)”错误。我该怎么办【参考方案2】:

您真的认为不阅读/学习框架基础知识就可以开始使用 Zend 框架吗?至少看一下quickstart,了解如何使用具有自动加载功能的框架,然后深入了解Zend_Mail documentation,更具体地说是“Reading Mail Messages”部分

【讨论】:

感谢链接 - 我现在几乎可以正常工作了。我已经用新问题更新了问题。【参考方案3】:

我使用登录设置通过 IMAP 阅读电子邮件并转储附件

public function imapAction()

    $config = array('host'=> 'imap.gmail.com', 
        'user' => 'xx',
        'password' => 'xx',
        'ssl' => 'SSL',
        'port' => 993);//995 pop, imap 993

    $mail = new Zend_Mail_Storage_Imap($config);
    $maxMessage = $mail->countMessages();
    $this->logger->info($maxMessage);

    for ($i = $maxMessage; $i <= $maxMessage; $i++)
    
        $message = $mail->getMessage($i);
        $this->logger->info($i.'Mail from '.$message->from.':'.$message->subject);

        if($message->isMultipart())
        
            $this->logger->info("has attachments");
            $part = $message->getPart(2);

            $cnt_typ = explode(";" , $part->contentType);
            $name    = explode("=",$cnt_typ[1]);
            $filename   = $name[1];//It is the file name of the attachement in browser
            //This for avoiding " from the file name when sent from yahoomail
            $filename   = str_replace('"'," ",$filename);
            $this->logger->info($filename);

            $attachment = base64_decode($part->getContent());
            $fhandle = fopen($filename, 'w');
            fwrite($fhandle, $attachment);
            fclose($fhandle);
        
    

【讨论】:

【参考方案4】:

我遇到了同样的问题,这个说明对我有帮助。

    退出所有正在访问受影响的 Gmail 帐户的邮件客户端。这意味着 iPhone 上的 Mail 应用程序以及您从计算机访问 Gmail 的任何其他地方。

    打开浏览器并导航到此页面:http://www.google.com/accounts/DisplayUnlockCaptcha

    输入您的完整 Gmail 地址、密码并输入您在图片中看到的字符。触摸解锁按钮以验证您的帐户。

    尝试使用 Zend Framework 从 gmail 应用程序帐户读取邮件。您的 Gmail 访问权限应该会恢复。

【讨论】:

【参考方案5】:

如果您遇到此错误并且您 100% 确定您提供的密码可能来自您在 Google 帐户上设置的 2 因素身份验证。

Google help 给出了在这种情况下应该做什么的指示。我设法通过在我的情况下生成 AppPassword 来访问我的帐户

【讨论】:

以上是关于使用 Zend 框架阅读 gmail的主要内容,如果未能解决你的问题,请参考以下文章

通过 Gmail smtp 服务器使用 Zend_Mail 发送邮件

如何使用 zend 框架创建站点地图?

无法使用 gmail SMTP 在 Zend 中发送电子邮件。出现致命错误:未捕获的异常“Zend_Mail_Protocol_Exception”。如何解决这个问题?

如何在不安装 Zend 框架的情况下使用 Zend 库

使用 zend 框架安装和使用学说

如何使用 zend from 在 zend 框架 2 中添加自定义属性