newmsg.c
上传用户:s81996212
上传日期:2007-01-04
资源大小:722k
文件大小:17k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. /*
  2. ** Copyright 1998 - 1999 Double Precision, Inc.  See COPYING for
  3. ** distribution information.
  4. */
  5. /*
  6. ** $Id: newmsg.c,v 1.32 2000/06/23 12:23:56 mrsam Exp $
  7. */
  8. #include "config.h"
  9. #include "sqwebmail.h"
  10. #include "newmsg.h"
  11. #include "cgi/cgi.h"
  12. #include "sqconfig.h"
  13. #include "auth.h"
  14. #include "maildir.h"
  15. #include "token.h"
  16. #include "pref.h"
  17. #include "folder.h"
  18. #include "filter.h"
  19. #include "addressbook.h"
  20. #include "maildir/maildirmisc.h"
  21. #include "maildir/maildirquota.h"
  22. #include "maildir/maildirgetquota.h"
  23. #include "rfc822/rfc822.h"
  24. #include "rfc822/rfc2047.h"
  25. #include "rfc2045/rfc2045.h"
  26. #include <string.h>
  27. #include <stdio.h>
  28. #include <signal.h>
  29. #include <stdlib.h>
  30. #include <fcntl.h>
  31. #include <ctype.h>
  32. #if HAVE_UNISTD_H
  33. #include <unistd.h>
  34. #endif
  35. #include <sys/types.h>
  36. #if HAVE_SYS_WAIT_H
  37. #include <sys/wait.h>
  38. #endif
  39. #include <errno.h>
  40. #include "htmllibdir.h"
  41. extern const char *sqwebmail_content_charset;
  42. extern int spell_start(const char *);
  43. extern char form_args[];
  44. extern const char *sqwebmail_mailboxid;
  45. extern const char *sqwebmail_folder;
  46. extern void print_safe_len(const char *, size_t, void (*)(const char *, size_t));
  47. extern void call_print_safe_to_stdout(const char *, size_t);
  48. extern void print_attrencodedlen(const char *, size_t, int, FILE *);
  49. extern void output_attrencoded_nltobr(const char *);
  50. extern void output_attrencoded_oknl(const char *);
  51. extern void output_attrencoded(const char *);
  52. extern void output_scriptptrget();
  53. extern void output_form(const char *);
  54. extern void output_urlencoded(const char *);
  55. extern char *newmsg_newdraft(const char *, const char *, const char *,
  56. const char *);
  57. extern char *newmsg_createdraft(const char *);
  58. extern char *newmsg_createsentmsg(const char *);
  59. extern void newmsg_handletextplain(FILE *, struct rfc2045 *,
  60. int (*)(const char *, size_t, void *));
  61. static void newmsg_header(const char *label, const char *field, const char *val)
  62. {
  63. printf("<TR><TH ALIGN=RIGHT><P>%s</TD><TD WIDTH=6>&nbsp;</TH>",
  64. label);
  65. printf("<TD><INPUT NAME=%s SIZE=50 MAXLENGTH=512 VALUE="",
  66. field);
  67. if (val)
  68. {
  69. char *s;
  70. s=rfc2047_decode_simple(val);
  71. if (!s) enomem();
  72. output_attrencoded(s);
  73. free(s);
  74. }
  75. printf(""></TD></TR>n");
  76. }
  77. static const char *ispreviewmsg()
  78. {
  79. const char *p=cgi("previewmsg");
  80. if (*p == 0)
  81. p=cgi("addressbook_to");
  82. if (*p == 0)
  83. p=cgi("addressbook_cc");
  84. if (*p == 0)
  85. p=cgi("addressbook_bcc");
  86. return (p);
  87. }
  88. void newmsg_hiddenheader(const char *label, const char *value)
  89. {
  90. printf("<INPUT TYPE=HIDDEN NAME="%s" VALUE="", label);
  91. output_attrencoded(value);
  92. printf("">");
  93. }
  94. /* ---------------------------------------------------- */
  95. /* Display message preview */
  96. static int filter_stub(const char *ptr, size_t cnt, void *voidptr)
  97. {
  98.         filter(ptr, cnt);
  99.         return (0);
  100. }
  101. static void preview_show_func_s(const char *p, size_t n)
  102. {
  103. fwrite(p, 1, n, stdout);
  104. }
  105. static void show_preview(const char *filename)
  106. {
  107. char *header, *value;
  108. struct rfc2045 *rfcp;
  109. FILE *fp;
  110. int fd;
  111. fp=0;
  112. fd=maildir_safeopen(filename, O_RDONLY, 0);
  113. if (fd >= 0)
  114. if ((fp=fdopen(fd, "r")) == 0)
  115. close(fd);
  116. if (!fp) return;
  117. while ((header=maildir_readheader(fp, &value, 1)) != 0)
  118. {
  119. /* Don't show X-, From, and Content- headers in preview */
  120. if (strncmp(header, "x-", 2) == 0) continue;
  121. if (strcmp(header, "mime-version") == 0) continue;
  122. if (strncmp(header, "content-", 8) == 0) continue;
  123. printf("%c", toupper(*header));
  124. output_attrencoded_oknl(header+1);
  125. printf(": ");
  126. output_attrencoded_oknl(value);
  127. printf("n");
  128. }
  129. printf("n");
  130. rfcp=rfc2045_fromfp(fp);
  131. if (!rfcp) return;
  132. filter_start(FILTER_FOR_PREVIEW, &preview_show_func_s);
  133. newmsg_handletextplain(fp, rfcp, &filter_stub);
  134. rfc2045_free(rfcp);
  135. filter_end();
  136. }
  137. static int show_textarea(const char *p, size_t l, void *voidptr)
  138. {
  139. print_attrencodedlen(p, l, 1, stdout);
  140. return (0);
  141. }
  142. /* ---------------------------------------------------- */
  143. void newmsg_init(const char *folder, const char *pos)
  144. {
  145. char *tolab=strtok(form_args, "|");
  146. char *cclab=strtok(0, "|");
  147. char *bcclab=strtok(0, "|");
  148. char *subjectlab=strtok(0, "|");
  149. char *messagelab=strtok(0, "|");
  150. char *sendlab=strtok(0, "|");
  151. char *previewlab=strtok(0, "|");
  152. char *forwardsep=strtok(0, "|");
  153. char *savedraft=strtok(0, "|");
  154. char *uploadlab=strtok(0, "|");
  155. char *replysalutation=strtok(0, "|");
  156. char *checkspellingdone=strtok(0, "|");
  157. char *checkspelling=strtok(0, "|");
  158. char *quotaerr=strtok(0, "|");
  159. char *fromlab=strtok(0, "|");
  160. char *replytolab=strtok(0, "|");
  161. char *addressbooklab=strtok(0, "|");
  162. char *draftmessage;
  163. char *draftmessagefilename;
  164. const char *p;
  165. FILE *fp;
  166. int attachcnt=0;
  167. char *cursubj, *curto, *curcc, *curbcc, *curfrom, *curreplyto;
  168. if (!fromlab) fromlab="";
  169. if (!replytolab) replytolab="";
  170. if (!tolab) tolab="";
  171. if (!cclab) cclab="";
  172. if (!bcclab) bcclab="";
  173. if (!subjectlab) subjectlab="";
  174. if (!messagelab) messagelab="";
  175. if (!sendlab) sendlab="";
  176. if (!previewlab) previewlab="";
  177. if (!savedraft) savedraft="";
  178. if (!uploadlab) uploadlab="";
  179. if (!replysalutation) replysalutation="";
  180. if (!checkspellingdone) checkspellingdone="";
  181. if (!checkspelling) checkspelling="";
  182. if (!quotaerr) quotaerr="";
  183. if (!addressbooklab) addressbooklab="";
  184. /* Picking up an existing draft? */
  185. p=cgi("draft");
  186. if (*p)
  187. {
  188. CHECKFILENAME(p);
  189. }
  190. if (*p)
  191. {
  192. draftmessage=strdup(p);
  193. if (!draftmessage) enomem();
  194. p="";
  195. }
  196. else
  197. {
  198. draftmessage=newmsg_newdraft(folder, pos,
  199. forwardsep, replysalutation);
  200. if (!draftmessage)
  201. {
  202. if (*ispreviewmsg())
  203. {
  204. p=cgi("draftmessage");
  205. if (*p)
  206. {
  207. CHECKFILENAME(p);
  208. }
  209. draftmessage=newmsg_createdraft(p);
  210. }
  211. }
  212. }
  213. draftmessagefilename= draftmessage ?
  214.  maildir_find(DRAFTS, draftmessage):0;
  215. if (*(p=cgi("previewmsg")))
  216. {
  217. #ifdef ISPELL
  218. if (strcmp(p, "SPELLCHK") == 0)
  219. printf("%s<BR><BR>n", checkspellingdone);
  220. #endif
  221. printf("<TABLE WIDTH="100%%" BORDER=0 CELLSPACING=0 CELLPADDING=1 BGCOLOR="#000000"><TR><TD>n");
  222. printf("<TABLE WIDTH="100%%" BORDER=0 CELLSPACING=0 CELLPADDING=4 BGCOLOR="#FFFFFF"><TR><TD><TT><PRE>n");
  223. if (draftmessagefilename)
  224. show_preview(draftmessagefilename);
  225. printf("</PRE></TT></TR></TD></TABLE>n");
  226. printf("</TR></TD></TABLE>n");
  227. printf("<TABLE WIDTH="100%%" BORDER=0 CELLSPACING=0 CELLPADDING=6><TR><TD><HR WIDTH="80%%"></TD></TR></TABLE>n");
  228. }
  229. printf("<INPUT TYPE=HIDDEN NAME=form VALUE="donewmsg">n");
  230. newmsg_hiddenheader("pos", pos);
  231. newmsg_hiddenheader("focusto",
  232. *cgi("newmsg") ? "headers":"text");
  233. /* Generate unique message token, to detect duplicate SUBMITs */
  234. tokennew();
  235. /* Display any error message */
  236. if (*cgi("foldermsg"))
  237. {
  238. printf("<P><FONT COLOR="#FF0000">");
  239. output_attrencoded_nltobr(cgi("foldermsg"));
  240. printf("</FONT><BR>");
  241. }
  242. if (strcmp(cgi("error"), "quota") == 0)
  243. printf("%s", quotaerr);
  244. /* Read message from the draft file */
  245. cursubj=0;
  246. curto=0;
  247. curfrom=0;
  248. curreplyto=0;
  249. curcc=0;
  250. curbcc=0;
  251. fp=0;
  252. if (draftmessagefilename)
  253. {
  254. int x=maildir_safeopen(draftmessagefilename, O_RDONLY, 0);
  255. if (x >= 0)
  256. if ((fp=fdopen(x, "r")) == 0)
  257. close(x);
  258. }
  259. if (fp != 0)
  260. {
  261. char *header, *value;
  262. while ((header=maildir_readheader(fp, &value, 0)) != 0)
  263. {
  264. char **rfchp=0;
  265. if (strcmp(header, "subject") == 0)
  266. {
  267. if (!cursubj && !(cursubj=strdup(value)))
  268. enomem();
  269. continue;
  270. }
  271. if (strcmp(header, "from") == 0)
  272. rfchp= &curfrom;
  273. if (strcmp(header, "reply-to") == 0)
  274. rfchp= &curreplyto;
  275. if (strcmp(header, "to") == 0)
  276. rfchp= &curto;
  277. if (strcmp(header, "cc") == 0)
  278. rfchp= &curcc;
  279. if (strcmp(header, "bcc") == 0)
  280. rfchp= &curbcc;
  281. if (rfchp)
  282. {
  283. char *newh=malloc ( (*rfchp ? strlen(*rfchp)+2:1)
  284. +strlen(value));
  285. if (!newh) enomem();
  286. strcpy(newh, value);
  287. if (*rfchp)
  288. strcat(strcat(newh, ","), *rfchp);
  289. if (*rfchp) free( *rfchp );
  290. *rfchp=newh;
  291. }
  292. }
  293. }
  294. printf("<TABLE WIDTH="100%%" BORDER=0 CELLSPACING=0 CELLPADDING=1 BGCOLOR="#000000"><TR><TD>n");
  295. printf("<TABLE WIDTH="100%%" BORDER=0 CELLSPACING=0 CELLPADDING=4 BGCOLOR="#DDDDDD"><TR><TD>n");
  296. printf("<TABLE BORDER=0 WIDTH="100%%">n");
  297. if (access(NOCHANGINGFROM, 0))
  298. newmsg_header(fromlab, "headerfrom", curfrom ? curfrom:
  299. *cgi("from") ? cgi("from"):
  300. pref_from && *pref_from ? pref_from:
  301. login_fromhdr());
  302. printf("<TR VALIGN=MIDDLE><TH ALIGN=RIGHT><P>%s</TD><TD WIDTH=6>&nbsp;</TH>",
  303. addressbooklab);
  304. printf("<TD VALIGN=MIDDLE>");
  305. printf("<TABLE BORDER=0 CELLPADDING=0 CELLSPACING=4>");
  306. printf("<TR VALIGN=MIDDLE><TD><SELECT NAME="nick" SIZE=4 MULTIPLE>n");
  307. ab_listselect();
  308. printf("</select></TD><TD>");
  309. printf("<input type=submit name="addressbook_to" value="%s">",
  310. tolab);
  311. printf("<input type=submit name="addressbook_cc" value="%s">",
  312. cclab);
  313. printf("<input type=submit name="addressbook_bcc" value="%s">",
  314. bcclab);
  315. printf("</TD></TR></TABLE>");
  316. printf("</TD></TR>n");
  317. newmsg_header(tolab, "headerto", curto ? curto:cgi("to"));
  318. newmsg_header(cclab, "headercc", curcc ? curcc:cgi("cc"));
  319. newmsg_header(bcclab, "headerbcc", curbcc ? curbcc:cgi("bcc"));
  320. newmsg_header(replytolab, "headerreply-to", curreplyto ? curreplyto:cgi("replyto"));
  321. newmsg_header(subjectlab, "headersubject", cursubj ? cursubj:cgi("subject"));
  322. if (curto) free(curto);
  323. if (curfrom) free(curfrom);
  324. if (curreplyto) free(curreplyto);
  325. if (curcc) free(curcc);
  326. if (curbcc) free(curbcc);
  327. if (cursubj) free(cursubj);
  328. printf("<TR><TD COLSPAN=3><HR WIDTH="100%%"></TD></TR>");
  329. printf("<TR><TD>&nbsp;</TD><TD WIDTH=6>&nbsp;</TD>");
  330. printf("<TD><TEXTAREA NAME=message COLS=%d ROWS=15 WRAP=soft>",
  331. MYLINESIZE);
  332. if (fp)
  333. {
  334. struct rfc2045 *p=rfc2045_fromfp(fp), *q;
  335. /* Here's a nice opportunity to count all attachments */
  336. for (q=p->firstpart; q; q=q->next)
  337. if (!q->isdummy) ++attachcnt;
  338. if (attachcnt) --attachcnt;
  339. /* Not counting the 1st MIME part */
  340. if (!p) enomem();
  341. newmsg_handletextplain(fp, p, &show_textarea);
  342. rfc2045_free(p);
  343. fclose(fp);
  344. }
  345. else
  346. {
  347. printf("%s", cgi("body"));
  348. if ((fp=fopen(SIGNATURE, "r")) != NULL)
  349. {
  350. char buf[256];
  351. int n;
  352. printf("nn");
  353. while ((n=fread(buf, 1, sizeof(buf)-1, fp)) > 0)
  354. {
  355. buf[n]=0;
  356. output_attrencoded_oknl(buf);
  357. }
  358. fclose(fp);
  359. }
  360. }
  361. printf("</TEXTAREA><BR>n");
  362. if (draftmessage && *draftmessage)
  363. {
  364. printf("<INPUT TYPE=HIDDEN NAME=draftmessage VALUE="");
  365. output_attrencoded(draftmessage);
  366. printf("">");
  367. }
  368. if (draftmessage) free(draftmessage);
  369. printf("</TD></TR>n");
  370. printf("<TR><TD><P>&nbsp</TD><TD>&nbsp;</TD><TD><INPUT TYPE=SUBMIT NAME=doattachments VALUE="");
  371. printf(uploadlab, attachcnt);
  372. printf(""></TD></TR>");
  373. printf("<TR><TD COLSPAN=2>&nbsp;</TD><TD>");
  374. printf("<INPUT TYPE=SUBMIT NAME=previewmsg VALUE="%s">",
  375. previewlab);
  376. printf("<INPUT TYPE=SUBMIT NAME=sendmsg VALUE="%s">",
  377. sendlab);
  378. printf("<INPUT TYPE=SUBMIT NAME=savedraft VALUE="%s">",
  379. savedraft);
  380. #ifdef ISPELL
  381. printf("<INPUT TYPE=SUBMIT NAME=startspellchk VALUE="%s">",
  382. checkspelling);
  383. #endif
  384. printf("</TD></TR>n");
  385. printf("</TD></TABLE>n");
  386. printf("</TR></TD></TABLE>n");
  387. printf("</TR></TD></TABLE>n");
  388. }
  389. static const char *geterrbuf(int fd)
  390. {
  391. static char errbuf[512];
  392. char *errbufptr=errbuf;
  393. size_t errbufleft=sizeof(errbuf)-1;
  394. while (errbufleft)
  395. {
  396. int l=read(fd, errbufptr, errbufleft);
  397. if (l <= 0) break;
  398. errbufptr += l;
  399. errbufleft -= l;
  400. }
  401. *errbufptr=0;
  402. return (errbuf);
  403. }
  404. static int waitfor(pid_t pid)
  405. {
  406. pid_t childpid;
  407. int wait_stat;
  408. while ((childpid=wait(&wait_stat)) != pid)
  409. if (childpid == -1) return (-1);
  410. return (wait_stat);
  411. }
  412. void sendmsg_done()
  413. {
  414. if ( *cgi("pos"))
  415. http_redirect_argss("&form=readmsg&pos=%s", cgi("pos"), "");
  416. else
  417. http_redirect_argss("&form=folders", "", "");
  418. }
  419. static int dosendmsg(const char *origdraft)
  420. {
  421. pid_t pid;
  422. const char *returnaddr;
  423. int pipefd1[2];
  424. char *filename;
  425. const char *line;
  426. char *draftmessage;
  427. if (tokencheck()) /* Duplicate submission - message was already sent */
  428. {
  429. sendmsg_done();
  430. return (1);
  431. }
  432. if (strcmp(cgi("form"), "doattach") == 0)
  433. {
  434. /* When called from the attachment window, we do NOT create
  435. ** a new draft message */
  436. draftmessage=strdup(origdraft);
  437. }
  438. else
  439. draftmessage=newmsg_createdraft(origdraft);
  440. if (!draftmessage)
  441. enomem();
  442. filename=newmsg_createsentmsg(draftmessage);
  443. if (!filename)
  444. {
  445. char *draftbase=maildir_basename(draftmessage);
  446. http_redirect_argss("&form=newmsg&pos=%s&draft=%s&error=quota",
  447. cgi("pos"), draftbase);
  448. free(draftmessage);
  449. free(draftbase);
  450. return (1);
  451. }
  452. if (pipe(pipefd1) != 0)
  453. {
  454. cgi_put("foldermsg", "ERROR: pipe() failed.");
  455. maildir_msgpurgefile(SENT, filename);
  456. free(filename);
  457. free(draftmessage);
  458. return (0);
  459. }
  460. returnaddr=login_returnaddr();
  461. pid=fork();
  462. if (pid < 0)
  463. {
  464. cgi_put("foldermsg", "ERROR: fork() failed.");
  465. close(pipefd1[0]);
  466. close(pipefd1[1]);
  467. maildir_msgpurgefile(SENT, filename);
  468. free(filename);
  469. free(draftmessage);
  470. return (0);
  471. }
  472. if (pid == 0)
  473. {
  474. static const char noexec[]="ERROR: Unable to execute sendit.sh.n";
  475. static const char nofile[]="ERROR: Temp file not available - probably exceeded quota.n";
  476. char *tmpfile=maildir_find(SENT, filename);
  477. int fd;
  478. if (!tmpfile)
  479. {
  480. fwrite((char*)nofile, 1, sizeof(nofile)-1, stderr);
  481. _exit(1);
  482. }
  483. close(0);
  484. fd=maildir_safeopen(tmpfile, O_RDONLY, 0);
  485. close(1);
  486. close(2);
  487. dup(pipefd1[1]);
  488. dup(pipefd1[1]);
  489. close(pipefd1[0]);
  490. close(pipefd1[1]);
  491. if (fd == 0)
  492. execl(SENDITSH, "sendit.sh", returnaddr,
  493. sqwebmail_mailboxid, NULL);
  494. fwrite(noexec, 1, sizeof(noexec)-1, stderr);
  495. _exit(1);
  496. }
  497. close(pipefd1[1]);
  498. line=geterrbuf(pipefd1[0]);
  499. close(pipefd1[0]);
  500. if (waitfor(pid))
  501. {
  502. if (!*line)
  503. line="Unable to send message.n";
  504. }
  505. else
  506. line="";
  507. if (*line == 0) /* Succesfully sent message */
  508. {
  509. if (*draftmessage)
  510. {
  511. char *base=maildir_basename(draftmessage);
  512. char *draftfile=maildir_find(DRAFTS, base);
  513. free(base);
  514. /* Remove draft file */
  515. if (draftfile)
  516. {
  517. char *replytofolder=0, *replytomsg=0;
  518. char *header, *value;
  519. FILE *fp;
  520. int x;
  521. unsigned long filesize;
  522. int rc;
  523. int quotafd;
  524. char quotabuf[QUOTABUFSIZE];
  525. fp=0;
  526. x=maildir_safeopen(draftfile, O_RDONLY, 0);
  527. if ( maildir_parsequota(draftfile, &filesize))
  528. {
  529. struct stat stat_buf;
  530. if (x < 0 || fstat(x, &stat_buf))
  531. stat_buf.st_size=0;
  532. filesize=stat_buf.st_size;
  533. }
  534. if (x >= 0)
  535. if ((fp=fdopen(x, "r")) == 0)
  536. close(x);
  537. /* First, look for a message that we should
  538. ** mark as replied */
  539. while (fp && (header=maildir_readheader(fp,
  540. &value, 0)) != 0)
  541. {
  542. if (strcmp(header,"x-reply-to-folder")
  543. == 0 && !replytofolder)
  544. {
  545. replytofolder=strdup(value);
  546. if (!replytofolder)
  547. enomem();
  548. }
  549. if (strcmp(header,"x-reply-to-msg")
  550. == 0 && !replytomsg)
  551. {
  552. replytomsg=strdup(value);
  553. if (!replytomsg)
  554. enomem();
  555. }
  556. if (replytofolder && replytomsg)
  557. break;
  558. }
  559. if (fp) fclose(fp);
  560. if (replytofolder && replytomsg)
  561. maildir_markreplied(replytofolder,
  562. replytomsg);
  563. if (replytofolder) free(replytofolder);
  564. if (replytomsg) free(replytomsg);
  565. if (maildir_getquota(".", quotabuf))
  566. {
  567. if (errno != ENOENT)    enomem();
  568. quotabuf[0]=0;
  569. }
  570. do
  571. {
  572. if (quotabuf[0] == 0) break;
  573. rc=maildir_checkquota(".", &quotafd,
  574. quotabuf, -filesize, -1);
  575. if (rc && errno != EAGAIN)
  576. {
  577. if (quotafd >= 0)
  578. close(quotafd);
  579. enomem();
  580. }
  581. } while (rc);
  582. if (quotabuf[0])
  583. {
  584. maildir_addquota(".", quotafd, quotabuf,
  585. -filesize, -1);
  586. if (quotafd >= 0) close(quotafd);
  587. }
  588. unlink(draftfile);
  589. free(draftfile);
  590. }
  591. }
  592. tokensave();
  593. free(filename);
  594. free(draftmessage);
  595. sendmsg_done();
  596. return (1);
  597. }
  598. maildir_msgpurgefile(SENT, filename);
  599. free(filename);
  600. {
  601. char *draftbase=maildir_basename(draftmessage);
  602. http_redirect_argsss("&form=newmsg&pos=%s&draft=%s&foldermsg=%s",
  603. cgi("pos"), draftbase, line);
  604. free(draftmessage);
  605. free(draftbase);
  606. }
  607. return (1);
  608. }
  609. void newmsg_do(const char *folder)
  610. {
  611. const char *draftmessage=cgi("draftmessage");
  612. if (*draftmessage) /* It's ok if it's blank */
  613. {
  614. CHECKFILENAME(draftmessage);
  615. }
  616. if (*cgi("savedraft"))
  617. {
  618. char *newdraft=newmsg_createdraft(draftmessage);
  619. if (!newdraft) enomem();
  620. free(newdraft);
  621. sendmsg_done();
  622. return;
  623. }
  624. if (*cgi("sendmsg") && dosendmsg(draftmessage))
  625. return;
  626. if (*cgi("doattachments"))
  627. {
  628. char *newdraft=newmsg_createdraft(draftmessage);
  629. char *base;
  630. if (!newdraft) enomem();
  631. if (*cgi("error"))
  632. {
  633. cgi_put("previewmsg", "1");
  634. output_form("newmsg.html");
  635. return;
  636. }
  637. base=maildir_basename(newdraft);
  638. http_redirect_argss("&form=attachments&pos=%s&draft=%s",
  639. cgi("pos"), base);
  640. free(base);
  641. free(newdraft);
  642. return;
  643. }
  644. #ifdef ISPELL
  645. if (*cgi("startspellchk"))
  646. {
  647. char *newdraft=newmsg_createdraft(draftmessage);
  648. char *base;
  649. if (!newdraft) enomem();
  650. base=maildir_basename(newdraft);
  651. free(newdraft);
  652. if (spell_start(base) == 0)
  653. {
  654. cgi_put("draftmessage", base);
  655. output_form("spellchk.html");
  656. }
  657. else
  658. {
  659. http_redirect_argss("&form=newmsg&pos=%s&draft=%s&previewmsg=SPELLCHK",
  660. cgi("pos"), base);
  661. }
  662. free(base);
  663. return;
  664. }
  665. #endif
  666. if (*ispreviewmsg())
  667. {
  668. output_form("newmsg.html");
  669. return;
  670. }
  671. http_redirect_argsss("&form=newmsg&pos=%s&draftmessage=%s&error=%s",
  672. cgi("pos"), draftmessage,
  673. cgi("error"));
  674. }