📄 smail.c
字号:
case 501: return RP_PARM; case 550: case 551: case 552: case 553: return RP_USER; default: return RP_RPLY; }}/* */int sm_waend () { switch (smtalk (SM_DATA, "DATA")) { case 354: sm_nl = TRUE; return RP_OK; case 451: #ifdef SENDMAILBUG sm_nl = TRUE; return RP_OK;#endif /* SENDMAILBUG */ case 421: return RP_NO; case 500: case 501: case 503: case 554: return RP_NDEL; default: return RP_RPLY; }}/* */int sm_wtxt (buffer, len)register char *buffer;register int len;{ register int result; sm_alarmed = 0; (void) alarm (SM_TEXT); result = sm_wstream (buffer, len); (void) alarm (0); return (result == NOTOK ? RP_BHST : RP_OK);}/* */int sm_wtend () { if (sm_wstream ((char *) NULL, 0) == NOTOK) return RP_BHST; switch (smtalk (SM_DOT + 3 * sm_addrs, ".")) { case 250: case 251: return RP_OK; case 451: #ifdef SENDMAILBUG return RP_OK;#endif /* SENDMAILBUG */ case 452: default: return RP_NO; case 552: case 554: return RP_NDEL; }}/* */int sm_end (type)register int type;{ register int status; struct smtp sm_note;#ifndef SMTP switch (sm_child) { case NOTOK: case OK: return RP_OK; default: break; }#endif /* not SMTP */ if (sm_rfp == NULL && sm_wfp == NULL) return RP_OK; switch (type) { case OK: (void) smtalk (SM_QUIT, "QUIT"); break; case NOTOK: sm_note.code = sm_reply.code; (void) strncpy (sm_note.text, sm_reply.text, sm_note.length = sm_reply.length);/* fall */ case DONE: if (smtalk (SM_RSET, "RSET") == 250 && type == DONE) return RP_OK;#ifndef SMTP (void) kill (sm_child, SIGKILL); discard (sm_rfp); discard (sm_wfp);#else /* SMTP */ (void) smtalk (SM_QUIT, "QUIT");#endif /* not SMTP */ if (type == NOTOK) { sm_reply.code = sm_note.code; (void) strncpy (sm_reply.text, sm_note.text, sm_reply.length = sm_note.length); } break; }#ifdef MPOP#ifdef SMTP if (sm_ispool) { sm_ispool = 0; if (sm_wfp) { (void) unlink (sm_tmpfil); (void) fclose (sm_wfp); sm_wfp = NULL; } }#endif#endif /* MPOP */ if (sm_rfp != NULL) { (void) alarm (SM_CLOS); (void) fclose (sm_rfp); (void) alarm (0); } if (sm_wfp != NULL) { (void) alarm (SM_CLOS); (void) fclose (sm_wfp); (void) alarm (0); }#ifndef SMTP status = pidwait (sm_child); sm_child = NOTOK;#else /* SMTP */ status = 0;#endif /* SMTP */ sm_rfp = sm_wfp = NULL; return (status ? RP_BHST : RP_OK);}/* */#ifdef MPOP#ifdef SMTP#include <sys/types.h>#include <sys/stat.h>int sm_bulk (file)char *file;{ int cc, i, j, k, result; long pos; register char *dp; char *bp, *cp, buffer[BUFSIZ], sender[BUFSIZ]; FILE *fp, *gp; gp = NULL; k = strlen (file) - sizeof ".bulk"; if ((fp = fopen (file, "r")) == NULL) { (void) sprintf (bp = sm_reply.text, "unable to read %s: ", file); bp += strlen (bp); if (errno > 0 && errno < sys_nerr) (void) sprintf (bp, "%s", sys_errlist[errno]); else (void) sprintf (bp, "Error %d", errno); sm_reply.length = strlen (sm_reply.text); sm_reply.code = NOTOK; return RP_BHST; } if (sm_debug) { printf ("reading file %s\n", file); (void) fflush (stdout); } i = j = 0; while (fgets (buffer, sizeof buffer, fp)) { if (j++ == 0) (void) strcpy (sender, buffer + sizeof "MAIL FROM:" - 1); if (strcmp (buffer, "DATA\r\n") == 0) { i = 1; break; } } if (i == 0) { if (sm_debug) { printf ("no DATA...\n"); (void) fflush (stdout); }losing0: ; (void) sprintf (buffer, "%s.bad", file); (void) rename (file, buffer); if (gp) { (void) sprintf (buffer, "%*.*sA.bulk", k, k, file); (void) unlink (buffer); (void) fclose (gp); } (void) fclose (fp); return RP_OK; } if (j < 3) { if (sm_debug) { printf ("no %srecipients...\n", j < 1 ? "sender or " : ""); (void) fflush (stdout); } goto losing0; } if ((cp = malloc ((unsigned) (cc = (pos = ftell (fp)) + 1))) == NULL) { sm_reply.length = strlen (strcpy (sm_reply.text, "out of memory"));losing1: ; sm_reply.code = NOTOK; (void) fclose (fp); return RP_BHST; } (void) fseek (fp, 0L, 0); for (dp = cp, i = 0; i++ < j; dp += strlen (dp)) if (fgets (dp, cc - (dp - cp), fp) == NULL) { sm_reply.length = strlen (strcpy (sm_reply.text, "premature eof"));losing2: ; free (cp); goto losing1; } *dp = NULL; for (dp = cp, i = cc - 1; i > 0; dp += cc, i -= cc) if ((cc = write (fileno (sm_wfp), dp, i)) == NOTOK) {losing3: ; (void) strcpy (bp = sm_reply.text, "error writing to server: "); bp += strlen (bp); if (errno > 0 && errno < sys_nerr) (void) sprintf (bp, "%s", sys_errlist[errno]); else (void) sprintf (bp, "Error %d", errno); sm_reply.length = strlen (sm_reply.text); goto losing2; } else if (sm_debug) { printf ("wrote %d octets to server\n", cc); (void) fflush (stdout); } for (dp = cp, i = 0; i++ < j; dp = index (dp, '\n'), dp++) { if (sm_debug) { if (bp = index (dp, '\r')) *bp = NULL; printf ("=> %s\n", dp); (void) fflush (stdout); if (bp) *bp = '\r'; } switch (smhear () + (i == 1 ? 1000 : i != j ? 2000 : 3000)) { case 1000 + 250: sm_addrs = 0; result = RP_OK; break; case 1000 + 500: case 1000 + 501: case 1000 + 552: case 2000 + 500: case 2000 + 501: result = RP_PARM; (void) smtalk (SM_RSET, "RSET"); free (cp); goto losing0; case 2000 + 250: case 2000 + 251: sm_addrs++; result = RP_OK; break; case 2000 + 451: #ifdef SENDMAILBUG sm_addrs++; result = RP_OK; break;#endif case 2000 + 421: case 2000 + 450: case 2000 + 452: result = RP_NO; goto bad_addr; case 2000 + 550: case 2000 + 551: case 2000 + 552: case 2000 + 553: result = RP_USER;bad_addr: ; if (k <= 0 || strcmp (sender, "<>\r\n") == 0) break; if (gp == NULL) { int l; (void) sprintf (buffer, "%*.*sA.bulk", k, k, file); if ((gp = fopen (buffer, "w+")) == NULL) goto bad_data; fprintf (gp, "MAIL FROM:<>\r\nRCPT TO:%sDATA\r\n", sender); l = strlen (sender); fprintf (gp, "To: %*.*s\r\nSubject: Invalid addresses (%s)\r\n", l - 4, l - 4, sender + 1, file); fprintf (gp, "Date: %s\r\nFrom: Postmaster@%s\r\n\r\n", dtimenow (), LocalName ()); } if (bp = index (dp, '\r')) *bp = NULL; fprintf (gp, "=> %s\r\n", dp); if (bp) *bp = '\r'; fprintf (gp, "<= %s\r\n", rp_string (result)); (void) fflush (gp); break; case 3000 + 354: #ifdef SENDMAILBUGok_data: ;#endif result = RP_OK; break; case 3000 + 451: #ifdef SENDMAILBUG goto ok_data;#endif case 3000 + 421: result = RP_NO;bad_data: ; (void) smtalk (SM_RSET, "RSET"); free (cp); if (gp) { (void) sprintf (buffer, "%*.*sA.bulk", k, k, file); (void) unlink (buffer); (void) fclose (gp); } (void) fclose (fp); return result; case 3000 + 500: case 3000 + 501: case 3000 + 503: case 3000 + 554: (void) smtalk (SM_RSET, "RSET"); free (cp); goto no_dice; default: result = RP_RPLY; goto bad_data; } } free (cp); { struct stat st;#ifdef SYS5 cc = BUFSIZ;#else if (fstat (fileno (sm_wfp), &st) == NOTOK || (cc = st.st_blksize) < BUFSIZ) cc = BUFSIZ;#endif if ((cp = malloc ((unsigned) cc)) == NULL) { (void) smtalk (SM_RSET, "RSET"); sm_reply.length = strlen (strcpy (sm_reply.text, "out of memory")); goto losing1; } } (void) fseek (fp, pos, 0); for (;;) { int eof = 0; for (dp = cp, i = cc; i > 0; dp += j, i -= j) if ((j = fread (cp, sizeof *cp, i, fp)) == OK) { if (ferror (fp)) { (void) sprintf (bp = sm_reply.text, "error reading %s: ", file); bp += strlen (bp); if (errno > 0 && errno < sys_nerr) (void) sprintf (bp, "%s", sys_errlist[errno]); else (void) sprintf (bp, "Error %d", errno); sm_reply.length = strlen (sm_reply.text); goto losing2; } cc = dp - cp; eof = 1; break; } for (dp = cp, i = cc; i > 0; dp += j, i -= j) if ((j = write (fileno (sm_wfp), dp, i)) == NOTOK) goto losing3; else if (sm_debug) { printf ("wrote %d octets to server\n", j); (void) fflush (stdout); } if (eof) break; } free (cp); switch (smhear ()) { case 250: case 251: #ifdef SENDMAILBUGok_dot: ;#endif result = RP_OK; (void) unlink (file); break; case 451: #ifdef SENDMAILBUG goto ok_dot;#endif case 452: default: result = RP_NO; if (gp) { (void) sprintf (buffer, "%*.*sA.bulk", k, k, file); (void) unlink (buffer); (void) fclose (gp); gp = NULL; } break; case 552: case 554: no_dice: ; result = RP_NDEL; if (k <= 0 || strcmp (sender, "<>\r\n") == 0) { (void) unlink (file); break; } if (gp) { (void) fflush (gp); (void) ftruncate (fileno (gp), 0L); (void) fseek (gp, 0L, 0); } else { (void) sprintf (buffer, "%*.*sA.bulk", k, k, file); if ((gp = fopen (buffer, "w")) == NULL) break; } fprintf (gp, "MAIL FROM:<>\r\nRCPT TO:%sDATA\r\n", sender); i = strlen (sender); fprintf (gp, "To: %*.*s\r\nSubject: Failed mail (%s)\r\n", i - 4, i - 4, sender + 1, file); fprintf (gp, "Date: %s\r\nFrom: Postmaster@%s\r\n\r\n", dtimenow (), LocalName ()); break; } if (gp) { (void) fputs ("\r\n------- Begin Returned message\r\n\r\n", gp); (void) fseek (fp, pos, 0); while (fgets (buffer, sizeof buffer, fp)) { if (buffer[0] == '-') (void) fputs ("- ", gp); if (strcmp (buffer, ".\r\n")) (void) fputs (buffer, gp); } (void) fputs ("\r\n------- End Returned Message\r\n\r\n.\r\n", gp); (void) fflush (gp); if (!ferror (gp)) (void) unlink (file); (void) fclose (gp); } (void) fclose (fp); return result;}#endif#endif /* MPOP */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -