diff --git a/Dockerfile b/Dockerfile index 4c893e81..e86fb8f2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -49,7 +49,9 @@ ADD postfix/main.cf /etc/postfix/main.cf ADD postfix/master.cf /etc/postfix/master.cf ADD postfix/sasl/smtpd.conf /etc/postfix/sasl/smtpd.conf ADD bin/generate-ssl-certificate /usr/local/bin/generate-ssl-certificate +ADD bin/generate-user-databases /usr/local/bin/generate-user-databases RUN chmod +x /usr/local/bin/generate-ssl-certificate +RUN chmod +x /usr/local/bin/generate-user-databases # Get LetsEncrypt signed certificate RUN curl https://letsencrypt.org/certs/lets-encrypt-x1-cross-signed.pem > /etc/ssl/certs/lets-encrypt-x1-cross-signed.pem diff --git a/bin/generate-user-databases b/bin/generate-user-databases new file mode 100644 index 00000000..01e4cf9e --- /dev/null +++ b/bin/generate-user-databases @@ -0,0 +1,24 @@ +#!/bin/bash + +# Generate the courier and sasl databases +if [ -f /tmp/postfix/accounts.cf ]; then + # Checking that /tmp/postfix/accounts.cf ends with a newline + sed -i -e '$a\' /tmp/postfix/accounts.cf + + # Creating users + while IFS=$'|' read login pass + do + # Setting variables for better readability + user=$(echo ${login} | cut -d @ -f1) + domain=$(echo ${login} | cut -d @ -f2) + # Let's go! + echo "user '${user}' for domain '${domain}' with password '********'" + /usr/sbin/userdb ${login} set uid=5000 gid=5000 home=/var/mail/${domain}/${user} mail=/var/mail/${domain}/${user} + echo "${pass}" | userdbpw -md5 | userdb ${login} set systempw + echo "${pass}" | saslpasswd2 -p -c -u ${domain} ${login} + done < /tmp/postfix/accounts.cf + mkdir -p /tmp/postfix/accounts-db + cp /etc/courier/userdb /tmp/postfix/accounts-db/userdb + cp /etc/sasldb2 /tmp/postfix/accounts-db/sasldb2 + echo "Courier and Sasl databases populated with user accounts" +fi diff --git a/start-mailserver.sh b/start-mailserver.sh index 92c38ebc..e0d6f0d4 100644 --- a/start-mailserver.sh +++ b/start-mailserver.sh @@ -5,40 +5,71 @@ die () { exit 1 } -if [ -f /tmp/postfix/accounts.cf ]; then +mkpaths () { + test ! -z "$1" && domain=$1 || die "mkpaths: no domain provided... Exiting" + test ! -z "$2" && user=$2 || die "mkpaths: no user provided... Exiting" + + mkdir -p /var/mail/${domain} + if [ ! -d "/var/mail/${domain}/${user}" ]; then + maildirmake "/var/mail/${domain}/${user}" + maildirmake "/var/mail/${domain}/${user}/.Sent" + maildirmake "/var/mail/${domain}/${user}/.Trash" + maildirmake "/var/mail/${domain}/${user}/.Drafts" + echo -e "INBOX\nINBOX.Sent\nINBOX.Trash\nInbox.Drafts" >> "/var/mail/${domain}/${user}/courierimapsubscribed" + touch "/var/mail/${domain}/${user}/.Sent/maildirfolder" + fi + echo ${domain} >> /tmp/vhost.tmp +} + +if [ -f /tmp/postfix/accounts-db/userdb -a -f /tmp/postfix/accounts-db/sasldb2 ]; then + CDB="/etc/courier/userdb" + SASLDB="/etc/sasldb2" + # User databases have been already prepared + echo "Found user databases already setup" + cp /tmp/postfix/accounts-db/userdb ${CDB} + chown root:root ${CDB} + chmod 600 ${CDB} + cp /tmp/postfix/accounts-db/sasldb2 ${SASLDB} + chown postfix:sasl ${SASLDB} + chmod 660 ${SASLDB} echo "Regenerating postfix 'vmailbox' and 'virtual' for given users" echo "# WARNING: this file is auto-generated. Modify accounts.cf in postfix directory on host" > /etc/postfix/vmailbox - - # Checking that /tmp/postfix/accounts.cf ends with a newline - sed -i -e '$a\' /tmp/postfix/accounts.cf - - # Creating users - while IFS=$'|' read login pass - do - # Setting variables for better readability - user=$(echo ${login} | cut -d @ -f1) - domain=$(echo ${login} | cut -d @ -f2) - # Let's go! - echo "user '${user}' for domain '${domain}' with password '********'" - echo "${login} ${domain}/${user}/" >> /etc/postfix/vmailbox - /usr/sbin/userdb ${login} set uid=5000 gid=5000 home=/var/mail/${domain}/${user} mail=/var/mail/${domain}/${user} - echo "${pass}" | userdbpw -md5 | userdb ${login} set systempw - echo "${pass}" | saslpasswd2 -p -c -u ${domain} ${login} - mkdir -p /var/mail/${domain} - if [ ! -d "/var/mail/${domain}/${user}" ]; then - maildirmake "/var/mail/${domain}/${user}" - maildirmake "/var/mail/${domain}/${user}/.Sent" - maildirmake "/var/mail/${domain}/${user}/.Trash" - maildirmake "/var/mail/${domain}/${user}/.Drafts" - echo -e "INBOX\nINBOX.Sent\nINBOX.Trash\nInbox.Drafts" >> "/var/mail/${domain}/${user}/courierimapsubscribed" - touch "/var/mail/${domain}/${user}/.Sent/maildirfolder" - - fi - echo ${domain} >> /tmp/vhost.tmp - done < /tmp/postfix/accounts.cf + # Create the expected maildir paths + awk '{u=substr($1,1,index($1,"@")-1); d=substr($1,index($1,"@")+1,length($1)); print u" "d}' ${CDB} | \ + while read user domain; do + mkpaths ${domain} ${user} + echo "${user}@${domain} ${domain}/${user}/" >> /etc/postfix/vmailbox + done makeuserdb -else - echo "==> Warning: '/tmp/postfix/accounts.cf' is not provided. No mail account created." +else + # should exit with explicit message! + if [ -f /tmp/postfix/accounts.cf ]; then + echo "Regenerating postfix 'vmailbox' and 'virtual' for given users" + echo "# WARNING: this file is auto-generated. Modify accounts.cf in postfix directory on host" > /etc/postfix/vmailbox + + # Checking that /tmp/postfix/accounts.cf ends with a newline + sed -i -e '$a\' /tmp/postfix/accounts.cf + + # Creating users + while IFS=$'|' read login pass + do + # Setting variables for better readability + user=$(echo ${login} | cut -d @ -f1) + domain=$(echo ${login} | cut -d @ -f2) + # Let's go! + echo "user '${user}' for domain '${domain}' with password '********'" + echo "${login} ${domain}/${user}/" >> /etc/postfix/vmailbox + /usr/sbin/userdb ${login} set uid=5000 gid=5000 home=/var/mail/${domain}/${user} mail=/var/mail/${domain}/${user} + echo "${pass}" | userdbpw -md5 | userdb ${login} set systempw + echo "${pass}" | saslpasswd2 -p -c -u ${domain} ${login} + # Create the expected maildir paths + mkpaths ${domain} ${user} + done < /tmp/postfix/accounts.cf + makeuserdb + else + echo "==> Accounts: '/tmp/postfix/userdb' and '/tmp/postfix/sasldb2' OR '/tmp/postfix/accounts.cf' " + echo "==> Warning: None of those files are provided. No mail account created." + fi fi if [ -f /tmp/postfix/virtual ]; then