如何使用PHP的imap_fetchstructure()删除错误消息?

时间:2010-07-31 14:18:57

标签: php email imap mime

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

  

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

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

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

因此,我在Stackoverflow上搜索一下提示:该功能究竟是什么(我猜错误的MIME标题或内容)以及如何摆脱此错误通知?

2 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:3)

php不会发出错误,这可能就是为什么@不起作用。见下文!

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

在该库中,在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标题。

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