【问题标题】:How to get rid of error messages with PHP's imap_fetchstructure()?如何使用 PHP 的 imap_fetchstructure() 消除错误消息?
【发布时间】:2011-03-23 15:36:40
【问题描述】:

PHP 提供了非常有用的函数来从 POP3 帐户获取电子邮件,在我的例子中是处理退回邮件。然而,函数 imap_fetchstructure() 让我头疼。在一个脚本中使用它时,我(对于某些邮件)会收到消息:

注意:未知:警告:MIME 标头 在非 MIME 消息中遇到 (errflg=3) 在第 0 行的 Unknown

向 PHP 报告的错误已设置为状态 Bugus (http://bugs.php.net/bug.php?id=43471),但我无法在文档中找到有关此问题的线索。

在函数之前放置 @ 或者在函数之前更改错误处理程序(并在之后重置它)都没有帮助。关闭错误报告或永久更改错误处理程序或错误报告级别帮助(似乎错误是在脚本的和触发的)-但是,我需要注册使用此功能后可能发生的其他错误。

因此,我在 Stackoverflow 上搜索提示:该函数究竟在哀悼什么(我猜是格式错误的 MIME 标头或内容)以及如何摆脱此错误通知?

【问题讨论】:

    标签: php email imap mime


    【解决方案1】:

    我相信当您调用 imap_close() 时会发出错误消息,或者在没有该函数的情况下,当脚本结束时会发出错误消息。在此之前尝试调用imap_errors()(以清除错误堆栈)。

    $struct = imap_fetchstructure($imap, $num);
    $errs = imap_errors();
    imap_close($imap);
    

    【讨论】:

    • 这是一个完美的解决方案!我不知道 imap_errors() 但它解决了很多问题。谢谢! (评价这个答案必须等到我获得足够的声誉......)
    【解决方案2】:

    错误不是由php发出的,这可能是@不起作用的原因。见下文!

    在 php 源代码中,您会在 ext/imap/php_imap.c 中找到函数 imap_fetchstructure(),它是 mail_fetchstructure_full() 的包装器,它是 c-client 库的一部分。

    在那个库中,在 c-client/rfc822.c 中有一段有趣的段落:

      case 'C':                 /* possible cc: or Content-<mumble>*/
        if (!strcmp (tmp+1,"C")) rfc822_parse_adrlist (&env->cc,d,host);
        else if ((tmp[1] == 'O') && (tmp[2] == 'N') && (tmp[3] == 'T') &&
                 (tmp[4] == 'E') && (tmp[5] == 'N') && (tmp[6] == 'T') &&
                 (tmp[7] == '-') && body)
          switch (MIMEp) {
          case -1:              /* unknown if MIME or not */
            if (!(MIMEp =       /* see if MIME-Version header exists */
                  search ((unsigned char *) s-1,i,
                          (unsigned char *)"\012MIME-Version",(long) 13))) {
    #if 1
             /* This is a disgusting kludge, and most of the messages which
               * benefit from it are spam.
               */
              if (!strcmp (tmp+8,"TRANSFER-ENCODING") ||
                  (!strcmp (tmp+8,"TYPE") && strchr (d,'/'))) {
                MM_LOG ("Warning: MIME header encountered in non-MIME message",
                        PARSE);
                MIMEp = 1;      /* declare MIME now */
              }
              else
    #endif
    

    根据grep,这是唯一产生错误的地方。这解释了我认为的大部分谜团。

    因此,您有一条带有 CONTENT-TRANSFER-ENCODING 或 CONTENT-TYPE 行的消息,没有 MIME-Version 标头。

    edit MM_LOG 被定义为 mm_log,而后者又是 php/ext/imap/php_imap.c 提供的一个函数。来自 imap_fetchstructure() 的错误被放入一个错误列表(它们不是直接输出!)您可以使用imap_errors() 查询和清空。然后,在关闭资源时,由于错误列表为空,因此不会显示错误。

    【讨论】:

    • 谢谢!我没有考虑过检查这个错误的 PHP 源代码,但这解释了很多手册没有披露的内容。
    猜你喜欢
    • 1970-01-01
    • 2022-11-02
    • 2011-05-26
    • 2013-11-10
    • 1970-01-01
    • 2020-03-12
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多