荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: FreeWizard@smth.org (求放心         | Pray4u ), 信区: InstallBBS
标  题: Re: [SMTH] Mail Function Patch III
发信站: BBS 水木清华站 (Sun Nov 23 22:33:36 2003)
转信站: SZU!news.ccie.net.cn!maily.cic.tsinghua.edu.cn!SMTH


--- qmail2bbs.c.112103  Fri Nov 21 16:32:46 2003
+++ qmail2bbs.c Sun Nov 23 21:51:41 2003
@@ -5,6 +5,7 @@
  */

 #include "bbs.h"
+#include "bbs_mime.c"

 #define BLOCKFILE ".blockmail"

@@ -90,9 +91,9 @@
 }

 int
-append_mail(fin, sender1, sender, userid, title, received)
+append_mail(fin, sender1, sender, userid, title, received, boundary)
        FILE           *fin;
-       char           *userid, *sender1, *sender, *title, *received;
+       char           *userid, *sender1, *sender, *title, *received, *boundary;
 {
        struct fileheader newmessage;
        char            fname[512], buf[256];
@@ -153,8 +154,154 @@
                if (received != NULL && received[0] != '\0')
                        fprintf(fout, "来  源: %-.70s\n", received);
                fprintf(fout, "日  期: %s\n", ctime(&tmp_time));
-               while (fgets(buf, 255, fin) != NULL)
-                       fputs(buf, fout);
+               if (!boundary[0])
+                       while (fgets(buf, 255, fin) != NULL) fputs(buf, fout);
+               else {
+                       #define READ  if (!fgets(buf, 255, fin)) { err=1; break;
}
+                       #define WRITE(data, size)  FileSize += fwrite(data, 1,
size, fout); totalsize += size;
+                       #define CHECK  if ((totalsize>MAXMAILSIZE)
||(number-firstText>MAXATTACHMENTCOUNT)) err=2; if (err) break;
+                       int err;
+                       int ContentType,  ContentEncoding;
+                       int number;

