错误不是由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() 查询和清空。然后,在关闭资源时,由于错误列表为空,因此不会显示错误。