diff options
Diffstat (limited to 'imap.c')
| -rw-r--r-- | imap.c | 50 | 
1 files changed, 43 insertions, 7 deletions
@@ -185,7 +185,42 @@ static int imap_is_old(int sock, struct query *ctl, int number)      return(seen);  } -static int imap_fetch(int sock, struct query *ctl, int number, int *lenp) +static int imap_fetch_headers(int sock, struct query *ctl, int number, int *lenp) +/* request nth message */ +{ +    char buf [POPBUFSIZE+1]; +    int	num; + +    /* expunges change the fetch numbers */ +    number -= deletecount; + +    switch (imap_version) +    { +    case IMAP4rev1:	/* RFC 2060 */ +	gen_send(sock, "FETCH %d BODY[HEADER]", number); +	break; + +    default:		/* RFC 1176 */ +	gen_send(sock, "FETCH %d RFC822.HEADER", number); +	break; +    } + +    /* looking for FETCH response */ +    do { +	int	ok; + +	if ((ok = gen_recv(sock, buf, sizeof(buf)))) +	    return(ok); +    } while +	(sscanf(buf+2, "%d FETCH (%*s {%d}", &num, lenp) != 2); + +    if (num != number) +	return(PS_ERROR); +    else +	return(PS_SUCCESS); +} + +static int imap_fetch_body(int sock, struct query *ctl, int number, int *lenp)  /* request nth message */  {      char buf [POPBUFSIZE+1]; @@ -208,20 +243,20 @@ static int imap_fetch(int sock, struct query *ctl, int number, int *lenp)      {      case IMAP4rev1:	/* RFC 2060 */  	if (!ctl->keep) -	    gen_send(sock, "FETCH %d BODY.PEEK[]", number); +	    gen_send(sock, "FETCH %d BODY.PEEK[TEXT]", number);  	else -	    gen_send(sock, "FETCH %d BODY", number); +	    gen_send(sock, "FETCH %d BODY[TEXT]", number);  	break;      case IMAP4:		/* RFC 1730 */  	if (!ctl->keep) -	    gen_send(sock, "FETCH %d RFC822.PEEK", number); +	    gen_send(sock, "FETCH %d RFC822.TEXT.PEEK", number);  	else -	    gen_send(sock, "FETCH %d RFC822", number); +	    gen_send(sock, "FETCH %d RFC822.TEXT", number);  	break;      default:		/* RFC 1176 */ -	gen_send(sock, "FETCH %d RFC822", number); +	gen_send(sock, "FETCH %d RFC822.TEXT", number);  	break;      } @@ -295,7 +330,8 @@ const static struct method imap =      imap_getrange,	/* query range of messages */      imap_getsizes,	/* grab message sizes */      imap_is_old,	/* no UID check */ -    imap_fetch,		/* request given message */ +    imap_fetch_headers,	/* request given message headers */ +    imap_fetch_body,	/* request given message body */      imap_trail,		/* eat message trailer */      imap_delete,	/* delete the message */      "LOGOUT",		/* the IMAP exit command */  | 
