OK, did a little digging and it seems that it is not (necessarily) PHP that
doesn't support the x.HEADER/x.TEXT syntax...  The c-client function called
by imap_fetchbody function calls mail_fetchbody_full (alias for
mail_fetch_body) which _does not_ support the above syntax since it only
expects integers in the section specification.  The x.0 syntax for
retrieving the header is supported through a special check (read 'hack') in
mail_fetch_body, and appears as though it only exists for BC.  In fact, that
special case calls mail_fetch_header the same as the funtion I posted does.
However, if you wanted c-client/IMAP to filter the header fields returned to
you (ie. you only want From and To headers), you cannot do that with
imap_fetchbody, even though mail_fetch_header supports it.  To do that with
the new function you could do the following:

  $headers = imap_fetch_header($mbox, 1, '2', Array('To', 'From'), FT_PEEK);

Anyway, I have attached an updated diff with a couple of minor modifications
like c-style comments, tab indenting.  If anyone thinks this is work
committing, feel free.

-Brad

Markus Fischer wrote:

> On Wed, Feb 27, 2002 at 12:16:47PM +0900, Yasuo Ohgaki wrote :
> > Brad Fisher wrote:
> > >This is a function I wrote a while back so I could access more of the
> > >headers available in a mail message.  The imap_headers and
> > >imap_fetchheaders functions work fine for retrieving headers for the
> > >main body of a given message, but if you receive an email with an
> > >attachment which is itself an email message  (ie. mime type
> > >'message/rfc822'), you can use this function to retrieve the (raw)
> >
> >
> > Could you post unified diff against latest CVS? (HEAD branch)
>
>     "I don't think it is the c-Client lib that is broken here,
>     but the PHP implementation."
>
>     If that's true and someone can actually verify this I wold
>     not hesitate and commit this but first fix the extension if
>     the c-client library really supports it already.
>
> --
> Please always Cc to me when replying to me on the lists.
> GnuPG Key: http://guru.josefine.at/~mfischer/C2272BD0.asc
Index: ext/imap/php_imap.c
===================================================================
RCS file: /repository/php4/ext/imap/php_imap.c,v
retrieving revision 1.111
diff -u -r1.111 php_imap.c
--- ext/imap/php_imap.c 12 Jan 2002 05:39:07 -0000      1.111
+++ ext/imap/php_imap.c 28 Feb 2002 00:40:44 -0000
@@ -91,6 +91,7 @@
        PHP_FE(imap_bodystruct,                                                 NULL)
        PHP_FE(imap_fetchbody,                                                  NULL)
        PHP_FE(imap_fetchheader,                                                NULL)
+       PHP_FE(imap_fetch_header,                                               NULL) 
        PHP_FE(imap_fetchstructure,                                             NULL)
        PHP_FE(imap_expunge,                                                    NULL)
        PHP_FE(imap_delete,                                                            
 NULL)
@@ -2582,6 +2583,92 @@
        RETVAL_STRING(mail_fetchheader_full(imap_le_struct->imap_stream, 
Z_LVAL_PP(msgno), NIL, NIL, (myargc == 3 ? Z_LVAL_PP(flags) : NIL)), 1);
 }
 /* }}} */
