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