You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
201 lines
3.9 KiB
201 lines
3.9 KiB
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include <string.h> |
|
#include "mclass.h" |
|
#include "util.h" |
|
|
|
#ifndef TRUE |
|
#define TRUE 1 |
|
#endif |
|
|
|
#ifndef FALSE |
|
#define FALSE 0 |
|
#endif |
|
|
|
// Command code |
|
#define CNULL 0 |
|
#define READ 1 |
|
#define DELETE 2 |
|
#define UNDELETE 3 |
|
#define MOVE 4 |
|
#define HELP -1 |
|
#define QUIT -2 |
|
#define HEADER -3 |
|
#define SEND -4 |
|
|
|
#define L_LINE 80 |
|
|
|
#define MAILBOX "/var/spool/mail/lynx" |
|
#define MAILBOX1 "/home/lynx/Mail/remote" |
|
#define SMTPHOST "uxmail.ust.hk" |
|
#define MENU \ |
|
"usage: <command> [msgno]\n"\ |
|
"commands: [R]ead, [D]elete, [U]ndelete, [Q]uit, [H]eaders, [S]end,\n"\ |
|
" [M]ove, [?] for Help\n" |
|
|
|
const char *list[] = { "localhost", 0 }; |
|
|
|
int command(char *ppt, unsigned long *msgno) |
|
{ |
|
char *ans = (char *)malloc(10); |
|
|
|
printf(ppt); |
|
gets(ans); |
|
switch(ans[0]) |
|
{ |
|
case 'r': |
|
ans++; |
|
*msgno = atol(ans); |
|
return READ; |
|
break; |
|
case 'd': |
|
ans++; |
|
*msgno = atol(ans); |
|
return DELETE; |
|
break; |
|
case 'u': |
|
ans++; |
|
*msgno = atol(ans); |
|
return UNDELETE; |
|
break; |
|
case '?': |
|
return HELP; |
|
break; |
|
case 'h': |
|
return HEADER; |
|
break; |
|
case 's': |
|
return SEND; |
|
break; |
|
case 'm': |
|
ans++; |
|
*msgno = atol(ans); |
|
return MOVE; |
|
break; |
|
case 'q': |
|
return QUIT; |
|
break; |
|
case '\0': |
|
return CNULL; |
|
break; |
|
default: |
|
return -9999; |
|
break; |
|
} |
|
} |
|
|
|
void compose(ENVELOPE *env, BODY *body) |
|
{ |
|
char line[L_LINE + 1]; |
|
char hostname[30]; |
|
char *text = (char *)malloc(8 * L_LINE + 1); |
|
|
|
gethostname(hostname, 30); |
|
printf("From: %s <%s@%s>\n", getGecos(), getlogin(), hostname); |
|
env->from = mail_newaddr(); |
|
env->from->personal = strdup(getGecos()); |
|
env->from->mailbox = strdup(getlogin()); |
|
env->from->host = strdup(hostname); |
|
env->return_path = mail_newaddr(); |
|
env->return_path->personal = strdup(getGecos()); |
|
env->return_path->mailbox = strdup(getlogin()); |
|
env->return_path->host = strdup(hostname); |
|
printf("To: "); |
|
gets(line); |
|
rfc822_parse_adrlist(&(env->to), line, hostname); |
|
printf("Subject: "); |
|
gets(line); |
|
env->subject = strdup(line); |
|
printf("Cc: "); |
|
gets(line); |
|
rfc822_parse_adrlist(&(env->cc), line, hostname); |
|
puts("Enter your message, . to end)"); |
|
gets(line); |
|
while(!(line[0] == '.' && line[1] == '\0')) |
|
{ |
|
strcat(text, "\n"); |
|
strcat(text, line); |
|
gets(line); |
|
} |
|
puts(text); |
|
rfc822_date(line); |
|
body->type = TYPETEXT; |
|
body->contents.text.data = text; |
|
body->contents.text.size = strlen(text); |
|
env->date = strdup(line); |
|
} |
|
|
|
|
|
void main() |
|
{ |
|
startCC(); |
|
|
|
Folder f(MAILBOX); |
|
ENVELOPE *env; |
|
BODY *body; |
|
int quit = FALSE; |
|
int cmd; |
|
unsigned long msgno; |
|
SENDSTREAM *ss; |
|
|
|
f.status(); |
|
printf(MENU); |
|
while (!quit) |
|
{ |
|
cmd = command("kmail >", &msgno); |
|
if (!f.isValid(msgno) && cmd > 0) |
|
{ |
|
printf("Bad Message Number\n"); |
|
continue; |
|
} |
|
switch (cmd) |
|
{ |
|
case READ: |
|
//printf("Date: %s\n", f.fetchDate(msgno)); |
|
//printf("From: %s\n", f.fetchFrom(msgno)); |
|
//printf("Subject: %s\n\n", f.fetchSubject(msgno)); |
|
printf("%s", f.fetchText(msgno)); |
|
break; |
|
case DELETE: |
|
f.delMsg(msgno); |
|
break; |
|
case UNDELETE: |
|
f.undelMsg(msgno); |
|
break; |
|
case QUIT: |
|
quit = TRUE; |
|
break; |
|
case HELP: |
|
printf(MENU); |
|
break; |
|
case HEADER: |
|
unsigned long int i; |
|
|
|
for (i = 1; i <= f.numMsg(); i++) |
|
printf("%ld %c %s %s %s\n", i, f.getFlag(i), f.fetchFrom(i), f.fetchDate(i), f.fetchSubject(i)); |
|
break; |
|
case SEND: |
|
env = mail_newenvelope(); |
|
body = mail_newbody(); |
|
compose(env, body); |
|
if (ss = smtp_open(list, 1)) |
|
{ |
|
if (smtp_mail(ss, "MAIL", env, body)) |
|
puts("OK"); |
|
smtp_close(ss); |
|
} |
|
else |
|
puts("FAILED"); |
|
mail_free_envelope(&env); |
|
mail_free_body(&body); |
|
break; |
|
case MOVE: |
|
f.moveDiff(MAILBOX1, msgno); |
|
break; |
|
case -9999: |
|
puts("Bad Command"); |
|
break; |
|
} |
|
} |
|
f.close(CL_EXPUNGE); |
|
}
|
|
|