Mercurial > hg > mlmmj
annotate src/mlmmj-send.c @ 777:5f038f36f66f
Removed redundant memory freeing code
author | Ben Schmidt |
---|---|
date | Fri, 12 Nov 2010 02:30:21 +1100 |
parents | de31a9e15c5b |
children | 563b513fae21 |
rev | line source |
---|---|
486 | 1 /* Copyright (C) 2004, 2003, 2004 Mads Martin Joergensen <mmj at mmj.dk> |
0 | 2 * |
3 * $Id$ | |
4 * | |
225 | 5 * Permission is hereby granted, free of charge, to any person obtaining a copy |
6 * of this software and associated documentation files (the "Software"), to | |
7 * deal in the Software without restriction, including without limitation the | |
8 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or | |
9 * sell copies of the Software, and to permit persons to whom the Software is | |
10 * furnished to do so, subject to the following conditions: | |
11 * | |
12 * The above copyright notice and this permission notice shall be included in | |
13 * all copies or substantial portions of the Software. | |
14 * | |
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
18 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | |
21 * IN THE SOFTWARE. | |
0 | 22 */ |
23 | |
24 #include <stdio.h> | |
25 #include <stdlib.h> | |
26 #include <unistd.h> | |
27 #include <errno.h> | |
28 #include <string.h> | |
29 #include <sys/stat.h> | |
30 #include <fcntl.h> | |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
31 #include <sys/types.h> |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
32 #include <dirent.h> |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
33 #include <sys/wait.h> |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
34 #include <signal.h> |
95 | 35 #include <libgen.h> |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
36 #include <syslog.h> |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
37 #include <stdarg.h> |
174
8a565328fa73
Instead of reading 1 line at a time in mlmmj-send everytime we send the
mmj
parents:
171
diff
changeset
|
38 #include <sys/mman.h> |
268
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
39 #include <limits.h> |
291 | 40 #include <netdb.h> |
41 #include <sys/socket.h> | |
42 #include <netinet/in.h> | |
43 #include <arpa/inet.h> | |
489 | 44 #include <signal.h> |
0 | 45 |
426 | 46 #include "mlmmj.h" |
0 | 47 #include "mlmmj-send.h" |
48 #include "mail-functions.h" | |
49 #include "itoa.h" | |
50 #include "incindexfile.h" | |
51 #include "chomp.h" | |
52 #include "checkwait_smtpreply.h" | |
53 #include "getlistaddr.h" | |
520 | 54 #include "getlistdelim.h" |
0 | 55 #include "init_sockfd.h" |
56 #include "strgen.h" | |
25 | 57 #include "log_error.h" |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
58 #include "mygetline.h" |
171 | 59 #include "wrappers.h" |
245 | 60 #include "memory.h" |
268
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
61 #include "statctrl.h" |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
62 #include "ctrlvalue.h" |
411
79355dd5ecc2
Make the envelope from match the new order (VERP prep) and also remove
mmj
parents:
401
diff
changeset
|
63 #include "mylocking.h" |
426 | 64 #include "getaddrsfromfd.h" |
268
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
65 |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
66 static int addtohdr = 0; |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
67 static int prepmailinmem = 0; |
426 | 68 static int maxverprecips = MAXVERPRECIPS; |
489 | 69 static int gotsigterm = 0; |
70 | |
71 void catch_sig_term(int sig) | |
72 { | |
490 | 73 gotsigterm = 1; |
489 | 74 } |
0 | 75 |
601 | 76 char *get_index_from_filename(const char *filename) |
77 { | |
78 char *myfilename, *indexstr, *ret; | |
79 size_t len; | |
80 | |
81 myfilename = mystrdup(filename); | |
82 if (!myfilename) { | |
83 return NULL; | |
84 } | |
85 | |
86 len = strlen(myfilename); | |
87 if (len > 9 && (strcmp(myfilename + len - 9, "/mailfile") == 0)) { | |
88 myfilename[len - 9] = '\0'; | |
89 } | |
90 | |
91 indexstr = strrchr(myfilename, '/'); | |
92 if (indexstr) { | |
93 indexstr++; /* skip the slash */ | |
94 } else { | |
95 indexstr = myfilename; | |
96 } | |
97 | |
98 ret = mystrdup(indexstr); | |
99 myfree(myfilename); | |
100 | |
101 return ret; | |
102 } | |
103 | |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
104 char *bounce_from_adr(const char *recipient, const char *listadr, |
677
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
105 const char *listdelim, const char *mailfilename, |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
106 const char *listdir) |
0 | 107 { |
677
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
108 char *bounceaddr, *myrecipient, *mylistadr; |
465 | 109 char *indexstr, *listdomain, *a = NULL, *mymailfilename; |
677
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
110 char *staticbounceaddr, *staticbounceaddr_localpart; |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
111 char *staticbounceaddr_domain; |
7 | 112 size_t len; |
113 | |
245 | 114 mymailfilename = mystrdup(mailfilename); |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
115 if (!mymailfilename) { |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
116 return NULL; |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
117 } |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
118 |
601 | 119 indexstr = get_index_from_filename(mymailfilename); |
677
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
120 if (!indexstr) { |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
121 myfree(mymailfilename); |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
122 return NULL; |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
123 } |
0 | 124 |
245 | 125 myrecipient = mystrdup(recipient); |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
126 if (!myrecipient) { |
245 | 127 myfree(mymailfilename); |
7 | 128 return NULL; |
129 } | |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
130 a = strchr(myrecipient, '@'); |
465 | 131 if (a) |
132 *a = '='; | |
0 | 133 |
245 | 134 mylistadr = mystrdup(listadr); |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
135 if (!mylistadr) { |
245 | 136 myfree(mymailfilename); |
137 myfree(myrecipient); | |
7 | 138 return NULL; |
139 } | |
140 | |
520 | 141 listdomain = strchr(mylistadr, '@'); |
142 if (!listdomain) { | |
143 myfree(mymailfilename); | |
144 myfree(myrecipient); | |
145 myfree(mylistadr); | |
146 return NULL; | |
147 } | |
7 | 148 *listdomain++ = '\0'; |
0 | 149 |
520 | 150 /* 11 = "bounces-" + "-" + "@" + NUL */ |
677
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
151 len = strlen(mylistadr) + strlen(listdelim) + strlen(myrecipient) |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
152 + strlen(indexstr) + strlen(listdomain) + 11; |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
153 |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
154 staticbounceaddr = ctrlvalue(listdir, "staticbounceaddr"); |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
155 if (staticbounceaddr) { |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
156 staticbounceaddr_localpart = genlistname(staticbounceaddr); |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
157 staticbounceaddr_domain = genlistfqdn(staticbounceaddr); |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
158 |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
159 /* localpart + "-" + domain */ |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
160 len += strlen(staticbounceaddr_localpart) + 1 |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
161 + strlen(staticbounceaddr_domain); |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
162 } else { |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
163 staticbounceaddr_localpart = NULL; |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
164 staticbounceaddr_domain = NULL; |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
165 } |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
166 |
245 | 167 bounceaddr = mymalloc(len); |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
168 if (!bounceaddr) { |
677
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
169 myfree(staticbounceaddr); |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
170 myfree(staticbounceaddr_localpart); |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
171 myfree(staticbounceaddr_domain); |
245 | 172 myfree(myrecipient); |
173 myfree(mylistadr); | |
7 | 174 return NULL; |
175 } | |
677
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
176 |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
177 if (staticbounceaddr) { |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
178 snprintf(bounceaddr, len, "%s%s%s-bounces-%s-%s@%s", |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
179 staticbounceaddr_localpart, listdelim, mylistadr, |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
180 indexstr, myrecipient, staticbounceaddr_domain); |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
181 |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
182 myfree(staticbounceaddr); |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
183 myfree(staticbounceaddr_localpart); |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
184 myfree(staticbounceaddr_domain); |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
185 } else { |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
186 snprintf(bounceaddr, len, "%s%sbounces-%s-%s@%s", mylistadr, listdelim, |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
187 indexstr, myrecipient, listdomain); |
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
188 } |
0 | 189 |
245 | 190 myfree(myrecipient); |
191 myfree(mylistadr); | |
601 | 192 myfree(indexstr); |
245 | 193 myfree(mymailfilename); |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
194 |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
195 return bounceaddr; |
0 | 196 } |
197 | |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
198 int bouncemail(const char *listdir, const char *mlmmjbounce, const char *from) |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
199 { |
245 | 200 char *myfrom = mystrdup(from); |
520 | 201 char *listdelim = getlistdelim(listdir); |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
202 char *addr, *num, *c; |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
203 size_t len; |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
204 pid_t pid = 0; |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
205 |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
206 if((c = strchr(myfrom, '@')) == NULL) { |
245 | 207 myfree(myfrom); |
520 | 208 myfree(listdelim); |
147
e53fe7b9022b
mlmmj-maintd now resends the ones that failed. Add listctrl switch to
mmj
parents:
146
diff
changeset
|
209 return 0; /* Success when malformed 'from' */ |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
210 } |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
211 *c = '\0'; |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
212 num = strrchr(myfrom, '-'); |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
213 num++; |
520 | 214 c = strstr(myfrom, listdelim); |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
215 myfrom = strchr(c, '-'); |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
216 myfrom++; |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
217 len = num - myfrom - 1; |
245 | 218 addr = mymalloc(len + 1); |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
219 addr[len] = '\0'; |
115 | 220 strncpy(addr, myfrom, len); |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
221 |
520 | 222 myfree(listdelim); |
223 | |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
224 pid = fork(); |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
225 |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
226 if(pid < 0) { |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
227 log_error(LOG_ARGS, "fork() failed!"); |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
228 return 1; |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
229 } |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
230 |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
231 if(pid > 0) |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
232 return 0; |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
233 |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
234 execlp(mlmmjbounce, mlmmjbounce, |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
235 "-L", listdir, |
426 | 236 "-a", num, |
435 | 237 "-n", addr, (char *)NULL); |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
238 |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
239 log_error(LOG_ARGS, "execlp() of '%s' failed", mlmmjbounce); |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
240 |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
241 return 1; |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
242 } |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
243 |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
244 int send_mail(int sockfd, const char *from, const char *to, |
174
8a565328fa73
Instead of reading 1 line at a time in mlmmj-send everytime we send the
mmj
parents:
171
diff
changeset
|
245 const char *replyto, char *mailmap, size_t mailsize, |
268
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
246 const char *listdir, const char *mlmmjbounce, |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
247 const char *hdrs, size_t hdrslen, const char *body, |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
248 size_t bodylen) |
0 | 249 { |
95 | 250 int retval = 0; |
773 | 251 char *reply, *reply2, *tohdr; |
472 | 252 |
253 if(strchr(to, '@') == NULL) { | |
254 errno = 0; | |
255 log_error(LOG_ARGS, "No @ in address, ignoring %s", | |
256 to); | |
257 return 0; | |
258 } | |
174
8a565328fa73
Instead of reading 1 line at a time in mlmmj-send everytime we send the
mmj
parents:
171
diff
changeset
|
259 |
426 | 260 retval = write_mail_from(sockfd, from, ""); |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
261 if(retval) { |
39 | 262 log_error(LOG_ARGS, "Could not write MAIL FROM\n"); |
0 | 263 return retval; |
264 } | |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
265 reply = checkwait_smtpreply(sockfd, MLMMJ_FROM); |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
266 if(reply) { |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
267 log_error(LOG_ARGS, "Error in MAIL FROM. Reply = [%s]", |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
268 reply); |
245 | 269 myfree(reply); |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
270 write_rset(sockfd); |
773 | 271 reply2 = checkwait_smtpreply(sockfd, MLMMJ_RSET); |
272 if (reply2 != NULL) myfree(reply2); | |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
273 return MLMMJ_FROM; |
0 | 274 } |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
275 retval = write_rcpt_to(sockfd, to); |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
276 if(retval) { |
39 | 277 log_error(LOG_ARGS, "Could not write RCPT TO:\n"); |
0 | 278 return retval; |
279 } | |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
280 |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
281 reply = checkwait_smtpreply(sockfd, MLMMJ_RCPTTO); |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
282 if(reply) { |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
283 write_rset(sockfd); |
773 | 284 reply2 = checkwait_smtpreply(sockfd, MLMMJ_RSET); |
285 if (reply2 != NULL) myfree(reply2); | |
225 | 286 if(mlmmjbounce && ((reply[0] == '4') || (reply[0] == '5')) |
287 && (reply[1] == '5')) { | |
245 | 288 myfree(reply); |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
289 return bouncemail(listdir, mlmmjbounce, from); |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
290 } else { |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
291 log_error(LOG_ARGS, "Error in RCPT TO. Reply = [%s]", |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
292 reply); |
245 | 293 myfree(reply); |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
294 return MLMMJ_RCPTTO; |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
295 } |
0 | 296 } |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
297 |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
298 retval = write_data(sockfd); |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
299 if(retval) { |
39 | 300 log_error(LOG_ARGS, "Could not write DATA\b"); |
0 | 301 return retval; |
302 } | |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
303 |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
304 reply = checkwait_smtpreply(sockfd, MLMMJ_DATA); |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
305 if(reply) { |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
306 log_error(LOG_ARGS, "Error with DATA. Reply = [%s]", reply); |
245 | 307 myfree(reply); |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
308 write_rset(sockfd); |
773 | 309 reply2 = checkwait_smtpreply(sockfd, MLMMJ_RSET); |
310 if (reply2 != NULL) myfree(reply2); | |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
311 return MLMMJ_DATA; |
0 | 312 } |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
313 |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
314 if(replyto) { |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
315 retval = write_replyto(sockfd, replyto); |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
316 if(retval) { |
39 | 317 log_error(LOG_ARGS, "Could not write reply-to addr.\n"); |
0 | 318 return retval; |
319 } | |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
320 } |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
321 |
268
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
322 if(addtohdr) |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
323 tohdr = concatstr(3, "To: ", to, "\r\n"); |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
324 else |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
325 tohdr = NULL; |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
326 |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
327 if(prepmailinmem) { |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
328 retval = writen(sockfd, hdrs, hdrslen); |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
329 if(retval < 0) { |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
330 log_error(LOG_ARGS, "Could not write mailheaders.\n"); |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
331 return retval; |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
332 } |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
333 if(tohdr) { |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
334 retval = writen(sockfd, tohdr, strlen(tohdr)); |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
335 if(retval < 0) { |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
336 log_error(LOG_ARGS, "Could not write To:.\n"); |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
337 return retval; |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
338 } |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
339 myfree(tohdr); |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
340 } |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
341 retval = writen(sockfd, body, bodylen); |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
342 if(retval < 0) { |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
343 log_error(LOG_ARGS, "Could not write mailbody.\n"); |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
344 return retval; |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
345 } |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
346 } else { |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
347 retval = write_mailbody_from_map(sockfd, mailmap, mailsize, |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
348 tohdr); |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
349 if(retval) { |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
350 log_error(LOG_ARGS, "Could not write mail\n"); |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
351 return retval; |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
352 } |
0 | 353 } |
354 | |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
355 retval = write_dot(sockfd); |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
356 if(retval) { |
39 | 357 log_error(LOG_ARGS, "Could not write <CR><LF>.<CR><LF>\n"); |
0 | 358 return retval; |
359 } | |
360 | |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
361 reply = checkwait_smtpreply(sockfd, MLMMJ_DOT); |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
362 if(reply) { |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
363 log_error(LOG_ARGS, "Mailserver did not ack end of mail.\n" |
0 | 364 "<CR><LF>.<CR><LF> was written, to no" |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
365 "avail. Reply = [%s]", reply); |
245 | 366 myfree(reply); |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
367 write_rset(sockfd); |
773 | 368 reply2 = checkwait_smtpreply(sockfd, MLMMJ_RSET); |
369 if (reply2 != NULL) myfree(reply2); | |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
370 return MLMMJ_DOT; |
0 | 371 } |
372 | |
373 return 0; | |
374 } | |
375 | |
458 | 376 int initsmtp(int *sockfd, const char *relayhost, unsigned short port) |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
377 { |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
378 int retval = 0; |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
379 char *reply = NULL; |
99
6089f38bb228
Send our hostname in HELO and change the mlmmj-send output from
mmj
parents:
95
diff
changeset
|
380 char *myhostname = hostnamestr(); |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
381 |
458 | 382 init_sockfd(sockfd, relayhost, port); |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
383 |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
384 if((reply = checkwait_smtpreply(*sockfd, MLMMJ_CONNECT)) != NULL) { |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
385 log_error(LOG_ARGS, "No proper greeting to our connect" |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
386 "Reply: [%s]", reply); |
245 | 387 myfree(reply); |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
388 retval = MLMMJ_CONNECT; |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
389 /* FIXME: Queue etc. */ |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
390 } |
99
6089f38bb228
Send our hostname in HELO and change the mlmmj-send output from
mmj
parents:
95
diff
changeset
|
391 write_helo(*sockfd, myhostname); |
245 | 392 myfree(myhostname); |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
393 if((reply = checkwait_smtpreply(*sockfd, MLMMJ_HELO)) != NULL) { |
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
394 log_error(LOG_ARGS, "Error with HELO. Reply: [%s]", reply); |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
395 /* FIXME: quit and tell admin to configure correctly */ |
245 | 396 myfree(reply); |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
397 retval = MLMMJ_HELO; |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
398 } |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
399 |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
400 return retval; |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
401 } |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
402 |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
403 int endsmtp(int *sockfd) |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
404 { |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
405 int retval = 0; |
426 | 406 char *reply = NULL; |
445 | 407 |
408 if(*sockfd == -1) | |
409 return retval; | |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
410 |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
411 write_quit(*sockfd); |
426 | 412 reply = checkwait_smtpreply(*sockfd, MLMMJ_QUIT); |
413 if(reply) { | |
414 printf("reply from quit: %s\n", reply); | |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
415 log_error(LOG_ARGS, "Mailserver would not let us QUIT. " |
426 | 416 "We close the socket anyway though. " |
417 "Mailserver reply = [%s]", reply); | |
245 | 418 myfree(reply); |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
419 retval = MLMMJ_QUIT; |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
420 } |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
421 |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
422 close(*sockfd); |
465 | 423 *sockfd = -1; |
424 | |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
425 return retval; |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
426 } |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
427 |
426 | 428 int send_mail_verp(int sockfd, struct strlist *addrs, char *mailmap, |
429 size_t mailsize, const char *from, const char *listdir, | |
430 const char *hdrs, size_t hdrslen, const char *body, | |
431 size_t bodylen, const char *verpextra) | |
432 { | |
433 int retval, i; | |
773 | 434 char *reply, *reply2; |
426 | 435 |
436 retval = write_mail_from(sockfd, from, verpextra); | |
437 if(retval) { | |
438 log_error(LOG_ARGS, "Could not write MAIL FROM\n"); | |
439 return retval; | |
440 } | |
441 reply = checkwait_smtpreply(sockfd, MLMMJ_FROM); | |
442 if(reply) { | |
443 log_error(LOG_ARGS, "Error in MAIL FROM. Reply = [%s]", | |
444 reply); | |
445 myfree(reply); | |
446 write_rset(sockfd); | |
773 | 447 reply2 = checkwait_smtpreply(sockfd, MLMMJ_RSET); |
448 if (reply2 != NULL) myfree(reply2); | |
426 | 449 return MLMMJ_FROM; |
450 } | |
451 for(i = 0; i < addrs->count; i++) { | |
489 | 452 if(gotsigterm) { |
748
dfc9ab125fd4
Fix spelling of 'receive' and 'voodoo'; make mlmmj-recieve a symlink
Chris Webb
parents:
727
diff
changeset
|
453 log_error(LOG_ARGS, "TERM signal received, " |
489 | 454 "shutting down."); |
455 return -1; | |
456 } | |
472 | 457 if(strchr(addrs->strs[i], '@') == NULL) { |
458 errno = 0; | |
459 log_error(LOG_ARGS, "No @ in address, ignoring %s", | |
460 addrs->strs[i]); | |
461 continue; | |
462 } | |
426 | 463 retval = write_rcpt_to(sockfd, addrs->strs[i]); |
464 if(retval) { | |
465 log_error(LOG_ARGS, "Could not write RCPT TO:\n"); | |
466 return retval; | |
467 } | |
468 | |
469 reply = checkwait_smtpreply(sockfd, MLMMJ_RCPTTO); | |
470 if(reply) { | |
471 log_error(LOG_ARGS, "Error in RCPT TO. Reply = [%s]", | |
472 reply); | |
473 myfree(reply); | |
474 return MLMMJ_RCPTTO; | |
475 } | |
476 } | |
477 | |
478 retval = write_data(sockfd); | |
479 if(retval) { | |
480 log_error(LOG_ARGS, "Could not write DATA\b"); | |
481 return retval; | |
482 } | |
483 | |
484 reply = checkwait_smtpreply(sockfd, MLMMJ_DATA); | |
485 if(reply) { | |
486 log_error(LOG_ARGS, "Error with DATA. Reply = [%s]", reply); | |
487 myfree(reply); | |
488 write_rset(sockfd); | |
773 | 489 reply2 = checkwait_smtpreply(sockfd, MLMMJ_RSET); |
490 if (reply2 != NULL) myfree(reply2); | |
426 | 491 return MLMMJ_DATA; |
492 } | |
493 | |
494 if(prepmailinmem) { | |
495 retval = writen(sockfd, hdrs, hdrslen); | |
496 if(retval < 0) { | |
497 log_error(LOG_ARGS, "Could not write mailheaders.\n"); | |
498 return retval; | |
499 } | |
500 retval = writen(sockfd, body, bodylen); | |
501 if(retval < 0) { | |
502 log_error(LOG_ARGS, "Could not write mailbody.\n"); | |
503 return retval; | |
504 } | |
505 } else { | |
506 retval = write_mailbody_from_map(sockfd, mailmap, mailsize, | |
507 NULL); | |
508 if(retval) { | |
509 log_error(LOG_ARGS, "Could not write mail\n"); | |
510 return retval; | |
511 } | |
512 } | |
513 | |
514 retval = write_dot(sockfd); | |
515 if(retval) { | |
516 log_error(LOG_ARGS, "Could not write <CR><LF>.<CR><LF>\n"); | |
517 return retval; | |
518 } | |
519 | |
520 reply = checkwait_smtpreply(sockfd, MLMMJ_DOT); | |
521 if(reply) { | |
522 log_error(LOG_ARGS, "Mailserver did not ack end of mail.\n" | |
523 "<CR><LF>.<CR><LF> was written, to no" | |
524 "avail. Reply = [%s]", reply); | |
525 myfree(reply); | |
526 write_rset(sockfd); | |
773 | 527 reply2 = checkwait_smtpreply(sockfd, MLMMJ_RSET); |
528 if (reply2 != NULL) myfree(reply2); | |
426 | 529 return MLMMJ_DOT; |
530 } | |
531 | |
532 return 0; | |
533 } | |
534 | |
535 int send_mail_many_fd(int sockfd, const char *from, const char *replyto, | |
536 char *mailmap, size_t mailsize, int subfd, | |
520 | 537 const char *listaddr, const char *listdelim, |
538 const char *archivefilename, const char *listdir, | |
539 const char *mlmmjbounce, const char *hdrs, size_t hdrslen, | |
540 const char *body, size_t bodylen) | |
426 | 541 { |
542 int res, ret, i; | |
543 struct strlist stl; | |
544 | |
465 | 545 stl.strs = NULL; |
432 | 546 stl.count = 0; |
547 | |
426 | 548 do { |
549 res = getaddrsfromfd(&stl, subfd, maxverprecips); | |
550 if(stl.count == maxverprecips) { | |
551 ret = send_mail_many_list(sockfd, from, replyto, | |
552 mailmap, mailsize, &stl, listaddr, | |
520 | 553 listdelim, archivefilename, listdir, |
554 mlmmjbounce, hdrs, hdrslen, | |
555 body, bodylen); | |
426 | 556 for(i = 0; i < stl.count; i++) |
557 myfree(stl.strs[i]); | |
558 if(ret < 0) | |
559 return ret; | |
560 stl.count = 0; | |
561 } | |
562 } while(res > 0); | |
563 | |
564 if(stl.count) { | |
565 ret = send_mail_many_list(sockfd, from, replyto, mailmap, | |
520 | 566 mailsize, &stl, listaddr, listdelim, |
567 archivefilename, listdir, mlmmjbounce, | |
568 hdrs, hdrslen, body, bodylen); | |
426 | 569 for(i = 0; i < stl.count; i++) |
570 myfree(stl.strs[i]); | |
571 stl.count = 0; | |
572 return ret; | |
573 } | |
574 | |
575 return 0; | |
576 } | |
577 | |
578 int requeuemail(const char *listdir, const char *index, struct strlist *addrs, | |
579 int addrcount) | |
580 { | |
581 int addrfd, i; | |
582 char *dirname, *addrfilename, *addr; | |
583 | |
584 dirname = concatstr(3, listdir, "/requeue/", index); | |
585 if(mkdir(dirname, 0750) < 0 && errno != EEXIST) { | |
586 log_error(LOG_ARGS, "Could not mkdir(%s) for " | |
587 "requeueing. Mail cannot " | |
588 "be requeued.", dirname); | |
589 myfree(dirname); | |
590 return -1; | |
591 } | |
592 addrfilename = concatstr(2, dirname, "/subscribers"); | |
593 myfree(dirname); | |
594 addrfd = open(addrfilename, O_WRONLY|O_CREAT|O_APPEND, | |
595 S_IRUSR|S_IWUSR); | |
596 if(addrfd < 0) { | |
597 log_error(LOG_ARGS, "Could not open %s", | |
598 addrfilename); | |
599 myfree(addrfilename); | |
600 return -1; | |
601 } else { | |
602 /* Dump the remaining addresses. We dump the remaining before | |
603 * we write the failing address to ensure the potential good | |
604 * ones will be tried first when mlmmj-maintd sends out mails | |
605 * that have been requeued. addrcount was so far we were */ | |
606 for(i = addrcount + 1; i < addrs->count; i++) { | |
607 addr = concatstr(2, addrs->strs[i], "\n"); | |
608 if(writen(addrfd, addr, strlen(addr)) < 0) { | |
609 log_error(LOG_ARGS, "Could not add [%s] " | |
610 "to requeue file", addr); | |
611 return -1; | |
612 } | |
613 myfree(addr); | |
614 } | |
615 addr = concatstr(2, addrs->strs[addrcount], "\n"); | |
616 if(writen(addrfd, addr, strlen(addr)) < 0) { | |
617 log_error(LOG_ARGS, "Could not add [%s] to requeue " | |
618 "file", addr); | |
619 return -1; | |
620 } | |
621 myfree(addr); | |
622 } | |
623 myfree(addrfilename); | |
624 close(addrfd); | |
625 | |
626 return 0; | |
627 } | |
628 | |
629 int send_mail_many_list(int sockfd, const char *from, const char *replyto, | |
630 char *mailmap, size_t mailsize, struct strlist *addrs, | |
520 | 631 const char *listaddr, const char *listdelim, |
632 const char *archivefilename, const char *listdir, | |
633 const char *mlmmjbounce, const char *hdrs, size_t hdrslen, | |
634 const char *body, size_t bodylen) | |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
635 { |
601 | 636 int res = 0, i, status; |
426 | 637 char *bounceaddr, *addr, *index; |
177
503250510778
Use mmap to find the subscribers in the subscribers files
mmj
parents:
176
diff
changeset
|
638 |
426 | 639 for(i = 0; i < addrs->count; i++) { |
640 addr = addrs->strs[i]; | |
472 | 641 if(strchr(addr, '@') == NULL) { |
642 errno = 0; | |
643 log_error(LOG_ARGS, "No @ in address, ignoring %s", | |
644 addr); | |
645 continue; | |
646 } | |
493 | 647 if(gotsigterm && listaddr && archivefilename) { |
648 /* we got SIGTERM, so save the addresses and bail */ | |
748
dfc9ab125fd4
Fix spelling of 'receive' and 'voodoo'; make mlmmj-recieve a symlink
Chris Webb
parents:
727
diff
changeset
|
649 log_error(LOG_ARGS, "TERM signal received, " |
493 | 650 "shutting down."); |
601 | 651 index = get_index_from_filename(archivefilename); |
652 status = requeuemail(listdir, index, addrs, i); | |
653 myfree(index); | |
654 return status; | |
493 | 655 } |
338 | 656 if(from) { |
426 | 657 res = send_mail(sockfd, from, addr, replyto, |
268
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
658 mailmap, mailsize, listdir, NULL, |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
659 hdrs, hdrslen, body, bodylen); |
338 | 660 } else { |
520 | 661 bounceaddr = bounce_from_adr(addr, listaddr, listdelim, |
677
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
662 archivefilename, listdir); |
426 | 663 res = send_mail(sockfd, bounceaddr, addr, replyto, |
268
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
664 mailmap, mailsize, listdir, mlmmjbounce, |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
665 hdrs, hdrslen, body, bodylen); |
245 | 666 myfree(bounceaddr); |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
667 } |
493 | 668 if(res && listaddr && archivefilename) { |
669 /* we failed, so save the addresses and bail */ | |
601 | 670 index = get_index_from_filename(archivefilename); |
671 status = requeuemail(listdir, index, addrs, i); | |
672 myfree(index); | |
673 return status; | |
95 | 674 } |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
675 } |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
676 return 0; |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
677 } |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
678 |
102 | 679 static void print_help(const char *prg) |
680 { | |
756 | 681 printf("Usage: %s [-L /path/to/list -m /path/to/mail | -l listctrl]\n" |
682 " [-a] [-D] [-F sender@example.org] [-h] [-o address@example.org]\n" | |
683 " [-r 127.0.0.1] [-R reply@example.org] [-s /path/to/subscribers]\n" | |
684 " [-T recipient@example.org] [-V]\n" | |
116 | 685 " -a: Don't archive the mail\n" |
102 | 686 " -D: Don't delete the mail after it's sent\n" |
687 " -F: What to use as MAIL FROM:\n" | |
688 " -h: This help\n" | |
147
e53fe7b9022b
mlmmj-maintd now resends the ones that failed. Add listctrl switch to
mmj
parents:
146
diff
changeset
|
689 " -l: List control variable:\n", prg); |
e53fe7b9022b
mlmmj-maintd now resends the ones that failed. Add listctrl switch to
mmj
parents:
146
diff
changeset
|
690 printf(" '1' means 'send a single mail'\n" |
102 | 691 " '2' means 'mail to moderators'\n" |
184 | 692 " '3' means 'resend failed list mail'\n" |
272 | 693 " '4' means 'send to file with recipients'\n" |
694 " '5' means 'bounceprobe'\n" | |
298 | 695 " '6' means 'single listmail to single recipient'\n" |
756 | 696 " '7' means 'digest'\n"); |
697 printf(" -L: Full path to list directory\n" | |
102 | 698 " -m: Full path to mail file\n" |
727
4575d3181ca1
Added notmetoo feature where posts are not mirrored to their senders.
Ben Schmidt
parents:
677
diff
changeset
|
699 " -o: Address to omit from distribution (normal mail only)\n" |
272 | 700 " -r: Relayhost IP address (defaults to 127.0.0.1)\n" |
102 | 701 " -R: What to use as Reply-To: header\n" |
147
e53fe7b9022b
mlmmj-maintd now resends the ones that failed. Add listctrl switch to
mmj
parents:
146
diff
changeset
|
702 " -s: Subscribers file name\n" |
102 | 703 " -T: What to use as RCPT TO:\n" |
147
e53fe7b9022b
mlmmj-maintd now resends the ones that failed. Add listctrl switch to
mmj
parents:
146
diff
changeset
|
704 " -V: Print version\n"); |
102 | 705 exit(EXIT_SUCCESS); |
706 } | |
707 | |
0 | 708 int main(int argc, char **argv) |
709 { | |
268
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
710 size_t len = 0, hdrslen, bodylen; |
445 | 711 int sockfd = -1, mailfd = 0, opt, mindex = 0, subfd = 0, tmpfd, i; |
426 | 712 int deletewhensent = 1, sendres = 0, archive = 1, digest = 0; |
713 int ctrlarchive, res; | |
520 | 714 char *listaddr = NULL, *listdelim = NULL; |
727
4575d3181ca1
Added notmetoo feature where posts are not mirrored to their senders.
Ben Schmidt
parents:
677
diff
changeset
|
715 char *mailfilename = NULL, *subfilename = NULL, *omit = NULL; |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
716 char *replyto = NULL, *bounceaddr = NULL, *to_addr = NULL; |
103
bf4390ecc30b
Also dump MAIL FROM:, RCPT TO: and Reply To: variables in the case of an
mmj
parents:
102
diff
changeset
|
717 char *relayhost = NULL, *archivefilename = NULL, *tmpstr; |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
718 char *listctrl = NULL, *subddirname = NULL, *listdir = NULL; |
264
d3ade2c1f058
Make mlmmj-send capable of handling bouncing bounce probes to a local user on
mmj
parents:
262
diff
changeset
|
719 char *mlmmjbounce = NULL, *bindir, *mailmap, *probefile, *a; |
426 | 720 char *body = NULL, *hdrs = NULL, *memmailsizestr = NULL, *verp = NULL; |
721 char relay[16], *listname, *listfqdn, *verpfrom, *maxverprecipsstr; | |
601 | 722 char strindex[32], *reply, *strport, *requeuefilename; |
272 | 723 ssize_t memmailsize = 0; |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
724 DIR *subddir; |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
725 struct dirent *dp; |
174
8a565328fa73
Instead of reading 1 line at a time in mlmmj-send everytime we send the
mmj
parents:
171
diff
changeset
|
726 struct stat st; |
291 | 727 struct hostent *relayent; |
295 | 728 uid_t uid; |
426 | 729 struct strlist stl; |
458 | 730 unsigned short smtpport = 25; |
491 | 731 struct sigaction sigact; |
208
688011dbc4b7
Add a macro to make sure mlmmj binaries are invoked with full path
mmj
parents:
191
diff
changeset
|
732 |
688011dbc4b7
Add a macro to make sure mlmmj binaries are invoked with full path
mmj
parents:
191
diff
changeset
|
733 CHECKFULLPATH(argv[0]); |
0 | 734 |
735 log_set_name(argv[0]); | |
736 | |
124
4c8cc076c784
Use the nice new mydirname and fix a bug with the archive variable.
mmj
parents:
117
diff
changeset
|
737 bindir = mydirname(argv[0]); |
4c8cc076c784
Use the nice new mydirname and fix a bug with the archive variable.
mmj
parents:
117
diff
changeset
|
738 mlmmjbounce = concatstr(2, bindir, "/mlmmj-bounce"); |
245 | 739 myfree(bindir); |
112
eb5ec53ecbc7
Make mlmmj-send capable of handling a bounce from the relayhost and invoke
mmj
parents:
106
diff
changeset
|
740 |
489 | 741 /* install signal handler for SIGTERM */ |
491 | 742 sigact.sa_handler = catch_sig_term; |
493 | 743 sigemptyset(&sigact.sa_mask); |
491 | 744 sigact.sa_flags = 0; |
745 if(sigaction(SIGTERM, &sigact, NULL) < 0) | |
489 | 746 log_error(LOG_ARGS, "Could not install SIGTERM handler!"); |
747 | |
727
4575d3181ca1
Added notmetoo feature where posts are not mirrored to their senders.
Ben Schmidt
parents:
677
diff
changeset
|
748 while ((opt = getopt(argc, argv, "aVDhm:l:L:R:F:T:r:s:o:")) != -1){ |
0 | 749 switch(opt) { |
116 | 750 case 'a': |
751 archive = 0; | |
117
9a39dff171fa
added mydirname() and mybasename() which doesn't mess with their argument, and
mortenp
parents:
116
diff
changeset
|
752 break; |
0 | 753 case 'D': |
754 deletewhensent = 0; | |
755 break; | |
756 case 'F': | |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
757 bounceaddr = optarg; |
0 | 758 break; |
759 case 'h': | |
760 print_help(argv[0]); | |
761 break; | |
69 | 762 case 'l': |
763 listctrl = optarg; | |
764 break; | |
0 | 765 case 'L': |
766 listdir = optarg; | |
767 break; | |
768 case 'm': | |
769 mailfilename = optarg; | |
770 break; | |
727
4575d3181ca1
Added notmetoo feature where posts are not mirrored to their senders.
Ben Schmidt
parents:
677
diff
changeset
|
771 case 'o': |
4575d3181ca1
Added notmetoo feature where posts are not mirrored to their senders.
Ben Schmidt
parents:
677
diff
changeset
|
772 omit = optarg; |
4575d3181ca1
Added notmetoo feature where posts are not mirrored to their senders.
Ben Schmidt
parents:
677
diff
changeset
|
773 break; |
0 | 774 case 'r': |
775 relayhost = optarg; | |
776 break; | |
777 case 'R': | |
778 replyto = optarg; | |
779 break; | |
147
e53fe7b9022b
mlmmj-maintd now resends the ones that failed. Add listctrl switch to
mmj
parents:
146
diff
changeset
|
780 case 's': |
e53fe7b9022b
mlmmj-maintd now resends the ones that failed. Add listctrl switch to
mmj
parents:
146
diff
changeset
|
781 subfilename = optarg; |
e53fe7b9022b
mlmmj-maintd now resends the ones that failed. Add listctrl switch to
mmj
parents:
146
diff
changeset
|
782 break; |
0 | 783 case 'T': |
784 to_addr = optarg; | |
785 break; | |
786 case 'V': | |
787 print_version(argv[0]); | |
69 | 788 exit(EXIT_SUCCESS); |
0 | 789 } |
790 } | |
791 | |
69 | 792 if(mailfilename == NULL || (listdir == NULL && listctrl == NULL)) { |
793 fprintf(stderr, "You have to specify -m and -L or -l\n"); | |
0 | 794 fprintf(stderr, "%s -h for help\n", argv[0]); |
795 exit(EXIT_FAILURE); | |
796 } | |
69 | 797 |
295 | 798 /* Lets make sure no random user tries to send mail to the list */ |
799 if(listdir) { | |
800 if(stat(listdir, &st) == 0) { | |
801 uid = getuid(); | |
802 if(uid && uid != st.st_uid) { | |
803 log_error(LOG_ARGS, | |
804 "Have to invoke either as root " | |
805 "or as the user owning listdir"); | |
806 writen(STDERR_FILENO, | |
807 "Have to invoke either as root " | |
808 "or as the user owning listdir\n", 60); | |
809 exit(EXIT_FAILURE); | |
810 } | |
811 } else { | |
812 log_error(LOG_ARGS, "Could not stat %s", listdir); | |
813 exit(EXIT_FAILURE); | |
814 } | |
815 } | |
816 | |
69 | 817 if(!listctrl) |
245 | 818 listctrl = mystrdup("0"); |
69 | 819 |
820 | |
0 | 821 /* get the list address */ |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
822 if(listctrl[0] == '1' && (bounceaddr == NULL || to_addr == NULL)) { |
69 | 823 fprintf(stderr, "With -l 1 you need -F and -T\n"); |
824 exit(EXIT_FAILURE); | |
825 } | |
0 | 826 |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
827 if((listctrl[0] == '2' && (listdir == NULL || bounceaddr == NULL))) { |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
828 fprintf(stderr, "With -l 2 you need -L and -F\n"); |
69 | 829 exit(EXIT_FAILURE); |
830 } | |
831 | |
338 | 832 if((listctrl[0] == '7' && listdir == NULL)) { |
833 fprintf(stderr, "With -l 7 you need -L\n"); | |
834 exit(EXIT_FAILURE); | |
835 } | |
836 | |
426 | 837 verp = ctrlvalue(listdir, "verp"); |
838 chomp(verp); | |
449 | 839 if(verp == NULL) |
840 if(statctrl(listdir, "verp") == 1) | |
841 verp = mystrdup(""); | |
338 | 842 |
465 | 843 maxverprecipsstr = ctrlvalue(listdir, "maxverprecips"); |
844 if(verp && maxverprecipsstr) { | |
845 maxverprecips = atol(maxverprecipsstr); | |
846 myfree(maxverprecipsstr); | |
847 } | |
848 | |
849 if(maxverprecips <= 0) | |
850 maxverprecips = MAXVERPRECIPS; | |
851 | |
852 stl.strs = NULL; | |
853 stl.count = 0; | |
854 | |
264
d3ade2c1f058
Make mlmmj-send capable of handling bouncing bounce probes to a local user on
mmj
parents:
262
diff
changeset
|
855 switch(listctrl[0]) { |
d3ade2c1f058
Make mlmmj-send capable of handling bouncing bounce probes to a local user on
mmj
parents:
262
diff
changeset
|
856 case '1': |
d3ade2c1f058
Make mlmmj-send capable of handling bouncing bounce probes to a local user on
mmj
parents:
262
diff
changeset
|
857 case '2': |
d3ade2c1f058
Make mlmmj-send capable of handling bouncing bounce probes to a local user on
mmj
parents:
262
diff
changeset
|
858 case '3': |
d3ade2c1f058
Make mlmmj-send capable of handling bouncing bounce probes to a local user on
mmj
parents:
262
diff
changeset
|
859 case '4': |
d3ade2c1f058
Make mlmmj-send capable of handling bouncing bounce probes to a local user on
mmj
parents:
262
diff
changeset
|
860 case '5': |
298 | 861 case '6': |
338 | 862 case '7': |
264
d3ade2c1f058
Make mlmmj-send capable of handling bouncing bounce probes to a local user on
mmj
parents:
262
diff
changeset
|
863 archive = 0; |
d3ade2c1f058
Make mlmmj-send capable of handling bouncing bounce probes to a local user on
mmj
parents:
262
diff
changeset
|
864 default: |
d3ade2c1f058
Make mlmmj-send capable of handling bouncing bounce probes to a local user on
mmj
parents:
262
diff
changeset
|
865 break; |
d3ade2c1f058
Make mlmmj-send capable of handling bouncing bounce probes to a local user on
mmj
parents:
262
diff
changeset
|
866 } |
124
4c8cc076c784
Use the nice new mydirname and fix a bug with the archive variable.
mmj
parents:
117
diff
changeset
|
867 |
264
d3ade2c1f058
Make mlmmj-send capable of handling bouncing bounce probes to a local user on
mmj
parents:
262
diff
changeset
|
868 if(listdir && listctrl[0] != '5') |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
869 listaddr = getlistaddr(listdir); |
0 | 870 |
871 /* initialize file with mail to send */ | |
872 | |
401
c60351e368bd
Grab the lock right after we start sending, and not release before
mmj
parents:
383
diff
changeset
|
873 if((mailfd = open(mailfilename, O_RDWR)) < 0) { |
39 | 874 log_error(LOG_ARGS, "Could not open '%s'", mailfilename); |
0 | 875 exit(EXIT_FAILURE); |
876 } | |
877 | |
401
c60351e368bd
Grab the lock right after we start sending, and not release before
mmj
parents:
383
diff
changeset
|
878 if(myexcllock(mailfd) < 0) { |
c60351e368bd
Grab the lock right after we start sending, and not release before
mmj
parents:
383
diff
changeset
|
879 log_error(LOG_ARGS, "Could not lock '%s'." |
c60351e368bd
Grab the lock right after we start sending, and not release before
mmj
parents:
383
diff
changeset
|
880 "Mail not sent!", mailfilename); |
c60351e368bd
Grab the lock right after we start sending, and not release before
mmj
parents:
383
diff
changeset
|
881 exit(EXIT_FAILURE); |
c60351e368bd
Grab the lock right after we start sending, and not release before
mmj
parents:
383
diff
changeset
|
882 } |
c60351e368bd
Grab the lock right after we start sending, and not release before
mmj
parents:
383
diff
changeset
|
883 |
174
8a565328fa73
Instead of reading 1 line at a time in mlmmj-send everytime we send the
mmj
parents:
171
diff
changeset
|
884 if(fstat(mailfd, &st) < 0) { |
8a565328fa73
Instead of reading 1 line at a time in mlmmj-send everytime we send the
mmj
parents:
171
diff
changeset
|
885 log_error(LOG_ARGS, "Could not stat mailfd"); |
8a565328fa73
Instead of reading 1 line at a time in mlmmj-send everytime we send the
mmj
parents:
171
diff
changeset
|
886 exit(EXIT_FAILURE); |
8a565328fa73
Instead of reading 1 line at a time in mlmmj-send everytime we send the
mmj
parents:
171
diff
changeset
|
887 } |
8a565328fa73
Instead of reading 1 line at a time in mlmmj-send everytime we send the
mmj
parents:
171
diff
changeset
|
888 |
268
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
889 memmailsizestr = ctrlvalue(listdir, "memorymailsize"); |
343
6d1f589dee87
This is post crash commit of working copy mmj. Will test compile etc.
mmj
parents:
338
diff
changeset
|
890 ctrlarchive = statctrl(listdir, "noarchive"); |
268
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
891 if(memmailsizestr) { |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
892 memmailsize = strtol(memmailsizestr, NULL, 10); |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
893 myfree(memmailsizestr); |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
894 } |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
895 |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
896 if(memmailsize == 0) |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
897 memmailsize = MEMORYMAILSIZE; |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
898 |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
899 if(st.st_size > memmailsize) { |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
900 prepmailinmem = 0; |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
901 errno = 0; |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
902 log_error(LOG_ARGS, "Not preparing in memory. " |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
903 "Mail is %ld bytes", (long)st.st_size); |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
904 } else |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
905 prepmailinmem = 1; |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
906 |
174
8a565328fa73
Instead of reading 1 line at a time in mlmmj-send everytime we send the
mmj
parents:
171
diff
changeset
|
907 mailmap = mmap(0, st.st_size, PROT_READ, MAP_SHARED, mailfd, 0); |
176
186c65c5f81d
Use MAP_FAILED to indicate failed mmap rather than (void \*)-1
mmj
parents:
174
diff
changeset
|
908 if(mailmap == MAP_FAILED) { |
174
8a565328fa73
Instead of reading 1 line at a time in mlmmj-send everytime we send the
mmj
parents:
171
diff
changeset
|
909 log_error(LOG_ARGS, "Could not mmap mailfd"); |
8a565328fa73
Instead of reading 1 line at a time in mlmmj-send everytime we send the
mmj
parents:
171
diff
changeset
|
910 exit(EXIT_FAILURE); |
8a565328fa73
Instead of reading 1 line at a time in mlmmj-send everytime we send the
mmj
parents:
171
diff
changeset
|
911 } |
8a565328fa73
Instead of reading 1 line at a time in mlmmj-send everytime we send the
mmj
parents:
171
diff
changeset
|
912 |
268
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
913 if(prepmailinmem) { |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
914 hdrs = get_preppedhdrs_from_map(mailmap, &hdrslen); |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
915 if(hdrs == NULL) { |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
916 log_error(LOG_ARGS, "Could not prepare headers"); |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
917 exit(EXIT_FAILURE); |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
918 } |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
919 body = get_prepped_mailbody_from_map(mailmap, st.st_size, |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
920 &bodylen); |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
921 if(body == NULL) { |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
922 log_error(LOG_ARGS, "Could not prepare mailbody"); |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
923 myfree(hdrs); |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
924 exit(EXIT_FAILURE); |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
925 } |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
926 } |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
927 |
520 | 928 if(listdir) |
929 listdelim = getlistdelim(listdir); | |
930 | |
69 | 931 switch(listctrl[0]) { |
932 case '1': /* A single mail is to be sent, do nothing */ | |
264
d3ade2c1f058
Make mlmmj-send capable of handling bouncing bounce probes to a local user on
mmj
parents:
262
diff
changeset
|
933 case '5': |
69 | 934 break; |
935 case '2': /* Moderators */ | |
184 | 936 subfilename = concatstr(2, listdir, "/control/moderators"); |
171 | 937 if((subfd = open(subfilename, O_RDONLY)) < 0) { |
69 | 938 log_error(LOG_ARGS, "Could not open '%s':", |
939 subfilename); | |
268
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
940 myfree(hdrs); |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
941 myfree(body); |
245 | 942 myfree(subfilename); |
520 | 943 myfree(listdelim); |
69 | 944 /* No moderators is no error. Could be the sysadmin |
945 * likes to do it manually. | |
946 */ | |
947 exit(EXIT_SUCCESS); | |
948 } | |
949 break; | |
228
fda21d560980
Make it possible to specify several owner emailaddresses, not just one
mmj
parents:
225
diff
changeset
|
950 case '3': |
545 | 951 addtohdr = statctrl(listdir, "addtohdr"); |
228
fda21d560980
Make it possible to specify several owner emailaddresses, not just one
mmj
parents:
225
diff
changeset
|
952 case '4': /* sending mails to subfile */ |
171 | 953 if((subfd = open(subfilename, O_RDONLY)) < 0) { |
147
e53fe7b9022b
mlmmj-maintd now resends the ones that failed. Add listctrl switch to
mmj
parents:
146
diff
changeset
|
954 log_error(LOG_ARGS, "Could not open '%s':", |
e53fe7b9022b
mlmmj-maintd now resends the ones that failed. Add listctrl switch to
mmj
parents:
146
diff
changeset
|
955 subfilename); |
268
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
956 myfree(hdrs); |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
957 myfree(body); |
520 | 958 myfree(listdelim); |
147
e53fe7b9022b
mlmmj-maintd now resends the ones that failed. Add listctrl switch to
mmj
parents:
146
diff
changeset
|
959 exit(EXIT_FAILURE); |
e53fe7b9022b
mlmmj-maintd now resends the ones that failed. Add listctrl switch to
mmj
parents:
146
diff
changeset
|
960 } |
305 | 961 break; |
298 | 962 case '6': |
963 archive = 0; | |
964 deletewhensent = 0; | |
965 archivefilename = mystrdup(mailfilename); | |
520 | 966 bounceaddr = bounce_from_adr(to_addr, listaddr, listdelim, |
677
c8e85bb330ed
Added support for static bounce addresses (Thomas Jarosch)
mortenp
parents:
674
diff
changeset
|
967 archivefilename, listdir); |
298 | 968 break; |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
969 default: /* normal list mail -- now handled when forking */ |
545 | 970 addtohdr = statctrl(listdir, "addtohdr"); |
69 | 971 break; |
0 | 972 } |
973 | |
974 /* initialize the archive filename */ | |
116 | 975 if(archive) { |
72
42d75f6f0a3d
changed incindexfile() - removed incflag, changed error return to be 0, and it now saves last used index in the file
mortenp
parents:
71
diff
changeset
|
976 mindex = incindexfile((const char *)listdir); |
0 | 977 len = strlen(listdir) + 9 + 20; |
245 | 978 archivefilename = mymalloc(len); |
67
b6828d24be7e
This is new function to quickly stat a control of the list. Example:
mmj
parents:
50
diff
changeset
|
979 snprintf(archivefilename, len, "%s/archive/%d", listdir, |
b6828d24be7e
This is new function to quickly stat a control of the list. Example:
mmj
parents:
50
diff
changeset
|
980 mindex); |
0 | 981 } |
982 | |
426 | 983 itoa(mindex, strindex); |
984 | |
291 | 985 if(!relayhost) { |
986 relayhost = ctrlvalue(listdir, "relayhost"); | |
987 chomp(relayhost); | |
988 } | |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
989 if(!relayhost) |
291 | 990 strncpy(relay, RELAYHOST, sizeof(relay)); |
991 else { | |
992 relayent = gethostbyname(relayhost); | |
993 if(relayent == NULL) { | |
994 strncpy(relay, RELAYHOST, sizeof(relay)); | |
995 } else { | |
996 if(inet_ntop(relayent->h_addrtype, | |
997 relayent->h_addr_list[0], | |
998 relay, sizeof(relay)) == NULL) | |
999 strncpy(relay, RELAYHOST, sizeof(relay)); | |
1000 } | |
1001 } | |
458 | 1002 strport = ctrlvalue(listdir, "smtpport"); |
1003 if(strport) | |
1004 smtpport = (unsigned short)atol(strport); | |
0 | 1005 |
69 | 1006 switch(listctrl[0]) { |
1007 case '1': /* A single mail is to be sent */ | |
298 | 1008 case '6': |
458 | 1009 initsmtp(&sockfd, relay, smtpport); |
776
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1010 if(send_mail(sockfd, bounceaddr, to_addr, replyto, |
268
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
1011 mailmap, st.st_size, listdir, NULL, |
776
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1012 hdrs, hdrslen, body, bodylen)) { |
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1013 close(sockfd); |
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1014 sockfd = -1; |
103
bf4390ecc30b
Also dump MAIL FROM:, RCPT TO: and Reply To: variables in the case of an
mmj
parents:
102
diff
changeset
|
1015 /* error, so keep it in the queue */ |
95 | 1016 deletewhensent = 0; |
509 | 1017 /* dump data we want when resending first check |
1018 * if it already exists. In that case continue */ | |
103
bf4390ecc30b
Also dump MAIL FROM:, RCPT TO: and Reply To: variables in the case of an
mmj
parents:
102
diff
changeset
|
1019 tmpstr = concatstr(2, mailfilename, ".mailfrom"); |
509 | 1020 if(stat(tmpstr, &st) == 0) { |
1021 myfree(tmpstr); | |
1022 break; | |
1023 } | |
171 | 1024 tmpfd = open(tmpstr, O_WRONLY|O_CREAT|O_TRUNC, |
1025 S_IRUSR|S_IWUSR); | |
245 | 1026 myfree(tmpstr); |
171 | 1027 if(tmpfd >= 0) { |
262
846d91ae6ebe
Don't litter the queue directory when rejecting posts for one reason or the
mmj
parents:
245
diff
changeset
|
1028 writen(tmpfd, bounceaddr, strlen(bounceaddr)); |
171 | 1029 fsync(tmpfd); |
1030 } | |
1031 close(tmpfd); | |
106 | 1032 tmpstr = concatstr(2, mailfilename, ".reciptto"); |
509 | 1033 if(stat(tmpstr, &st) == 0) { |
1034 myfree(tmpstr); | |
1035 break; | |
1036 } | |
171 | 1037 tmpfd = open(tmpstr, O_WRONLY|O_CREAT|O_TRUNC, |
1038 S_IRUSR|S_IWUSR); | |
245 | 1039 myfree(tmpstr); |
171 | 1040 if(tmpfd >= 0) { |
262
846d91ae6ebe
Don't litter the queue directory when rejecting posts for one reason or the
mmj
parents:
245
diff
changeset
|
1041 writen(tmpfd, to_addr, strlen(to_addr)); |
171 | 1042 fsync(tmpfd); |
1043 } | |
1044 close(tmpfd); | |
103
bf4390ecc30b
Also dump MAIL FROM:, RCPT TO: and Reply To: variables in the case of an
mmj
parents:
102
diff
changeset
|
1045 if(replyto) { |
bf4390ecc30b
Also dump MAIL FROM:, RCPT TO: and Reply To: variables in the case of an
mmj
parents:
102
diff
changeset
|
1046 tmpstr = concatstr(2, mailfilename, |
106 | 1047 ".reply-to"); |
509 | 1048 if(stat(tmpstr, &st) == 0) { |
1049 myfree(tmpstr); | |
1050 break; | |
1051 } | |
171 | 1052 tmpfd = open(tmpstr, O_WRONLY|O_CREAT|O_TRUNC, |
1053 S_IRUSR|S_IWUSR); | |
245 | 1054 myfree(tmpstr); |
171 | 1055 if(tmpfd >= 0) { |
1056 writen(tmpfd, replyto, | |
1057 strlen(replyto)); | |
1058 fsync(tmpfd); | |
1059 } | |
1060 close(tmpfd); | |
103
bf4390ecc30b
Also dump MAIL FROM:, RCPT TO: and Reply To: variables in the case of an
mmj
parents:
102
diff
changeset
|
1061 } |
776
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1062 } else { |
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1063 endsmtp(&sockfd); |
103
bf4390ecc30b
Also dump MAIL FROM:, RCPT TO: and Reply To: variables in the case of an
mmj
parents:
102
diff
changeset
|
1064 } |
69 | 1065 break; |
1066 case '2': /* Moderators */ | |
458 | 1067 initsmtp(&sockfd, relay, smtpport); |
426 | 1068 if(send_mail_many_fd(sockfd, bounceaddr, NULL, mailmap, |
520 | 1069 st.st_size, subfd, NULL, NULL, NULL, |
1070 listdir, NULL, hdrs, hdrslen, | |
776
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1071 body, bodylen)) { |
154 | 1072 close(sockfd); |
776
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1073 sockfd = -1; |
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1074 } else { |
154 | 1075 endsmtp(&sockfd); |
776
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1076 } |
69 | 1077 break; |
147
e53fe7b9022b
mlmmj-maintd now resends the ones that failed. Add listctrl switch to
mmj
parents:
146
diff
changeset
|
1078 case '3': /* resending earlier failed mails */ |
458 | 1079 initsmtp(&sockfd, relay, smtpport); |
426 | 1080 if(send_mail_many_fd(sockfd, NULL, NULL, mailmap, st.st_size, |
520 | 1081 subfd, listaddr, listdelim, mailfilename, |
1082 listdir, mlmmjbounce, hdrs, hdrslen, | |
776
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1083 body, bodylen)) { |
154 | 1084 close(sockfd); |
776
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1085 sockfd = -1; |
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1086 } else { |
154 | 1087 endsmtp(&sockfd); |
776
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1088 } |
147
e53fe7b9022b
mlmmj-maintd now resends the ones that failed. Add listctrl switch to
mmj
parents:
146
diff
changeset
|
1089 unlink(subfilename); |
e53fe7b9022b
mlmmj-maintd now resends the ones that failed. Add listctrl switch to
mmj
parents:
146
diff
changeset
|
1090 break; |
228
fda21d560980
Make it possible to specify several owner emailaddresses, not just one
mmj
parents:
225
diff
changeset
|
1091 case '4': /* send mails to owner */ |
458 | 1092 initsmtp(&sockfd, relay, smtpport); |
426 | 1093 if(send_mail_many_fd(sockfd, bounceaddr, NULL, mailmap, |
520 | 1094 st.st_size, subfd, listaddr, listdelim, |
1095 mailfilename, listdir, mlmmjbounce, | |
776
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1096 hdrs, hdrslen, body, bodylen)) { |
228
fda21d560980
Make it possible to specify several owner emailaddresses, not just one
mmj
parents:
225
diff
changeset
|
1097 close(sockfd); |
776
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1098 sockfd = -1; |
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1099 } else { |
228
fda21d560980
Make it possible to specify several owner emailaddresses, not just one
mmj
parents:
225
diff
changeset
|
1100 endsmtp(&sockfd); |
776
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1101 } |
228
fda21d560980
Make it possible to specify several owner emailaddresses, not just one
mmj
parents:
225
diff
changeset
|
1102 break; |
264
d3ade2c1f058
Make mlmmj-send capable of handling bouncing bounce probes to a local user on
mmj
parents:
262
diff
changeset
|
1103 case '5': /* bounceprobe - handle relayhost local users bouncing*/ |
458 | 1104 initsmtp(&sockfd, relay, smtpport); |
776
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1105 if(send_mail(sockfd, bounceaddr, to_addr, replyto, |
268
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
1106 mailmap, st.st_size, listdir, NULL, |
776
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1107 hdrs, hdrslen, body, bodylen)) { |
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1108 close(sockfd); |
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1109 sockfd = -1; |
264
d3ade2c1f058
Make mlmmj-send capable of handling bouncing bounce probes to a local user on
mmj
parents:
262
diff
changeset
|
1110 /* error, so remove the probefile */ |
d3ade2c1f058
Make mlmmj-send capable of handling bouncing bounce probes to a local user on
mmj
parents:
262
diff
changeset
|
1111 tmpstr = mystrdup(to_addr); |
d3ade2c1f058
Make mlmmj-send capable of handling bouncing bounce probes to a local user on
mmj
parents:
262
diff
changeset
|
1112 a = strchr(tmpstr, '@'); |
674 | 1113 MY_ASSERT(a); |
264
d3ade2c1f058
Make mlmmj-send capable of handling bouncing bounce probes to a local user on
mmj
parents:
262
diff
changeset
|
1114 *a = '='; |
d3ade2c1f058
Make mlmmj-send capable of handling bouncing bounce probes to a local user on
mmj
parents:
262
diff
changeset
|
1115 probefile = concatstr(4, listdir, "/bounce/", tmpstr, |
d3ade2c1f058
Make mlmmj-send capable of handling bouncing bounce probes to a local user on
mmj
parents:
262
diff
changeset
|
1116 "-probe"); |
d3ade2c1f058
Make mlmmj-send capable of handling bouncing bounce probes to a local user on
mmj
parents:
262
diff
changeset
|
1117 unlink(probefile); |
d3ade2c1f058
Make mlmmj-send capable of handling bouncing bounce probes to a local user on
mmj
parents:
262
diff
changeset
|
1118 myfree(probefile); |
d3ade2c1f058
Make mlmmj-send capable of handling bouncing bounce probes to a local user on
mmj
parents:
262
diff
changeset
|
1119 myfree(tmpstr); |
776
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1120 } else { |
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1121 endsmtp(&sockfd); |
264
d3ade2c1f058
Make mlmmj-send capable of handling bouncing bounce probes to a local user on
mmj
parents:
262
diff
changeset
|
1122 } |
d3ade2c1f058
Make mlmmj-send capable of handling bouncing bounce probes to a local user on
mmj
parents:
262
diff
changeset
|
1123 break; |
338 | 1124 case '7': |
1125 digest = 1; | |
383
7de4e23f2e8e
Add a To: header with the recipient's address when sending digests
mortenp
parents:
370
diff
changeset
|
1126 addtohdr = 1; |
370 | 1127 archivefilename = "digest"; |
338 | 1128 /* fall through */ |
69 | 1129 default: /* normal list mail */ |
338 | 1130 if (!digest) { |
1131 subddirname = concatstr(2, listdir, "/subscribers.d/"); | |
1132 } else { | |
1133 subddirname = concatstr(2, listdir, "/digesters.d/"); | |
1134 } | |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
1135 if((subddir = opendir(subddirname)) == NULL) { |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
1136 log_error(LOG_ARGS, "Could not opendir(%s)", |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
1137 subddirname); |
520 | 1138 myfree(listdelim); |
245 | 1139 myfree(subddirname); |
268
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
1140 myfree(hdrs); |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
1141 myfree(body); |
117
9a39dff171fa
added mydirname() and mybasename() which doesn't mess with their argument, and
mortenp
parents:
116
diff
changeset
|
1142 exit(EXIT_FAILURE); |
0 | 1143 } |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
1144 |
520 | 1145 listdelim = getlistdelim(listdir); |
426 | 1146 listname = genlistname(listaddr); |
1147 listfqdn = genlistfqdn(listaddr); | |
520 | 1148 verpfrom = concatstr(6, listname, listdelim, "bounces-", |
1149 strindex, "@", listfqdn); | |
426 | 1150 myfree(listname); |
1151 myfree(listfqdn); | |
1152 | |
445 | 1153 if(digest) |
1154 verp = NULL; | |
1155 | |
426 | 1156 if(verp && (strcmp(verp, "postfix") == 0)) { |
1157 myfree(verp); | |
1158 verp = mystrdup("XVERP=-="); | |
1159 } | |
1160 | |
1161 if(addtohdr && verp) { | |
445 | 1162 log_error(LOG_ARGS, "Cannot use VERP and add " |
1163 "To: header. Not sending with " | |
1164 "VERP."); | |
426 | 1165 verp = NULL; |
1166 } | |
427
df8e1e2f0ff6
Don't send the rest of the batch inside the while() loop
mmj
parents:
426
diff
changeset
|
1167 |
426 | 1168 if(verp) { |
458 | 1169 initsmtp(&sockfd, relay, smtpport); |
426 | 1170 if(write_mail_from(sockfd, verpfrom, verp)) { |
1171 log_error(LOG_ARGS, | |
1172 "Could not write MAIL FROM\n"); | |
1173 verp = NULL; | |
1174 } else { | |
1175 reply = checkwait_smtpreply(sockfd, MLMMJ_FROM); | |
1176 if(reply) { | |
1177 log_error(LOG_ARGS, | |
1178 "Mailserver did not " | |
1179 "accept verp mail from. " | |
1180 "Not sending with VERP."); | |
1181 myfree(reply); | |
1182 verp = NULL; | |
1183 } | |
1184 } | |
776
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1185 /* We can't be in SMTP DATA state or anything like |
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1186 * that, so should be able to safely QUIT. */ |
426 | 1187 endsmtp(&sockfd); |
1188 } | |
1189 | |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
1190 while((dp = readdir(subddir)) != NULL) { |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
1191 if(!strcmp(dp->d_name, ".")) |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
1192 continue; |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
1193 if(!strcmp(dp->d_name, "..")) |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
1194 continue; |
338 | 1195 subfilename = concatstr(2, subddirname, dp->d_name); |
171 | 1196 if((subfd = open(subfilename, O_RDONLY)) < 0) { |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
1197 log_error(LOG_ARGS, "Could not open '%s'", |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
1198 subfilename); |
245 | 1199 myfree(subfilename); |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
1200 continue; |
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
1201 } |
426 | 1202 do { |
774
62f9b36df5a5
Avoid checking addresses multiple times for notmetoo
Ben Schmidt
parents:
773
diff
changeset
|
1203 i = stl.count; |
426 | 1204 res = getaddrsfromfd(&stl, subfd, |
1205 maxverprecips); | |
774
62f9b36df5a5
Avoid checking addresses multiple times for notmetoo
Ben Schmidt
parents:
773
diff
changeset
|
1206 if(omit != NULL) { |
62f9b36df5a5
Avoid checking addresses multiple times for notmetoo
Ben Schmidt
parents:
773
diff
changeset
|
1207 while(i < stl.count) { |
727
4575d3181ca1
Added notmetoo feature where posts are not mirrored to their senders.
Ben Schmidt
parents:
677
diff
changeset
|
1208 if(strcmp(stl.strs[i], omit) |
4575d3181ca1
Added notmetoo feature where posts are not mirrored to their senders.
Ben Schmidt
parents:
677
diff
changeset
|
1209 == 0) { |
4575d3181ca1
Added notmetoo feature where posts are not mirrored to their senders.
Ben Schmidt
parents:
677
diff
changeset
|
1210 myfree(stl.strs[i]); |
4575d3181ca1
Added notmetoo feature where posts are not mirrored to their senders.
Ben Schmidt
parents:
677
diff
changeset
|
1211 stl.count--; |
4575d3181ca1
Added notmetoo feature where posts are not mirrored to their senders.
Ben Schmidt
parents:
677
diff
changeset
|
1212 while (i < stl.count) { |
4575d3181ca1
Added notmetoo feature where posts are not mirrored to their senders.
Ben Schmidt
parents:
677
diff
changeset
|
1213 stl.strs[i] = |
4575d3181ca1
Added notmetoo feature where posts are not mirrored to their senders.
Ben Schmidt
parents:
677
diff
changeset
|
1214 stl.strs[i+1]; |
4575d3181ca1
Added notmetoo feature where posts are not mirrored to their senders.
Ben Schmidt
parents:
677
diff
changeset
|
1215 i++; |
4575d3181ca1
Added notmetoo feature where posts are not mirrored to their senders.
Ben Schmidt
parents:
677
diff
changeset
|
1216 } |
4575d3181ca1
Added notmetoo feature where posts are not mirrored to their senders.
Ben Schmidt
parents:
677
diff
changeset
|
1217 stl.strs[stl.count] = NULL; |
4575d3181ca1
Added notmetoo feature where posts are not mirrored to their senders.
Ben Schmidt
parents:
677
diff
changeset
|
1218 break; |
4575d3181ca1
Added notmetoo feature where posts are not mirrored to their senders.
Ben Schmidt
parents:
677
diff
changeset
|
1219 } |
774
62f9b36df5a5
Avoid checking addresses multiple times for notmetoo
Ben Schmidt
parents:
773
diff
changeset
|
1220 i++; |
727
4575d3181ca1
Added notmetoo feature where posts are not mirrored to their senders.
Ben Schmidt
parents:
677
diff
changeset
|
1221 } |
4575d3181ca1
Added notmetoo feature where posts are not mirrored to their senders.
Ben Schmidt
parents:
677
diff
changeset
|
1222 } |
426 | 1223 if(stl.count == maxverprecips) { |
458 | 1224 initsmtp(&sockfd, relay, smtpport); |
426 | 1225 if(verp) { |
1226 sendres = send_mail_verp( | |
1227 sockfd, &stl, | |
1228 mailmap, | |
1229 st.st_size, | |
1230 verpfrom, | |
1231 listdir, hdrs, | |
1232 hdrslen, body, | |
1233 bodylen, verp); | |
1234 if(sendres) | |
1235 requeuemail(listdir, | |
1236 strindex, | |
1237 &stl, 0); | |
1238 } else { | |
1239 sendres = send_mail_many_list( | |
1240 sockfd, NULL, | |
1241 NULL, mailmap, | |
1242 st.st_size, | |
1243 &stl, | |
1244 listaddr, | |
520 | 1245 listdelim, |
426 | 1246 archivefilename, |
1247 listdir, | |
1248 mlmmjbounce, | |
1249 hdrs, hdrslen, | |
1250 body, bodylen); | |
1251 } | |
776
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1252 if (sendres) { |
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1253 close(sockfd); |
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1254 sockfd = -1; |
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1255 } else { |
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1256 endsmtp(&sockfd); |
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1257 } |
426 | 1258 for(i = 0; i < stl.count; i++) |
1259 myfree(stl.strs[i]); | |
1260 stl.count = 0; | |
1261 } | |
1262 } while(res > 0); | |
1263 myfree(subfilename); | |
1264 close(subfd); | |
1265 | |
427
df8e1e2f0ff6
Don't send the rest of the batch inside the while() loop
mmj
parents:
426
diff
changeset
|
1266 } |
df8e1e2f0ff6
Don't send the rest of the batch inside the while() loop
mmj
parents:
426
diff
changeset
|
1267 if(stl.count) { |
458 | 1268 initsmtp(&sockfd, relay, smtpport); |
427
df8e1e2f0ff6
Don't send the rest of the batch inside the while() loop
mmj
parents:
426
diff
changeset
|
1269 if(verp) { |
df8e1e2f0ff6
Don't send the rest of the batch inside the while() loop
mmj
parents:
426
diff
changeset
|
1270 sendres = send_mail_verp(sockfd, &stl, mailmap, |
df8e1e2f0ff6
Don't send the rest of the batch inside the while() loop
mmj
parents:
426
diff
changeset
|
1271 st.st_size, verpfrom, listdir, |
df8e1e2f0ff6
Don't send the rest of the batch inside the while() loop
mmj
parents:
426
diff
changeset
|
1272 hdrs, hdrslen, body, bodylen, |
df8e1e2f0ff6
Don't send the rest of the batch inside the while() loop
mmj
parents:
426
diff
changeset
|
1273 verp); |
df8e1e2f0ff6
Don't send the rest of the batch inside the while() loop
mmj
parents:
426
diff
changeset
|
1274 if(sendres) |
df8e1e2f0ff6
Don't send the rest of the batch inside the while() loop
mmj
parents:
426
diff
changeset
|
1275 requeuemail(listdir, strindex, &stl, |
df8e1e2f0ff6
Don't send the rest of the batch inside the while() loop
mmj
parents:
426
diff
changeset
|
1276 0); |
155
f844a6213c62
"Resolving" the conflict by committing my version anyway (it has a nice comment). That guy is fast.
mortenp
parents:
154
diff
changeset
|
1277 } else { |
427
df8e1e2f0ff6
Don't send the rest of the batch inside the while() loop
mmj
parents:
426
diff
changeset
|
1278 sendres = send_mail_many_list(sockfd, NULL, |
df8e1e2f0ff6
Don't send the rest of the batch inside the while() loop
mmj
parents:
426
diff
changeset
|
1279 NULL, mailmap, st.st_size, |
520 | 1280 &stl, listaddr, listdelim, |
427
df8e1e2f0ff6
Don't send the rest of the batch inside the while() loop
mmj
parents:
426
diff
changeset
|
1281 archivefilename, listdir, |
df8e1e2f0ff6
Don't send the rest of the batch inside the while() loop
mmj
parents:
426
diff
changeset
|
1282 mlmmjbounce, hdrs, hdrslen, |
df8e1e2f0ff6
Don't send the rest of the batch inside the while() loop
mmj
parents:
426
diff
changeset
|
1283 body, bodylen); |
155
f844a6213c62
"Resolving" the conflict by committing my version anyway (it has a nice comment). That guy is fast.
mortenp
parents:
154
diff
changeset
|
1284 } |
776
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1285 if (sendres) { |
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1286 close(sockfd); |
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1287 sockfd = -1; |
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1288 } else { |
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1289 endsmtp(&sockfd); |
de31a9e15c5b
Improved and more consistent closing of SMTP sessions
Ben Schmidt
parents:
774
diff
changeset
|
1290 } |
427
df8e1e2f0ff6
Don't send the rest of the batch inside the while() loop
mmj
parents:
426
diff
changeset
|
1291 for(i = 0; i < stl.count; i++) |
df8e1e2f0ff6
Don't send the rest of the batch inside the while() loop
mmj
parents:
426
diff
changeset
|
1292 myfree(stl.strs[i]); |
df8e1e2f0ff6
Don't send the rest of the batch inside the while() loop
mmj
parents:
426
diff
changeset
|
1293 stl.count = 0; |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
1294 } |
427
df8e1e2f0ff6
Don't send the rest of the batch inside the while() loop
mmj
parents:
426
diff
changeset
|
1295 myfree(stl.strs); |
df8e1e2f0ff6
Don't send the rest of the batch inside the while() loop
mmj
parents:
426
diff
changeset
|
1296 myfree(verpfrom); |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
1297 closedir(subddir); |
338 | 1298 myfree(subddirname); |
69 | 1299 break; |
1300 } | |
77
66d950e9a550
mlmmj-send now forks multiple connections per subscriber.d/file
mmj
parents:
72
diff
changeset
|
1301 |
520 | 1302 myfree(listdelim); |
268
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
1303 myfree(hdrs); |
1dbadf407849
mlmmj-send now prepares headers and mail, and To: header feature added
mmj
parents:
267
diff
changeset
|
1304 myfree(body); |
370 | 1305 myfree(mlmmjbounce); |
174
8a565328fa73
Instead of reading 1 line at a time in mlmmj-send everytime we send the
mmj
parents:
171
diff
changeset
|
1306 munmap(mailmap, st.st_size); |
8a565328fa73
Instead of reading 1 line at a time in mlmmj-send everytime we send the
mmj
parents:
171
diff
changeset
|
1307 close(mailfd); |
426 | 1308 myfree(verp); |
401
c60351e368bd
Grab the lock right after we start sending, and not release before
mmj
parents:
383
diff
changeset
|
1309 |
116 | 1310 if(archive) { |
411
79355dd5ecc2
Make the envelope from match the new order (VERP prep) and also remove
mmj
parents:
401
diff
changeset
|
1311 if(!ctrlarchive) { |
522 | 1312 if(rename(mailfilename, archivefilename) < 0) { |
1313 log_error(LOG_ARGS, | |
1314 "Could not rename(%s,%s);", | |
1315 mailfilename, | |
1316 archivefilename); | |
1317 } | |
411
79355dd5ecc2
Make the envelope from match the new order (VERP prep) and also remove
mmj
parents:
401
diff
changeset
|
1318 } else { |
601 | 1319 len = strlen(listdir) + 9 + 20 + 9; |
1320 requeuefilename = mymalloc(len); | |
772
179d5a0ed686
Better logging when moving requeue mailfiles into place
Ben Schmidt
parents:
756
diff
changeset
|
1321 snprintf(requeuefilename, len, "%s/requeue/%d", |
179d5a0ed686
Better logging when moving requeue mailfiles into place
Ben Schmidt
parents:
756
diff
changeset
|
1322 listdir, mindex); |
179d5a0ed686
Better logging when moving requeue mailfiles into place
Ben Schmidt
parents:
756
diff
changeset
|
1323 if(stat(requeuefilename, &st) < 0) { |
179d5a0ed686
Better logging when moving requeue mailfiles into place
Ben Schmidt
parents:
756
diff
changeset
|
1324 /* Nothing was requeued and we don't keep |
179d5a0ed686
Better logging when moving requeue mailfiles into place
Ben Schmidt
parents:
756
diff
changeset
|
1325 * mail for a noarchive list. */ |
601 | 1326 unlink(mailfilename); |
772
179d5a0ed686
Better logging when moving requeue mailfiles into place
Ben Schmidt
parents:
756
diff
changeset
|
1327 } else { |
179d5a0ed686
Better logging when moving requeue mailfiles into place
Ben Schmidt
parents:
756
diff
changeset
|
1328 snprintf(requeuefilename, len, |
179d5a0ed686
Better logging when moving requeue mailfiles into place
Ben Schmidt
parents:
756
diff
changeset
|
1329 "%s/requeue/%d/mailfile", |
179d5a0ed686
Better logging when moving requeue mailfiles into place
Ben Schmidt
parents:
756
diff
changeset
|
1330 listdir, mindex); |
179d5a0ed686
Better logging when moving requeue mailfiles into place
Ben Schmidt
parents:
756
diff
changeset
|
1331 if (rename(mailfilename, requeuefilename) < 0) { |
179d5a0ed686
Better logging when moving requeue mailfiles into place
Ben Schmidt
parents:
756
diff
changeset
|
1332 log_error(LOG_ARGS, |
179d5a0ed686
Better logging when moving requeue mailfiles into place
Ben Schmidt
parents:
756
diff
changeset
|
1333 "Could not rename(%s,%s);", |
179d5a0ed686
Better logging when moving requeue mailfiles into place
Ben Schmidt
parents:
756
diff
changeset
|
1334 mailfilename, |
179d5a0ed686
Better logging when moving requeue mailfiles into place
Ben Schmidt
parents:
756
diff
changeset
|
1335 requeuefilename); |
179d5a0ed686
Better logging when moving requeue mailfiles into place
Ben Schmidt
parents:
756
diff
changeset
|
1336 } |
179d5a0ed686
Better logging when moving requeue mailfiles into place
Ben Schmidt
parents:
756
diff
changeset
|
1337 } |
601 | 1338 myfree(requeuefilename); |
411
79355dd5ecc2
Make the envelope from match the new order (VERP prep) and also remove
mmj
parents:
401
diff
changeset
|
1339 } |
245 | 1340 myfree(archivefilename); |
0 | 1341 } else if(deletewhensent) |
1342 unlink(mailfilename); | |
1343 | |
1344 return EXIT_SUCCESS; | |
1345 } |