Как избавиться от сообщений об ошибках с помощью PHP imap_fetchstructure ()? - PullRequest
3 голосов
/ 31 июля 2010

PHP предоставляет очень полезные функции для извлечения писем из учетной записи POP3, в моем случае для обработки отказов. Однако функция imap_fetchstructure () доставляет мне головную боль. При использовании его в одном скрипте я (для некоторых писем) получаю сообщение:

Примечание: неизвестно: Предупреждение: заголовок MIME встречаются в сообщениях не MIME (errflg = 3) в поле Неизвестно в строке 0

Ошибка, сообщенная PHP, была установлена ​​на статус Bugus (http://bugs.php.net/bug.php?id=43471),, но я не могу найти подсказку по этой проблеме в документации.

Не помогает ни установка @ перед функцией, ни изменение обработчика ошибок перед функцией (и его сброс после этого). Отключение отчетов об ошибках или постоянное изменение обработчика ошибок или справки об уровне отчетов об ошибках (кажется, что ошибка вызывается в и из сценария) - однако мне нужно зарегистрировать другие ошибки, которые могут возникнуть после использования этой функции.

Поэтому я ищу подсказку в Stackoverflow: о чем конкретно оплакивает функция (я думаю, искаженный заголовок или содержимое MIME) и как мне избавиться от этого уведомления об ошибке?

Ответы [ 2 ]

9 голосов
/ 31 июля 2010

Я считаю, что сообщение об ошибке выдается, когда вы вызываете imap_close(), или, в случае отсутствия этой функции, когда скрипт заканчивается. Попробуйте вызвать imap_errors() до этого (очистить стек ошибок).

$struct = imap_fetchstructure($imap, $num);
$errs = imap_errors();
imap_close($imap);
3 голосов
/ 31 июля 2010

Ошибка не выдается php, поэтому, вероятно, @ не работает. см. Ниже!

в источнике php вы найдете функцию imap_fetchstructure() в ext / imap / php_imap.c, которая является оболочкой для 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(). Затем при отключении ресурса ошибки не отображаются, поскольку список ошибок пуст.

...