/************************************************************************** * * * meetmail - mailinglist / conference e-mail modifier * * * * Developed by Ondrej Jombik * * * * Copyright (c) 1999-2000 Condy software inc. * * Copyright (c) 2001-2006 Platon Group, http://platon.sk/ * * All rights reserved. * * * * Updates: * * 2000-07-17, 2000-09-15, 2000-10-05 * * 2001-01-19 - added 'Errors-To' header handling * * 2001-03-05 - fixed bug with empty 'Subject' line * * 2001-04-19 - changed name from 'konfmail' to 'meetmail' * * 2001-05-14 - fixed bug with CONFFILENAMESIZE * * 2003-01-03 - import into CVS; project 'libplaton' directory 'utils' * * - made meetmail to work with libplaton library * * 2003-04-20 - numerous tiny fixes and code cleanups * * 2006-01-22 - skip signature appending when base64 encoding is used * * * **************************************************************************/ #include #include #include #include #include #ifndef __PRGVERSION__ # define __PRGVERSION__ "0.3.5a" #endif #define MEETMAILSTR \ "Meetmail " __PRGVERSION__ " by Ondrej Jombik " #define REPLYTOSTR "Reply-To:" #define SUBJECTSTR "Subject:" #define ERRORSTOSTR "Errors-To:" #define XCONFSOFTSTR "X-Conference-Software:" #define CTESTRANDVAL "Content-Transfer-Encoding: base64" #define XOLDSTR "X-Old" #define DEFSUBJECTSTR "(ziadny predmet)" #define BUFSIZE 501 #define CONFNAMESIZE 30 #define CONFERRORSTOSIZE 50 #define CONFADDRESSSIZE 50 #define CONFFILENAMESIZE 250 int main(int argc, char **argv) { /* Buffers */ char buf[BUFSIZE], confname[CONFNAMESIZE+1], conferrorsto[CONFERRORSTOSIZE+1], confaddress[CONFADDRESSSIZE+1], conffilename[CONFFILENAMESIZE+1]; /* Flags */ unsigned char fLastBufWasEOL = 0, fErrorsToModified = 0, fReplyToModified = 0, fSubjectModified = 0, fXConfSoftModified = 0, fAppendSignature = 1; int eol_count = 0; FILE *f; /* Information and help */ if (argc < 3) { printf("meetmail - MS-Dos/UNIX conference e-mail modifier" " v%s / %s %s\n",__PRGVERSION__,__DATE__,__TIME__); puts("Developed by Ondrej Jombik, " \ "e-mail: nepto@platon.sk, web: http://nepto.org/"); puts("Copyright (c) 2001-2006 Platon Group, http://platon.org/, " "All rights reserved."); puts("\nUsage: meetmail " "[
] []"); puts("default address: name@pobox.sk, " \ "default infofile: conf.name.txt"); return 1; } /* confname */ strncpy(confname, argv[1], CONFNAMESIZE); confname[CONFNAMESIZE] = '\0'; /* confadminemail */ strncpy(conferrorsto, argv[2], CONFERRORSTOSIZE); confname[CONFERRORSTOSIZE] = '\0'; /* confaddress */ if (argc > 3) { strncpy(confaddress, argv[3], CONFADDRESSSIZE); } else { strncpy(confaddress, argv[1], CONFADDRESSSIZE); confaddress[CONFADDRESSSIZE] = '\0'; strncpy(strchr(confaddress, '\0'), "@pobox.sk", CONFADDRESSSIZE - strlen(confaddress)); } confaddress[CONFADDRESSSIZE] = '\0'; strlwr(confaddress); /* conffilename */ if (argc > 4) { strncpy(conffilename, argv[4], CONFFILENAMESIZE); } else { strncpy(conffilename, "conf.", CONFFILENAMESIZE); conffilename[CONFFILENAMESIZE] = '\0'; strncpy(strchr(conffilename, '\0'), argv[1], CONFFILENAMESIZE - strlen(conffilename)); conffilename[CONFFILENAMESIZE] = '\0'; strncpy(strchr(conffilename, '\0'), ".txt", CONFFILENAMESIZE - strlen(conffilename)); } conffilename[CONFFILENAMESIZE] = '\0'; strlwr(conffilename); /* E-mail headers alternation ("Subject:", "Reply-to:") */ while (fgets(buf, BUFSIZE, stdin) != NULL) { if (stristr(buf, CTESTRANDVAL) == buf) { fAppendSignature = 0; } /* Subject modification */ if (strstr(buf, SUBJECTSTR) == buf) { char*pom; if ((pom = (char*)malloc(strlen(confname)+2+1)) == NULL) { #if DEBUG fprintf(stderr,"main() WARNING: malloc() allocation error.\n"); #endif pom=confname; } else { strcpy(pom,"["); strcpy(strchr(pom,'\0'),confname); strcpy(strchr(pom,'\0'),"]"); } if (strstr(buf, pom) == NULL) { fputs(SUBJECTSTR,stdout); fputc(' ',stdout); fputs(pom,stdout); fputs(strestr(buf,SUBJECTSTR),stdout); } else fputs(buf,stdout); fSubjectModified = 1; if (pom != NULL) free(pom); } else if (stristr(buf, REPLYTOSTR) == buf) { /* Header "Reply-to:" found */ fputs(REPLYTOSTR,stdout); fputc(' ',stdout); fputs(confaddress,stdout); fputc('\n',stdout); fputs(XOLDSTR, stdout); fputc('-', stdout); fputs(buf, stdout); fReplyToModified=1; } else if (stristr(buf, ERRORSTOSTR) == buf) { /* Header "Errors-To:" found */ fputs(ERRORSTOSTR, stdout); fputc(' ', stdout); fputs(conferrorsto, stdout); fputc('\n', stdout); fputs(XOLDSTR, stdout); fputc('-', stdout); fputs(buf, stdout); fErrorsToModified=1; } else if (stristr(buf, XCONFSOFTSTR) == buf) { /* Header "X-Conference-Software:" found */ fputs(XCONFSOFTSTR,stdout); fputc(' ',stdout); fputs(MEETMAILSTR, stdout); fputc('\n',stdout); if (strchr(buf, '-') != NULL) { fputs(XOLDSTR, stdout); fputs(strchr(buf, '-'), stdout); } fXConfSoftModified=1; } else { if (! strcmp(buf, "\n")) break; fputs(buf, stdout); } } /* Adding "Subject:" header if missing */ if (! fSubjectModified) { fputs(SUBJECTSTR, stdout); fputc(' ', stdout); fputc('[', stdout); fputs(confname, stdout); fputc(']', stdout); fputc(' ', stdout); fputs(DEFSUBJECTSTR, stdout); fputc('\n', stdout); } /* Adding "Reply-to:" header if missing */ if (! fReplyToModified) { fputs(REPLYTOSTR,stdout); fputc(' ',stdout); fputs(confaddress,stdout); fputc('\n',stdout); } /* Adding "X-Conference-Software:" header if missing */ if (! fXConfSoftModified) { fputs(XCONFSOFTSTR,stdout); fputc(' ',stdout); fputs(MEETMAILSTR,stdout); fputc('\n',stdout); } /* Adding "Errors-To:" header if missing */ if (! fErrorsToModified) { fputs(ERRORSTOSTR, stdout); fputc(' ', stdout); fputs(conferrorsto, stdout); fputc('\n', stdout); } fputc('\n',stdout); /* E-mail message copying */ while (fgets(buf, BUFSIZE, stdin) != NULL) { fLastBufWasEOL = strchr(buf, '\n') != NULL ? 1 : 0; if (strchr(buf, '\n') == buf) { eol_count++; } else { for (; eol_count > 0; eol_count--) fputc('\n', stdout); fputs(buf, stdout); } } if (fAppendSignature) { /* End of e-mail message altering and preparing e-mail conference informational text adding */ if (!fLastBufWasEOL) fputc('\n',stdout); /* Adding info text from file */ if ((f = fopen(conffilename, "rt")) != NULL) { while (fgets(buf,BUFSIZE,f) != NULL) fputs(buf, stdout); fclose(f); } else { fprintf(stdout, "\n\n--\nMeetmail WARNING: " "Cannot open conference signature file '%s'.", conffilename); fputs("\nPlease, notice your conference administrator" " with this problem.\n", stdout); } /* Warning text if already altered e-mail was modified */ if (fXConfSoftModified) { fputs("\n\n--\nMeetmail WARNING: " "E-mail message was already modified.", stdout); fputs("\nPlease, notice your conference administrator" " with this problem.\n", stdout); } } return 0; }