+                       int block;
+                       char FileName[256];
+                       char Boundary[256];
+                       int FileSize;
+                       char data[256];
+                       int totalsize;
+                       int firstText;
+                       err = 0;
+                       buf[0] = 0;
+                       totalsize = 0;
+                       firstText = 0;
+                       do {
+                               READ
+                       } while (!strstr(buf, boundary));
+                       number = 0;
+                       do {
+                               READ
+                       } while (0);
+                       do {
+                               ContentType = 0;
+                               ContentEncoding = 0;
+                               number++;
+                               FileName[0]=0;
+                               do {
+                                       char* tag;
+                                       if (tag=strstr(buf, ": ")) {
+                                               tag[0]=0; tag+=2;
+                                               if (!strcasecmp(buf,
"Content-Type")) {
+                                                       char* t;
+                                                       if (t=strchr(tag, ';'))
*t=0;
+                                                       if (!strcasecmp(tag,
"text/plain")) ContentType = 1;
+                                                       else if
(!strcasecmp(tag, "text/html")) ContentType = 2;
+                                                       else if
(!strcasecmp(tag, "multipart/related")) ContentType = 3;
+                                               } else if (!strcasecmp(buf,
"Content-Transfer-Encoding")) {
+                                                       if (strstr(tag, "8bit"))
 ContentEncoding = 1;
+                                                       else if (strstr(tag,
"quoted-printable")) ContentEncoding = 2;
+                                                       else if (strstr(tag,
"base64")) ContentEncoding = 3;
+                                               }
+                                       } else if (tag=strstr(buf,
"filename=\"")) {
+                                               char* t;
+                                               tag+=10;
+                                               if (t=strchr(tag, '"')) *t=0;
+                                               strcpy(FileName, tag);
+                                       } else if ((ContentType==3) &&
(tag=strstr(buf, "boundary=\""))) {
+                                               char* t;
+                                               tag+=10;
+                                               if (t=strchr(tag, '\"')) *t=0;

+                                               while (tag[strlen(tag)-1]<27)
tag[strlen(tag)-1]=0;
+                                               strcpy(Boundary, tag);
+                                       }
+                                       READ
+                               } while (strlen(buf)>2); /*(strcspn(buf, "
\r\n")<strlen(buf));*/
+                               CHECK
+                               do {
+                                       READ
+                               } while (strlen(buf)<2);
+                               CHECK
+                               if (!FileName[0])
+                                       switch (ContentType) {
+                                               case 1:
+                                                       strcpy(FileName,
"noname.txt");
+                                                       break;
+                                               case 2:
+                                                       strcpy(FileName,
"noname.htm");
+                                                       break;
+/*                                             case 3:
+                                                       strcpy(FileName,
"noname.mht");
+                                                       break;
+*/                                             default:
+                                                       strcpy(FileName,
"noname");
+                                       }
+                               block = 0;
+                               FileSize = 0;
+                               do {
+                                       if ((ContentType==1)&&(number==1)) {
+                                               firstText = 1;
+                                               switch (ContentEncoding) {
+                                                       case 1:
+                                                               fputs(buf, fout)
;
+                                                               break;
+                                                       case 2:
+                                                               qpdec(buf, data)
;
+                                                               fputs(data,
fout);
+                                                               break;
+                                                       case 3:
+                                                               data[b64dec(buf,
 data)]=0;
+                                                               fputs(data,
fout);
+                                                               break;
+                                                       default:
+                                                               fputs(buf, fout)
;
+                                               }
+
+                                       } else {
+                                               if (!newmessage.attachment)
newmessage.attachment=ftell(fout);
+                                               if (!FileSize) {
+                                                       fwrite(ATTACHMENT_PAD,
1, ATTACHMENT_SIZE, fout);
+                                                       fwrite(FileName, 1,
strlen(FileName)+1, fout);
+                                                       fwrite(&FileSize, 1, 4,
fout);
+                                                       totalsize +=
12+strlen(FileName)+1;
+                                               }
+                                               switch (ContentEncoding) {
+                                                       case 1:
+                                                               WRITE(buf,
strlen(buf));
+                                                               break;
+                                                       case 2:
+                                                               qpdec(buf, data)
;
+                                                               WRITE(data,
strlen(data));
+                                                               break;
+                                                       case 3:
+                                                               WRITE(data,
b64dec(buf, data));
+                                                               break;
+                                                       default:
+/*                                                             if ((!FileSize)
&&(ContentType==3)) {
+
WRITE("Content-Type: multipart/related;\n", 33);
+                                                                       WRITE("
     boundary=\"", 16);
+
WRITE(Boundary, strlen(Boundary));
+
WRITE("\";\n",3);
+                                                                       WRITE("
     type=\"multipart/alternative\"\n\n", 36);
+                                                               }
+*/                                                             WRITE(buf,
strlen(buf));
+                                               }
+                                       }
+                                       CHECK
+                                       READ
+                               } while (!strstr(buf, boundary));
+                               if ((ContentType!=1)||(number!=1)) {
+                                               fseek(fout, -FileSize-4,
SEEK_CUR);
+                                               FileSize = htonl(FileSize);
+                                               fwrite(&FileSize, 1, 4, fout);
+                                               fseek(fout, 0, SEEK_END);
+                               }
+                               CHECK
+                               READ
+                       } while (!feof(fin));
+                       /*if (err==2) fputs("Mail too long or too many
attachments!", fout);*/
+                       #undef READ
+                       #undef WRITE
+                       #undef CHECK
+               }
                fclose(fout);
        }

@@ -211,7 +358,7 @@
        /* argv[ 2 ] is userid in bbs   */
        /* argv[ 3 ] is the mail title  */
        /* argv[ 4 ] is the message-id  */
-       if (argc != 3)
+       if (argc < 3)
        {
                char           *p = (char *) rindex(argv[0], '/');

@@ -256,5 +403,7 @@
                return -2;

        strcpy(receiver, argv[2]);
-       return append_mail(stdin, nettyp, sender, receiver, getenv("TITLE"),
getenv("MSGID"));
+       return append_mail(stdin, nettyp, sender, receiver, getenv("TITLE"),
getenv("MSGID"), argv[3]);
 }
+
+

【 在 freewizard@happynet.org (Enter HAPPY :: Reloaded :: Revolution) 的大作中提
到: 】
: 发信人: freewizard (Enter HAPPY :: Reloaded :: Revolution), 信区: sysop
: 标  题: [功能测试] 带附件的MIME邮件收发
: 发信站: HAPPY (Sun Nov 23 17:21:08 2003), 转信
:         使用方法
:         将带有附件的邮件发往 用户ID@happynet.org
:         当前限制
:         邮件大小2M
:         编码支持:8bit  quoted-printable  base64


--

※ 来源:·BBS 水木清华站 smth.org·[FROM: 202.38.124.252]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店