【问题标题】:Issues using imap_* methods in PHP在 PHP 中使用 imap_* 方法的问题
【发布时间】:2014-08-28 21:11:16
【问题描述】:

我开始编写脚本来为我管理一些电子邮件,但在访问我的邮箱时遇到了一些问题。我可以使用 imap_open 正常连接,并向从它返回的流发出命令,但似乎只有 imap_status 可以正确读取电子邮件。

imap_status 方法报告邮箱中有 50 封邮件,这是正确的,但其他方法要么报告 0 封邮件,要么在访问邮箱时遇到问题,邮件为“”。

这是我的脚本;

error_reporting(E_ALL);

$imapServer = "mail.blah.co.uk";
$imapPort = 143;
$imapFolder = "INBOX";
$imapUsername = "account@blah.co.uk";
$imapPassword = "********";
$serverSpec = imap_utf7_encode ("{" . $imapServer . ":" . $imapPort . "/imap/readonly/debug/notls}" . $imapFolder);

echo "imapServer: $imapServer<br />\n";
echo "imapPort: $imapPort<br />\n";
echo "imapFolder: $imapFolder<br />\n";
echo "imapUsername: $imapUsername<br />\n";
echo "imapPassword: $imapPassword<br />\n";
echo "serverSpec: $serverSpec<br />\n";

if ($imapStream = imap_open($serverSpec, $imapUsername, $imapPassword, OP_HALFOPEN)) {

    $imapStatus = imap_status($imapStream, $serverSpec, SA_ALL);
    $imapErrors = imap_errors();
    echo("<pre>imapStatus = " . htmlspecialchars(print_r($imapStatus, TRUE)) . (is_array($imapErrors) ? "\nERRORS: " . htmlspecialchars(print_r($imapErrors, TRUE)) : "") . "</pre>");

    $imapCheck = imap_check($imapStream);
    $imapErrors = imap_errors();
    echo("<pre>imapCheck = " . htmlspecialchars(print_r($imapCheck, TRUE)) . (is_array($imapErrors) ? "\nERRORS: " . htmlspecialchars(print_r($imapErrors, TRUE)) : "") . "</pre>");

    $imapNumMsg = imap_num_msg($imapStream);
    $imapErrors = imap_errors();
    echo("<pre>imapNumMsg = " . htmlspecialchars(print_r($imapNumMsg, TRUE)) . (is_array($imapErrors) ? "\nERRORS: " . htmlspecialchars(print_r($imapErrors, TRUE)) : "") . "</pre>");

    $imapOverview = imap_fetch_overview($imapStream, "1", 0);
    $imapErrors = imap_errors();
    echo("<pre>imapOverview = " . htmlspecialchars(print_r($imapOverview, TRUE)) . (is_array($imapErrors) ? "\nERRORS: " . htmlspecialchars(print_r($imapErrors, TRUE)) : "") . "</pre>");

    $imapHeaders = imap_headers($imapStream);
    $imapErrors = imap_errors();
    echo("<pre>imapHeaders = " . htmlspecialchars(print_r($imapHeaders, TRUE)) . (is_array($imapErrors) ? "\nERRORS: " . htmlspecialchars(print_r($imapErrors, TRUE)) : "") . "</pre>");

    $imapSort = imap_sort($imapStream, SORTARRIVAL, 1, SE_UID);
    $imapErrors = imap_errors();
    echo("<pre>imapSort = " . htmlspecialchars(print_r($imapSort, TRUE)) . (is_array($imapErrors) ? "\nERRORS: " . print_r($imapErrors, TRUE) : "") . "</pre>");

    $imapMailboxMsgInfo = imap_mailboxmsginfo($imapStream);
    $imapErrors = imap_errors();
    echo("<pre>imapMailboxMsgInfo = " . htmlspecialchars(print_r($imapMailboxMsgInfo, TRUE)) . (is_array($imapErrors) ? "\nERRORS: " . htmlspecialchars(print_r($imapErrors, TRUE)) : "") . "</pre>");

    $mailboxes = imap_getmailboxes($imapStream, $serverSpec, "*");
    $imapErrors = imap_errors();
    echo("<pre>mailboxes = " . htmlspecialchars(print_r($mailboxes, TRUE)) . (is_array($imapErrors) ? "\nERRORS: " . htmlspecialchars(print_r($imapErrors, TRUE)) : "") . "</pre>");

    imap_close($imapStream);

} else {

    $imapErrors = imap_errors();
    if (is_array($imapErrors)) { echo("imap_open error: " . print_r($imapErrors, TRUE) . "<br />\n"); }

}

