--- 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
--
FROM 202.38.124.252