bool send_single_mail(struct mail *mail, struct ml *ml, bool bounce);
void save_queue(const char *queuefilename, struct mail *mail);
bool requeuemail(int listfd, int index, strlist *addrs, const char *addr);
+char *bounce_from_adr(const char *recipient, const char *listadr, const char *listdelim, const char *mailfilename, int ctrlfd);
+char *get_bounce_from_adr(const char *recipient, struct ml *ml, const char *mailfilename, int index);
+int get_index_from_filename(const char *filename);
+
* IN THE SOFTWARE.
*/
+#include <sys/param.h>
+#include <sys/types.h>
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include <fcntl.h>
-#include <sys/types.h>
#include <ctype.h>
#include "xmalloc.h"
#include "prepstdreply.h"
#include "send_help.h"
#include "send_list.h"
+#include "send_mail.h"
#include "log_error.h"
#include "statctrl.h"
#include "mygetline.h"
" non-digits in index. Ignoring mail");
return -1;
}
- xasprintf(&archivefilename, "%s/archive/%s", ml->dir, param);
- if(access(archivefilename, R_OK) < 0) {
+ int index = strtoim(param, 0, INT_MAX, NULL);
+ xasprintf(&archivefilename, "archive/%d", index);
+ int fd = openat(ml->fd, archivefilename, O_RDONLY|O_CLOEXEC);
+ if (fd == -1) {
log_error(LOG_ARGS, "Unable to open archive file");
+ free(archivefilename);
return -1;
}
+ struct mail mail = { 0 };
+ mail.to = tll_front(*fromemails);
+ mail.from = get_bounce_from_adr(mail.to, ml, archivefilename, index);
+ mail.fp = fdopen(fd, "r");
log_oper(ml->fd, OPLOGFNAME, "%s got archive/%s",
- tll_front(*fromemails), archivefilename);
- exec_or_die(mlmmjsend, "-T", tll_front(*fromemails), "-L",
- ml->dir, "-l", "6", "-m", archivefilename, "-a", "-D",
- NULL);
+ tll_front(*fromemails), param);
+ if (!send_single_mail(&mail, ml, false))
+ return (-1);
break;
/* listname+list@domain.tld */
gotsigterm = 1;
}
-int
-get_index_from_filename(const char *filename)
-{
- char *myfilename, *indexstr;
- int ret;
- size_t len;
-
- myfilename = xstrdup(filename);
- len = strlen(myfilename);
- if (len > 9 && (strcmp(myfilename + len - 9, "/mailfile") == 0)) {
- myfilename[len - 9] = '\0';
- }
-
- indexstr = strrchr(myfilename, '/');
- if (indexstr) {
- indexstr++; /* skip the slash */
- } else {
- indexstr = myfilename;
- }
-
- ret = strtoim(indexstr, 0, INT_MAX, NULL);
- free(myfilename);
-
- return ret;
-}
-
-char *bounce_from_adr(const char *recipient, const char *listadr,
- const char *listdelim, const char *mailfilename,
- int ctrlfd)
-{
- char *bounceaddr, *myrecipient, *mylistadr;
- char *listdomain, *a = NULL, *mymailfilename;
- char *staticbounceaddr, *staticbounceaddr_localpart;
- char *staticbounceaddr_domain;
- int index;
-
- mymailfilename = xstrdup(mailfilename);
-
- index = get_index_from_filename(mymailfilename);
-
- myrecipient = xstrdup(recipient);
- a = strchr(myrecipient, '@');
- if (a)
- *a = '=';
-
- mylistadr = xstrdup(listadr);
- listdomain = strchr(mylistadr, '@');
- if (!listdomain) {
- free(mymailfilename);
- free(myrecipient);
- free(mylistadr);
- return NULL;
- }
- *listdomain++ = '\0';
-
- staticbounceaddr = ctrlvalue(ctrlfd, "staticbounceaddr");
- if (staticbounceaddr) {
- staticbounceaddr_localpart = genlistname(staticbounceaddr);
- staticbounceaddr_domain = genlistfqdn(staticbounceaddr);
- } else {
- staticbounceaddr_localpart = NULL;
- staticbounceaddr_domain = NULL;
- }
-
- if (staticbounceaddr) {
- xasprintf(&bounceaddr, "%s%s%s-bounces-%d-%s@%s",
- staticbounceaddr_localpart, listdelim, mylistadr,
- index, myrecipient, staticbounceaddr_domain);
-
- free(staticbounceaddr);
- free(staticbounceaddr_localpart);
- free(staticbounceaddr_domain);
- } else {
- xasprintf(&bounceaddr, "%s%sbounces-%d-%s@%s", mylistadr, listdelim,
- index, myrecipient, listdomain);
- }
-
- free(myrecipient);
- free(mylistadr);
- free(mymailfilename);
-
- return bounceaddr;
-}
-
int send_mail_verp(int sockfd, strlist *addrs, struct mail *mail,
const char *verpextra)
{
#include "tllist.h"
#include "xmalloc.h"
#include "ctrlvalue.h"
+#include "utils.h"
int
initsmtp(int *sockfd, const char *relayhost, unsigned short port, const char *heloname)
return (true);
}
+char *
+get_bounce_from_adr(const char *recipient, struct ml *ml,
+ const char *mailfilename, int index)
+{
+ char *bounceaddr, *myrecipient;
+ char *a = NULL, *mymailfilename;
+ char *staticbounceaddr, *staticbounceaddr_localpart;
+ char *staticbounceaddr_domain;
+
+ mymailfilename = xstrdup(mailfilename);
+
+ myrecipient = xstrdup(recipient);
+ a = strchr(myrecipient, '@');
+ if (a)
+ *a = '=';
+
+ staticbounceaddr = ctrlvalue(ml->ctrlfd, "staticbounceaddr");
+ if (staticbounceaddr) {
+ staticbounceaddr_localpart = genlistname(staticbounceaddr);
+ staticbounceaddr_domain = genlistfqdn(staticbounceaddr);
+ } else {
+ staticbounceaddr_localpart = NULL;
+ staticbounceaddr_domain = NULL;
+ }
+
+ if (staticbounceaddr) {
+ xasprintf(&bounceaddr, "%s%s%s-bounces-%d-%s@%s",
+ staticbounceaddr_localpart, ml->delim, ml->name,
+ index, myrecipient, staticbounceaddr_domain);
+
+ free(staticbounceaddr);
+ free(staticbounceaddr_localpart);
+ free(staticbounceaddr_domain);
+ } else {
+ xasprintf(&bounceaddr, "%s%sbounces-%d-%s@%s", ml->name,
+ ml->delim, index, myrecipient, ml->fqdn);
+ }
+
+ free(myrecipient);
+ free(mymailfilename);
+
+ return bounceaddr;
+}
+
+char *
+bounce_from_adr(const char *recipient, const char *listadr,
+ const char *listdelim, const char *mailfilename,
+ int ctrlfd)
+{
+ char *bounceaddr, *myrecipient, *mylistadr;
+ char *listdomain, *a = NULL, *mymailfilename;
+ char *staticbounceaddr, *staticbounceaddr_localpart;
+ char *staticbounceaddr_domain;
+ int index;
+
+ mymailfilename = xstrdup(mailfilename);
+
+ index = get_index_from_filename(mymailfilename);
+
+ myrecipient = xstrdup(recipient);
+ a = strchr(myrecipient, '@');
+ if (a)
+ *a = '=';
+
+ mylistadr = xstrdup(listadr);
+ listdomain = strchr(mylistadr, '@');
+ if (!listdomain) {
+ free(mymailfilename);
+ free(myrecipient);
+ free(mylistadr);
+ return NULL;
+ }
+ *listdomain++ = '\0';
+
+ staticbounceaddr = ctrlvalue(ctrlfd, "staticbounceaddr");
+ if (staticbounceaddr) {
+ staticbounceaddr_localpart = genlistname(staticbounceaddr);
+ staticbounceaddr_domain = genlistfqdn(staticbounceaddr);
+ } else {
+ staticbounceaddr_localpart = NULL;
+ staticbounceaddr_domain = NULL;
+ }
+
+ if (staticbounceaddr) {
+ xasprintf(&bounceaddr, "%s%s%s-bounces-%d-%s@%s",
+ staticbounceaddr_localpart, listdelim, mylistadr,
+ index, myrecipient, staticbounceaddr_domain);
+
+ free(staticbounceaddr);
+ free(staticbounceaddr_localpart);
+ free(staticbounceaddr_domain);
+ } else {
+ xasprintf(&bounceaddr, "%s%sbounces-%d-%s@%s", mylistadr, listdelim,
+ index, myrecipient, listdomain);
+ }
+
+ free(myrecipient);
+ free(mylistadr);
+ free(mymailfilename);
+
+ return bounceaddr;
+}
+
+int
+get_index_from_filename(const char *filename)
+{
+ char *myfilename, *indexstr;
+ int ret;
+ size_t len;
+
+ myfilename = xstrdup(filename);
+ len = strlen(myfilename);
+ if (len > 9 && (strcmp(myfilename + len - 9, "/mailfile") == 0)) {
+ myfilename[len - 9] = '\0';
+ }
+
+ indexstr = strrchr(myfilename, '/');
+ if (indexstr) {
+ indexstr++; /* skip the slash */
+ } else {
+ indexstr = myfilename;
+ }
+
+ ret = strtoim(indexstr, 0, INT_MAX, NULL);
+ free(myfilename);
+
+ return ret;
+}
+