?>

这是输出;

imapServer: mail.blah.co.uk
imapPort: 143
imapFolder: INBOX
imapUsername: account@blah.co.uk
imapPassword: ********
serverSpec: {mail.blah.co.uk:143/imap/readonly/debug/notls}INBOX
imapStatus = stdClass Object
(
    [flags] => 31
    [messages] => 50
    [recent] => 0
    [unseen] => 0
    [uidnext] => 77
    [uidvalidity] => 1329686719
)
imapCheck = stdClass Object
(
    [Date] => Thu, 28 Aug 2014 21:40:51 +0100 (GMT Daylight Time)
    [Driver] => imap
    [Mailbox] => {mail.blah.co.uk:143/imap/notls/readonly/user="account@blah.co.uk"}<no_mailbox>
    [Nmsgs] => 0
    [Recent] => 0
)
imapNumMsg = 0
imapOverview = Array
(
)

ERRORS: Array
(
    [0] => Sequence out of range
)
imapHeaders = Array
(
)
imapSort = Array
(
)

ERRORS: Array
(
    [0] => Error in IMAP command received by server.
)
imapMailboxMsgInfo = stdClass Object
(
    [Unread] => 0
    [Deleted] => 0
    [Nmsgs] => 0
    [Size] => 0
    [Date] => Thu, 28 Aug 2014 21:40:51 +0100 (GMT Daylight Time)
    [Driver] => imap
    [Mailbox] => {mail.blah.co.uk:143/imap/notls/readonly/user="account@blah.co.uk"}<no_mailbox>
    [Recent] => 0
)
mailboxes = Array
(
    [0] => stdClass Object
        (
            [name] => {mail.blah.co.uk:143/imap/readonly/debug/notls}INBOX.Spam
            [attributes] => 64
            [delimiter] => .
        )

    [1] => stdClass Object
        (
            [name] => {mail.blah.co.uk:143/imap/readonly/debug/notls}INBOX.Drafts
            [attributes] => 64
            [delimiter] => .
        )

    [2] => stdClass Object
        (
            [name] => {mail.blah.co.uk:143/imap/readonly/debug/notls}INBOX.Sent
            [attributes] => 64
            [delimiter] => .
        )

    [3] => stdClass Object
        (
            [name] => {mail.blah.co.uk:143/imap/readonly/debug/notls}INBOX.Trash
            [attributes] => 64
            [delimiter] => .
        )

)

我在本地机器上运行的 wampserver 上运行它。看到它连接成功,我假设所有必需的模块都已经安装...

我已经搜索过信息,但我发现的大多数主题都是通过附加正确的邮箱名称或更正 serverSpec 字符串的语法来解决的。

有人知道可能出了什么问题吗?

提前致谢!

【问题讨论】:

    标签: php email imap


    【解决方案1】:

    我最终解决了这个问题,只是在阅读文档时疏忽了。

    上线

    $imapStream = imap_open($serverSpec, $imapUsername, $imapPassword, OP_HALFOPEN)
    

    OP_HALFOPEN 参数指定应该打开一个连接,而不是一个邮箱。看到连接没有可以从中读取电子邮件的 meilbox,它报告 0 封电子邮件是合乎逻辑的......虽然我不确定为什么 imap_status 的工作方式不同。也许这个功能默认使用收件箱是没有邮箱可以使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 2020-08-09
      • 2016-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多