]> git.ipfire.org Git - thirdparty/mlmmj.git/commitdiff
Added support for static bounce addresses (Thomas Jarosch)
authormortenp <none@none>
Fri, 31 Oct 2008 15:43:37 +0000 (02:43 +1100)
committermortenp <none@none>
Fri, 31 Oct 2008 15:43:37 +0000 (02:43 +1100)
ChangeLog
TUNABLES
src/mlmmj-send.c

index 0edc6016f6a0c22544f03f206fae7c1fc3dbaf56..4367dbf8b0bd1f5518d1da98158389d56a6469c5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,4 @@
+ o Added support for static bounce addresses (Thomas Jarosch)
  o Added a sanity check in mlmmj-receive-strip (Chris Webb)
  o Added more sanity checks (Thomas Jarosch)
  o Disabled digest mails when 'noarchive' is set (Thomas Jarosch)
index 5bd14c3598d32b0d03a54f93e5e3bc8f5609e8e6..e03ca0376684a301f68deb36d021acccfbb9c4ab 100644 (file)
--- a/TUNABLES
+++ b/TUNABLES
@@ -197,3 +197,9 @@ to specify several entries (one pr. line), it's marked "list".
 
    If this is set, the LISTNAME+list@ functionality for requesting an
    email with the subscribers for owner is disabled.
+
+ ยท staticbounceaddr            (normal)
+
+   If this is set to something@example.org, the bounce address (Return-Path:)
+   will be fixed to something+listname-bounces-and-so-on@example.org
+   in case you need to disable automatic bounce handling.
index e35cf637098d69d00438f2a1f635195d005343a8..8d1d44d6b9bc544c30251dc650864880af7792b5 100644 (file)
@@ -102,10 +102,13 @@ char *get_index_from_filename(const char *filename)
 }
 
 char *bounce_from_adr(const char *recipient, const char *listadr,
-                     const char *listdelim, const char *mailfilename)
+                     const char *listdelim, const char *mailfilename,
+                     const char *listdir)
 {
-       char *bounceaddr, *myrecipient, *mylistadr, *mylistdelim;
+       char *bounceaddr, *myrecipient, *mylistadr;
        char *indexstr, *listdomain, *a = NULL, *mymailfilename;
+       char *staticbounceaddr, *staticbounceaddr_localpart;
+       char *staticbounceaddr_domain;
        size_t len;
 
        mymailfilename = mystrdup(mailfilename);
@@ -114,6 +117,10 @@ char *bounce_from_adr(const char *recipient, const char *listadr,
        }
 
        indexstr = get_index_from_filename(mymailfilename);
+       if (!indexstr) {
+               myfree(mymailfilename);
+               return NULL;
+       }
 
        myrecipient = mystrdup(recipient);
        if (!myrecipient) {
@@ -131,40 +138,57 @@ char *bounce_from_adr(const char *recipient, const char *listadr,
                return NULL;
        }
 
-       mylistdelim = mystrdup(listdelim);
-       if (!mylistdelim) {
-               myfree(mymailfilename);
-               myfree(myrecipient);
-               myfree(mylistadr);
-               return NULL;
-       }
-
        listdomain = strchr(mylistadr, '@');
        if (!listdomain) {
                myfree(mymailfilename);
                myfree(myrecipient);
                myfree(mylistadr);
-               myfree(mylistdelim);
                return NULL;
        }
        *listdomain++ = '\0';
 
        /* 11 = "bounces-" + "-" + "@" + NUL */
-       len = strlen(mylistadr) + strlen(mylistdelim) + strlen(myrecipient)
-                + strlen(indexstr) + strlen(listdomain) + 11;
+       len = strlen(mylistadr) + strlen(listdelim) + strlen(myrecipient)
+                  + strlen(indexstr) + strlen(listdomain) + 11;
+
+       staticbounceaddr = ctrlvalue(listdir, "staticbounceaddr");
+       if (staticbounceaddr) {
+               staticbounceaddr_localpart = genlistname(staticbounceaddr);
+               staticbounceaddr_domain = genlistfqdn(staticbounceaddr);
+
+               /* localpart + "-" + domain */
+               len += strlen(staticbounceaddr_localpart) + 1
+                               + strlen(staticbounceaddr_domain);
+       } else {
+               staticbounceaddr_localpart = NULL;
+               staticbounceaddr_domain = NULL;
+       }
+
        bounceaddr = mymalloc(len);
        if (!bounceaddr) {
+               myfree(staticbounceaddr);
+               myfree(staticbounceaddr_localpart);
+               myfree(staticbounceaddr_domain);
                myfree(myrecipient);
                myfree(mylistadr);
-               myfree(mylistdelim);
                return NULL;
        }
-       snprintf(bounceaddr, len, "%s%sbounces-%s-%s@%s", mylistadr, listdelim,
-                indexstr, myrecipient, listdomain);
+
+       if (staticbounceaddr) {
+               snprintf(bounceaddr, len, "%s%s%s-bounces-%s-%s@%s", 
+                       staticbounceaddr_localpart, listdelim, mylistadr,
+                       indexstr, myrecipient, staticbounceaddr_domain);
+
+               myfree(staticbounceaddr);
+               myfree(staticbounceaddr_localpart);
+               myfree(staticbounceaddr_domain);
+       } else {
+               snprintf(bounceaddr, len, "%s%sbounces-%s-%s@%s", mylistadr, listdelim,
+                       indexstr, myrecipient, listdomain);
+       }
 
        myfree(myrecipient);
        myfree(mylistadr);
-       myfree(mylistdelim);
        myfree(indexstr);
        myfree(mymailfilename);
 
@@ -629,7 +653,7 @@ int send_mail_many_list(int sockfd, const char *from, const char *replyto,
                                            hdrs, hdrslen, body, bodylen);
                } else {
                        bounceaddr = bounce_from_adr(addr, listaddr, listdelim,
-                                                    archivefilename);
+                                                    archivefilename, listdir);
                        res = send_mail(sockfd, bounceaddr, addr, replyto,
                                  mailmap, mailsize, listdir, mlmmjbounce,
                                  hdrs, hdrslen, body, bodylen);
@@ -929,7 +953,7 @@ int main(int argc, char **argv)
                deletewhensent = 0;
                archivefilename = mystrdup(mailfilename);
                bounceaddr = bounce_from_adr(to_addr, listaddr, listdelim,
-                                               archivefilename);
+                                               archivefilename, listdir);
                break;
        default: /* normal list mail -- now handled when forking */
                addtohdr = statctrl(listdir, "addtohdr");