📄 mail.c
字号:
{
if (equalni(line, subjectlist[priority],
strlen(subjectlist[priority]) ) )
{
letter->subject = ftell(fmailbox);
subjectprior = priority;
}
priority++;
}
/*--------------------------------------------------------------------*/
/* Search for the best From: header related field */
/*--------------------------------------------------------------------*/
list = (useto) ? tolist : fromlist;
priority = 0;
while ( (fromprior > priority) && (list[priority] != NULL ))
{
if (equalni(line, list[priority],
strlen(list[priority]) ) )
{
letter->from = ftell(fmailbox);
fromprior = priority;
}
priority++;
} /* while */
/*--------------------------------------------------------------------*/
/* Search for the best Reply-To related field */
/*--------------------------------------------------------------------*/
priority = 0;
while ( (replyprior > priority) &&
(replytolist[priority] != NULL ))
{
if (equalni(line, replytolist[priority],
strlen(replytolist[priority]) ) )
{
letter->replyto = ftell(fmailbox);
replyprior = priority;
} /* if */
priority++;
} /* while */
} /* inheader */
if (fputs(line, fmailbox) == EOF )
{
printerr(tmailbox);
panic();
} /* if */
} /* while */
letters[letternum].adr = ftell(fmailbox);
letters[letternum].status = M_DELETED;
fclose(rmailbox);
fclose(fmailbox);
return letternum;
} /* CreateBox */
/*--------------------------------------------------------------------*/
/* P r i n t S u j e c t */
/* */
/* Print the subject line of one or all messages in the mailbox */
/*--------------------------------------------------------------------*/
void PrintSubject(int msgnum,int letternum)
{
struct ldesc *ld;
char from[LSIZE];
char subject[LSIZE];
char date[LSIZE];
char line[LSIZE];
int k, mink, maxk;
if (msgnum == -1)
{ /* print all of them? */
sprintf(line," %d messages in file %s.\n",letternum,mfilename);
PageLine(line);
mink = 0;
maxk = letternum - 1;
} else
mink = maxk = msgnum;
for (k = mink ; k <= maxk ; k++) {
ld = &letters[k];
if ((ld->status == M_DELETED) && (msgnum == -1))
continue;
ReturnAddress(from,ld); /* Get return address for letter */
/* Date: Wed May 13 23:59:53 1987 */
*date = '\0'; /* default date to null */
if (RetrieveLine(ld->date, date, LSIZE)) {
sscanf(date, "%*s %*s %s %s", line, subject);
sprintf(date, "%s %s", line, subject);
}
strcpy(subject, "--- no subject ---");
if (RetrieveLine(ld->subject, line, LSIZE)) {
register char *sp;
sp = line;
while (!isspace(*sp))
sp++;
while (isspace(*sp))
sp++;
strcpy(subject, sp);
}
/* make sure the fields aren't too long */
from[25] = '\0';
date[6] = '\0';
subject[30] = '\0';
sprintf(line, "%3d%c %6s %-25s %-30s (%5ld)\n", k + 1,
((ld->status == M_DELETED) ? '*' : ' '),
date, from, subject, ld->lines);
if (PageLine(line))
break;
}
} /*PrintSubject*/
/*--------------------------------------------------------------------*/
/* U p d a t e M a i l b o x */
/* */
/* Update the permanent mailbox for the user */
/*--------------------------------------------------------------------*/
void UpdateMailbox(int letternum, boolean postoffice)
{
int current;
boolean changed = FALSE;
boolean problem = FALSE;
FILE *fmailbag;
FILE *mbox = NULL;
char *mboxname = NULL;
long newsize;
time_t newage;
size_t msave = 0;
size_t psave = 0;
/*--------------------------------------------------------------------*/
/* Auto save into user's home directory mailbox if we were */
/* reading the system mailbox and the user specified the */
/* 'save' option. */
/*--------------------------------------------------------------------*/
postoffice = postoffice && bflag[F_SAVE];
/*--------------------------------------------------------------------*/
/* Determine if anything was actually changed in the mailbox */
/*--------------------------------------------------------------------*/
for (current = 0;
(current < letternum) && (! changed);
current++)
{
if (letters[current].status == M_DELETED)
changed = TRUE;
if (postoffice && (letters[current].status != M_UNREAD))
changed = TRUE;
}
if (!changed)
return;
/*--------------------------------------------------------------------*/
/* Determine if the mailbox has changed since we built our */
/* temporary file */
/*--------------------------------------------------------------------*/
newage = stater( mfilename , &newsize );
if ( mboxsize != newsize )
{
printf("%s size has changed from %ld to %ld bytes\n",
mfilename, mboxsize, newsize );
problem = TRUE;
}
if ( mboxage != newage )
{
char mboxbuf[DATEBUF];
char newbuf[DATEBUF];
printf("%s date stamp has changed from %s to %s\n",
mfilename, dater(mboxage, mboxbuf), dater(newage, newbuf) );
problem = TRUE;
}
while ( problem )
{
int c;
printf("WARNING! File %s has changed, data may be lost if updated!\n",
mfilename);
fputs("Update anyway? ",stdout);
c = Get_One();
switch (tolower( c ))
{
case 'y':
puts("Yes");
problem = FALSE;
break;
case 'n':
printf("No\nUpdate aborted, %s left unchanged.\n",
mfilename);
return;
default:
printf("%c - Invalid Response\n",c);
break;
} /* switch */
} /* while ( problem ) */
/*--------------------------------------------------------------------*/
/* Allocate auto save related variables */
/*--------------------------------------------------------------------*/
if (postoffice)
{
mboxname = malloc(FILENAME_MAX);
checkref(mboxname);
strcpy( mboxname, "mbox" );
expand_path( mboxname, E_homedir, E_homedir, E_mailext );
} /* if (postoffice) */
/*--------------------------------------------------------------------*/
/* Create a backup file if needed */
/*--------------------------------------------------------------------*/
if ( bflag[F_BACKUP] )
filebkup( mfilename );
/*--------------------------------------------------------------------*/
/* Begin re-writing the mailbox */
/*--------------------------------------------------------------------*/
if ((fmailbag = FOPEN(mfilename, "w",TEXT_MODE)) == nil(FILE))
{
printf("UpdateMailbox: can't rewrite %s.\n", mfilename);
Cleanup();
} /* if */
setvbuf(fmailbag, NULL, _IOFBF, 8192);
/*--------------------------------------------------------------------*/
/* We got the files open, now actually loop through copying */
/* data from our temporary mailbox back into the permenent one, */
/* or in the user's mbox if he read the message and the post */
/* office is open. */
/*--------------------------------------------------------------------*/
printf("Cleaning up ", current+ 1);
for (current = 0; current < letternum; current++)
{
if (letters[current].status == M_DELETED)
{
/* No operation */
fputc('.', stdout);
}
else if (postoffice && (letters[current].status != M_UNREAD))
{
if ( mbox == NULL ) /* Mailbox already open? */
{ /* No --> Do so now */
mbox = FOPEN(mboxname, "a",TEXT_MODE);
if (mbox == NULL) /* Open fail? */
{ /* Yes --> Disable postoffice autosave*/
printf("\nUpdateMailbox: can't append to %s.\n", mboxname);
postoffice = FALSE;
current--; /* Process this entry again */
} /* if */
else
setvbuf(mbox, NULL, _IOFBF, 8192);
} /* if ( mbox == NULL ) */
if ( mbox != NULL )
{
fputc('+', stdout);
CopyMsg(current, mbox, seperators, FALSE);
msave++;
} /* mbox */
}
else {
fputc('*', stdout);
CopyMsg(current, fmailbag, seperators, FALSE);
psave ++;
} /* else */
} /* for */
fputs(" done!\n", stdout);
/*--------------------------------------------------------------------*/
/* Close the post office. We close the 'mbox' in the user's */
/* home directory, report if any data was saved in it, and */
/* then free the storage associated with the postoffice processing.*/
/*--------------------------------------------------------------------*/
if ( postoffice )
{
if (msave > 0) /* Did we write data into mailbox? */
{ /* Yes --> Report it */
fclose(mbox);
printf("%d letter%s saved in %s%s",
msave,
(msave > 1) ? "s" : "" ,
mboxname,
(psave > 0) ? ", " : ".\n");
}
free(mboxname);
} /* if (postoffice) */
/*--------------------------------------------------------------------*/
/* Now, clean up after the input mailbox. We close it, and */
/* report when anything was saved into it. If nothing was */
/* saved, we delete the file if the 'purge' option is active. */
/*--------------------------------------------------------------------*/
fclose(fmailbag);
if (psave > 0)
printf("%d letter%s held in %s.\n",
psave ,
(psave > 1) ? "s" : "" , mfilename);
else if (bflag[F_PURGE] )
{
remove(mfilename);
printf("Empty mail box %s has been deleted.\n", mfilename);
}
} /* UpdateMailbox */
/*--------------------------------------------------------------------*/
/* U s a g e */
/* */
/* Report command line syntax */
/*--------------------------------------------------------------------*/
static void usage( void )
{
puts("\nUsage:\tmail [-s subject] recipient ... "
"[-c recipient ...] [-b receipient ...]\n"
"\tmail [-f mailbox] [-u user] [-t] [-p] [-x debug]");
exit(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -