1 # include <wellknown.h> 2 # include <sysexits.h> 3 # include <stdio.h> 4 # include <useful.h> 5 6 static char SccsId[] = "@(#)usersmtp.c 3.1 10/31/81"; 7 8 /* 9 ** TCP -- TCP/Ethernet/ARPAnet mailer 10 ** 11 ** This arranges to send a message over the TCP connection. 12 */ 13 14 # define MAXLINE 200 15 16 char *MailCommand = "/usr/lib/sendmail"; 17 char *MailUser = "network"; 18 char *MailPassword = NULL; 19 FILE *MailFile; 20 bool Verbose; 21 22 main(argc, argv) 23 int argc; 24 char **argv; 25 { 26 extern FILE *openconnection(); 27 register int stat; 28 29 if (argc < 4) 30 exit(EX_USAGE); 31 32 MailFile = openconnection(argv[2]); 33 if (MailFile == NULL) 34 exit(EX_TEMPFAIL); 35 36 stat = runsmtp(argv[1], &argv[3]); 37 38 exit(stat); 39 } 40 /* 41 ** OPENCONNECTION -- open connection to SMTP socket 42 ** 43 ** Parameters: 44 ** none. 45 ** 46 ** Returns: 47 ** file pointer of connection. 48 ** NULL on error. 49 ** 50 ** Side Effects: 51 ** none. 52 */ 53 54 FILE * 55 openconnection(host) 56 char *host; 57 { 58 char cmdbuf[100]; 59 extern FILE *rexec(); 60 register FILE *f; 61 62 /* create the command name */ 63 sprintf(cmdbuf, "%s -p", MailCommand); 64 65 /* create connection (we hope) */ 66 f = rexec(&host, SHELLSERVER, cmdbuf, &MailUser, NULL); 67 68 return (f); 69 } 70 /* 71 ** RUNSMTP -- run the SMTP protocol over connection. 72 ** 73 ** Parameters: 74 ** fr -- from person. 75 ** tolist -- list of recipients. 76 ** mf -- mail connection file. 77 ** 78 ** Returns: 79 ** none. 80 ** 81 ** Side Effects: 82 ** Sends the mail via SMTP. 83 */ 84 85 runsmtp(fr, tolist, mf) 86 char *fr; 87 char **tolist; 88 FILE *mf; 89 { 90 register int r; 91 register char **t; 92 char buf[MAXLINE]; 93 94 /* get greeting message */ 95 r = reply(mf); 96 if (r / 100 != 2) 97 return (EX_TEMPFAIL); 98 99 /* send the mail command */ 100 fprintf(mf, "MAIL From:<%s>\r\n", fr); 101 r = reply(mf); 102 if (r != 250) 103 return (EX_SOFTWARE); 104 105 /* send the recipients */ 106 for (t = tolist; *t != NULL; t++) 107 { 108 fprintf(mf, "MRCP To:<%s>\r\n", *t); 109 r = reply(mf); 110 if (r != 250) 111 return (EX_NOUSER); 112 } 113 114 /* send the data */ 115 fprintf(mf, "DATA\r\n"); 116 r = reply(mf); 117 if (r != 354) 118 return (EX_SOFTWARE); 119 while (fgets(buf, sizeof buf, stdin) != NULL) 120 { 121 /* change trailing newline to crlf */ 122 register char *p = index(buf, '\n'); 123 124 if (p != NULL) 125 *p = '\0'; 126 if (buf[0] == '.') 127 fprintf(mf, "."); 128 fprintf(mf, "%s\r\n", buf); 129 } 130 fprintf(mf, ".\r\n"); 131 r = reply(mf); 132 if (r != 250) 133 return (EX_SOFTWARE); 134 135 /* force delivery */ 136 fprintf(mf, "DOIT\r\n"); 137 r = reply(mf); 138 if (r != 250) 139 return (EX_TEMPFAIL); 140 141 fprintf(mf, "QUIT\r\n"); 142 r = reply(mf); 143 if (r != 221) 144 return (EX_SOFTWARE); 145 146 return (EX_OK); 147 } 148 /* 149 ** REPLY -- read arpanet reply 150 ** 151 ** Parameters: 152 ** mf -- mail file. 153 ** 154 ** Returns: 155 ** reply code it reads. 156 ** 157 ** Side Effects: 158 ** flushes the mail file. 159 */ 160 161 reply(mf) 162 FILE *mf; 163 { 164 fflush(mf); 165 166 /* read the input line */ 167 for (;;) 168 { 169 char buf[MAXLINE]; 170 register int r; 171 172 if (fgets(buf, sizeof buf, mf) == NULL) 173 return (-1); 174 if (Verbose) 175 fputs(buf, stdout); 176 if (buf[3] == '-') 177 continue; 178 r = atoi(buf); 179 if (r < 100) 180 continue; 181 return (r); 182 } 183 } 184