1 /* Author : Scott Holden ( scotth@thezone.net )
5 * Last Updated : Mar 20, 1999
10 #include "Pop3Client.h"
12 #include <sys/types.h>
13 #include <sys/socket.h>
14 #include <netinet/in.h>
21 struct sockaddr_in server
;
23 enum {CONNECTED
, NOT_CONNECTED
} connected
;
34 int numOfUnreadMessages
;
38 Pop3
pop3Create(void){
42 pc
= (Pop3
)malloc( sizeof(*pc
) );
45 strcpy(pc
->password
, "");
46 strcpy(pc
->userName
, "");
47 pc
->connected
= NOT_CONNECTED
;
50 pc
->numOfMessages
= 0;
51 pc
->numOfUnreadMessages
= 0;
57 int pop3MakeConnection(Pop3 pc
, char *serverName
, int port
){
59 pc
->s
= socket(AF_INET
, SOCK_STREAM
, 0 );
60 memset( &(pc
->server
), 0 , sizeof(pc
->server
));
61 pc
->server
.sin_family
= AF_INET
;
62 pc
->hp
= gethostbyname(serverName
);
65 memcpy( &(pc
->server
.sin_addr
), pc
->hp
->h_addr
, pc
->hp
->h_length
);
66 pc
->server
.sin_port
= htons(port
);
67 if ( connect(pc
->s
, (struct sockaddr
*)&(pc
->server
)
68 , sizeof(pc
->server
)) < 0 )
70 pc
->connected
= CONNECTED
;
74 int pop3IsConnected(Pop3 pc
){
76 if( pc
->connected
== CONNECTED
)
81 int pop3Login(Pop3 pc
, char *name
, char *pass
){
86 if( pc
->connected
== NOT_CONNECTED
){
87 perror("Not Connected To Server\n");
91 size
= recv(pc
->s
,&pc
->inBuf
,1024,0);
93 memcpy(temp
,pc
->inBuf
,size
);
95 fprintf(stderr
,"Error Logging in\n");
99 sprintf(pc
->outBuf
,"USER %s\r\n",name
);
100 send(pc
->s
, &pc
->outBuf
,strlen(pc
->outBuf
),0);
101 size
=recv(pc
->s
,pc
->inBuf
,1024,0);
103 memcpy(temp
,pc
->inBuf
,size
);
104 if( temp
[0] != '+' ){
105 fprintf(stderr
,"Invalid User Name\n");
109 memset(pc
->outBuf
,0,1024);
110 sprintf(pc
->outBuf
,"PASS %s\r\n",pass
);
111 send(pc
->s
, pc
->outBuf
, strlen(pc
->outBuf
),0 );
112 size
=recv(pc
->s
,&pc
->inBuf
,1024,0);
114 memcpy(temp
,pc
->inBuf
,size
);
115 if( temp
[0] != '+' ){
116 fprintf(stderr
,"Incorrect Password\n");
123 int pop3CheckMail(Pop3 pc
){
127 if( pc
->connected
== NOT_CONNECTED
)
130 /* Find total number of messages in mail box */
131 sprintf(pc
->outBuf
,"STAT\r\n");
132 send(pc
->s
, pc
->outBuf
, strlen(pc
->outBuf
),0 );
133 size
=recv(pc
->s
,pc
->inBuf
,1024,0);
135 memcpy(temp
,pc
->inBuf
,size
);
136 ptr
= strtok(temp
, " ");
137 ptr
= strtok( 0," ");
138 pc
->numOfMessages
= atoi(ptr
);
140 if( temp
[0] != '+' ){
141 perror("Error Reciving Stats");
145 sprintf(pc
->outBuf
,"LAST\r\n");
146 send(pc
->s
, pc
->outBuf
, strlen(pc
->outBuf
),0 );
147 size
=recv(pc
->s
,pc
->inBuf
,1024,0);
149 memcpy(temp
,pc
->inBuf
,size
);
150 ptr
= strtok(temp
, " ");
151 ptr
= strtok( 0," ");
152 pc
->numOfUnreadMessages
= pc
->numOfMessages
- atoi(ptr
);
154 if( temp
[0] != '+' ){
155 perror("Error Reciving Stats");
162 int pop3GetTotalNumberOfMessages( Pop3 pc
){
164 return pc
->numOfMessages
;
168 int pop3GetNumberOfUnreadMessages( Pop3 pc
){
170 return pc
->numOfUnreadMessages
;
174 int pop3Quit(Pop3 pc
){
176 if( pc
->connected
== NOT_CONNECTED
)
178 send(pc
->s
, "quit\r\n", 6,0 );
179 size
=recv(pc
->s
,&pc
->inBuf
,1024,0);
180 pc
->connected
= NOT_CONNECTED
;