summaryrefslogtreecommitdiffstats
path: root/util/bbsmail.c
diff options
context:
space:
mode:
authorin2 <in2@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2002-03-07 23:13:44 +0800
committerin2 <in2@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2002-03-07 23:13:44 +0800
commitae31e19f92e717919ac8e3db9039eb38d2b89aae (patch)
treec70164d6a1852344f44b04a653ae2815043512af /util/bbsmail.c
downloadpttbbs-ae31e19f92e717919ac8e3db9039eb38d2b89aae.tar
pttbbs-ae31e19f92e717919ac8e3db9039eb38d2b89aae.tar.gz
pttbbs-ae31e19f92e717919ac8e3db9039eb38d2b89aae.tar.bz2
pttbbs-ae31e19f92e717919ac8e3db9039eb38d2b89aae.tar.lz
pttbbs-ae31e19f92e717919ac8e3db9039eb38d2b89aae.tar.xz
pttbbs-ae31e19f92e717919ac8e3db9039eb38d2b89aae.tar.zst
pttbbs-ae31e19f92e717919ac8e3db9039eb38d2b89aae.zip
Initial revision
git-svn-id: http://opensvn.csie.org/pttbbs/pttbbs/trunk/pttbbs@1 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
Diffstat (limited to 'util/bbsmail.c')
-rw-r--r--util/bbsmail.c239
1 files changed, 239 insertions, 0 deletions
diff --git a/util/bbsmail.c b/util/bbsmail.c
new file mode 100644
index 00000000..48f74c63
--- /dev/null
+++ b/util/bbsmail.c
@@ -0,0 +1,239 @@
+/* $Id: bbsmail.c,v 1.1 2002/03/07 15:13:45 in2 Exp $ */
+
+#define _BBS_UTIL_C_
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <time.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include "config.h"
+#include "pttstruct.h"
+#include "util.h"
+#include "perm.h"
+#include "common.h"
+
+#define LOG_FILE (BBSHOME "/etc/mailog")
+
+#ifdef HMM_USE_ANTI_SPAM
+extern char *notitle[], *nofrom[], *nocont[];
+#endif
+
+extern userec_t xuser;
+
+int mailalertuid(int tuid)
+{
+ userinfo_t *uentp=NULL;
+ if(tuid>0 && (uentp = (userinfo_t *)search_ulist(tuid)) )
+ uentp->mailalert=1;
+ return 0;
+}
+
+void
+mailog(msg)
+ char *msg;
+{
+ FILE *fp;
+
+ if ((fp = fopen(LOG_FILE, "a")))
+ {
+ time_t now;
+ struct tm *p;
+
+ time(&now);
+ p = localtime(&now);
+ fprintf(fp, "%02d/%02d/%02d %02d:%02d:%02d <bbsmail> %s\n",
+ p->tm_year % 100, p->tm_mon + 1, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec,
+ msg);
+ fclose(fp);
+ }
+}
+
+
+int
+mail2bbs(userid)
+ char *userid;
+{
+ int uid;
+ fileheader_t mymail;
+ char genbuf[256], title[80], sender[80], filename[80], *ip, *ptr;
+ time_t tmp_time;
+ struct stat st;
+ FILE *fout;
+/* check if the userid is in our bbs now */
+ if (!(uid=getuser(userid)) )
+ {
+ sprintf(genbuf, "BBS user <%s> not existed", userid);
+ puts(genbuf);
+ mailog(genbuf);
+ return -1;//EX_NOUSER;
+ }
+
+ if(xuser.userlevel&PERM_NOOUTMAIL)
+ return -1;
+
+ sprintf(filename, BBSHOME "/home/%c/%s", userid[0], userid);
+
+ if (stat(filename, &st) == -1)
+ {
+ if (mkdir(filename, 0755) == -1)
+ {
+ printf("mail box create error %s \n", filename);
+ return -1;
+ }
+ }
+ else if (!(st.st_mode & S_IFDIR))
+ {
+ printf("mail box error\n");
+ return -1;
+ }
+
+ // printf("dir: %s\n", filename);
+
+/* allocate a file for the new mail */
+
+ stampfile(filename, &mymail);
+ // printf("file: %s\n", filename);
+
+/* copy the stdin to the specified file */
+
+/* parse header */
+
+ while (fgets(genbuf, 255, stdin))
+ {
+ if (!strncmp(genbuf, "From", 4))
+ {
+ if ((ip = strchr(genbuf, '<')) && (ptr = strrchr(ip, '>')))
+ {
+ *ptr = '\0';
+ if (ip[-1] == ' ')
+ ip[-1] = '\0';
+ ptr = (char *) strchr(genbuf, ' ');
+ while (*ptr == ' ') ptr++;
+ sprintf(sender, "%s (%s)", ip + 1, ptr);
+ }
+ else
+ {
+ strtok(genbuf, " \t\n\r");
+ ptr= strtok(NULL, " \t\n\r");
+ if(ptr)
+ strcpy(sender, ptr);
+ }
+ continue;
+ }
+ if (!strncmp(genbuf, "Subject: ", 9))
+ {
+ strcpy(title, genbuf + 9);
+ continue;
+ }
+ if (genbuf[0] == '\n')
+ break;
+ }
+
+ if ((ptr = strchr(sender, '\n')))
+ *ptr = '\0';
+
+ if ((ptr = strchr(title, '\n')))
+ *ptr = '\0';
+
+ if (strchr(sender, '@') == NULL) /* 由 local host 寄信 */
+ {
+ strcat(sender, "@" MYHOSTNAME);
+ }
+
+ time(&tmp_time);
+
+#ifdef HMM_USE_ANTI_SPAM
+ for (n = 0; notitle[n]; n++)
+ if (strstr(title, notitle[n]))
+ {
+ sprintf(genbuf, "Title <%s> not accepted", title);
+ puts(genbuf);
+ mailog(genbuf);
+ return -1;
+ }
+ for (n = 0; nofrom[n]; n++)
+ if (strstr(sender, nofrom[n]))
+ {
+ sprintf(genbuf, "From <%s> not accepted", sender);
+ puts(genbuf);
+ mailog(genbuf);
+ return -1;
+ }
+#endif
+
+ if ((fout = fopen(filename, "w")) == NULL)
+ {
+ printf("Cannot open %s\n", filename);
+ return -1;
+ }
+
+ if (!title[0])
+ sprintf(title, "來自 %.64s", sender);
+ title[TTLEN] = 0;
+ fprintf(fout, "作者: %s\n標題: %s\n時間: %s\n",
+ sender, title, ctime(&tmp_time));
+
+ while (fgets(genbuf, 255, stdin))
+ {
+#ifdef HMM_USE_ANTI_SPAM
+ for (n = 0; nocont[n]; n++)
+ if (strstr(genbuf, nocont[n]))
+ {
+ fclose(fout);
+ unlink(filename);
+ sprintf(genbuf, "Content <%s> not accepted", nocont[n]);
+ puts(genbuf);
+ mailog(genbuf);
+ return -1;
+ }
+#endif
+ fputs(genbuf, fout);
+ }
+ fclose(fout);
+
+ sprintf(genbuf, "%s => %s", sender, userid);
+ mailog(genbuf);
+
+/* append the record to the MAIL control file */
+
+ strcpy(mymail.title, title);
+
+ if (strtok(sender, " .@\t\n\r"))
+ strcat(sender, ".");
+ sender[IDLEN + 1] = '\0';
+ strcpy(mymail.owner, sender);
+
+ sprintf(genbuf, BBSHOME "/home/%c/%s/.DIR", userid[0], userid);
+ mailalertuid(uid);
+ return append_record(genbuf, &mymail, sizeof(mymail));
+}
+
+
+int
+main(int argc, char* argv[])
+{
+ char receiver[256];
+
+/* argv[1] is userid in bbs */
+
+ if (argc < 2)
+ {
+ printf("Usage:\t%s <bbs_uid>\n", argv[0]);
+ exit(-1);
+ }
+ (void) setgid(BBSGID);
+ (void) setuid(BBSUID);
+
+ if(passwd_mmap()) exit(-1);
+ strcpy(receiver, argv[1]);
+
+ strtok(receiver,".");
+ if (mail2bbs(receiver))
+ {
+ /* eat mail queue */
+ while (fgets(receiver, sizeof(receiver), stdin)) ;
+ }
+ return 0;
+}