+
+
+
+/* {{{ proto string imap_fetch_header(int stream_id, int msg_no [, string section [, 
+array lines [, int options]]])
+   Get the (optionally filtered) header for a given section of a message */
+PHP_FUNCTION(imap_fetch_header)
+{
+/*
+   NOTE: You need to explicitly set FT_PEEK to not mark message as READ when calling 
+this function.
+   Empty strings are ignored in the lines array.
+*/
+       zval **streamind, **msgno, **sec = NIL, **lines = NIL, **flags, **tmp;
+       int i, msgindex, myargc = ZEND_NUM_ARGS();
+       pils *imap_le_struct;
+       HashPosition pos;
+       STRINGLIST *cur_lines = NIL, *cur;
+
+       if (myargc < 2 ||
+               myargc > 5 ||
+               zend_get_parameters_ex(myargc, &streamind, &msgno, &sec, &lines, 
+&flags) == FAILURE)
+       {
+               ZEND_WRONG_PARAM_COUNT();
+       } /*if*/
+
+       convert_to_long_ex(msgno);
+
+       if (myargc > 2) {
+               convert_to_string_ex(sec);
+       } /*if*/
+
+       /* Convert the <lines> array to a STRINGLIST */
+       if (myargc > 3) {
+               convert_to_array_ex(lines);
+
+               zend_hash_internal_pointer_reset_ex((*lines)->value.ht, &pos);
+               while (zend_hash_get_current_data_ex((*lines)->value.ht, (void **) 
+&tmp, &pos) == SUCCESS) {
+                       convert_to_string_ex(tmp);
+
+                       /* Only add to the filter list if not an empty string */
+                       if (*Z_STRVAL_PP(tmp)) {
+                               if (cur_lines) {
+                                       cur->next = mail_newstringlist();
+                                       cur = cur->next;
+                               } else {
+                                       cur_lines = mail_newstringlist();
+                                       cur = cur_lines;
+                               } /*if*/
+
+                               cur->LSIZE = (*tmp)->value.str.len;
+                               cur->LTEXT = (char*) cpystr((*tmp)->value.str.val);
+                       } /*if*/
+
+                       zend_hash_move_forward_ex((*lines)->value.ht, &pos);
+               } /*while*/
+       } /*if*/
+
+       if (myargc == 5) {
+               convert_to_long_ex(flags);
+       } /*if*/
+
+       ZEND_FETCH_RESOURCE(imap_le_struct, pils *, streamind, -1, "imap", le_imap);
+
+       if ((myargc == 5) && (Z_LVAL_PP(flags) & FT_UID)) {
+               /* This should be cached; if it causes an extra RTT to the
+                  IMAP server, then that's the price we pay for making sure
+                  we don't crash. */
+               msgindex = mail_msgno(imap_le_struct->imap_stream, Z_LVAL_PP(msgno));
+       } else {
+               msgindex = Z_LVAL_PP(msgno);
+       } /*if*/
+
+       if ((msgindex < 1) || ((unsigned) msgindex > 
+imap_le_struct->imap_stream->nmsgs)) {
+               php_error(E_WARNING, "Bad message number");
+               RETURN_FALSE;
+       } /*if*/
+
+       /* Perform the header fetch */
+       RETVAL_STRING(mail_fetch_header(imap_le_struct->imap_stream, Z_LVAL_PP(msgno), 
+Z_STRVAL_PP(sec),
+                                                                       cur_lines, 
+NIL, myargc==5 ?  Z_LVAL_PP(flags) : NIL), 1);
+
+       /* Free the temporary string list */
+       mail_free_stringlist(&cur_lines);
+} /* PHP_FUNCTION(imap_fetch_header) */
+/* }}} */
+
+
 
 /* {{{ proto int imap_uid(int stream_id, int msg_no)
    Get the unique message id associated with a standard sequential message number */
Index: ext/imap/php_imap.h
===================================================================
RCS file: /repository/php4/ext/imap/php_imap.h,v
retrieving revision 1.16
diff -u -r1.16 php_imap.h
--- ext/imap/php_imap.h 11 Dec 2001 15:29:38 -0000      1.16
+++ ext/imap/php_imap.h 28 Feb 2002 00:40:44 -0000
@@ -149,6 +149,7 @@
 PHP_FUNCTION(imap_setflag_full);
 PHP_FUNCTION(imap_clearflag_full);
 PHP_FUNCTION(imap_sort);
+PHP_FUNCTION(imap_fetch_header);
 PHP_FUNCTION(imap_fetchheader);
 PHP_FUNCTION(imap_fetchtext);
 PHP_FUNCTION(imap_uid);

-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to