From 7f63c199a6dd48e60fa33509e6d5d1b7927e8913 Mon Sep 17 00:00:00 2001 From: Joshua Tauberer Date: Sun, 1 Sep 2013 10:39:36 -0400 Subject: [PATCH] move the sieve script configuration to tools/mail.py --- conf/dovecot_sieve.txt | 8 ++++++++ scripts/add_mail_user.sh | 13 ------------- scripts/spamassassin.sh | 4 ++-- scripts/start.sh | 11 +++++++++-- scripts/users_update.sh | 22 ---------------------- tools/mail.py | 12 +++++++++++- 6 files changed, 30 insertions(+), 40 deletions(-) create mode 100644 conf/dovecot_sieve.txt delete mode 100644 scripts/add_mail_user.sh delete mode 100644 scripts/users_update.sh diff --git a/conf/dovecot_sieve.txt b/conf/dovecot_sieve.txt new file mode 100644 index 00000000..5428adb5 --- /dev/null +++ b/conf/dovecot_sieve.txt @@ -0,0 +1,8 @@ +require ["regex", "fileinto", "imap4flags"]; + +if allof (header :regex "X-Spam-Status" "^Yes") { + setflag "\\\\Seen"; + fileinto "Spam"; + stop; +} + diff --git a/scripts/add_mail_user.sh b/scripts/add_mail_user.sh deleted file mode 100644 index 8d34328b..00000000 --- a/scripts/add_mail_user.sh +++ /dev/null @@ -1,13 +0,0 @@ -# Create a new email user. -########################## - -echo -echo "Set up your first email account..." -read -e -i "user@`hostname`" -p "Email Address: " EMAIL_ADDR -read -e -p "Email Password (blank to skip): " EMAIL_PW - -if [ ! -z "$EMAIL_PW" ]; then - echo "INSERT INTO users (email, password) VALUES ('$EMAIL_ADDR', '`doveadm pw -s SHA512-CRYPT -p $EMAIL_PW`');" \ - | sqlite3 $STORAGE_ROOT/mail/users.sqlite -fi - diff --git a/scripts/spamassassin.sh b/scripts/spamassassin.sh index d4a6db2b..be8df7da 100644 --- a/scripts/spamassassin.sh +++ b/scripts/spamassassin.sh @@ -6,8 +6,8 @@ # message over LMTP to dovecot for local delivery. # In order to move spam automatically into the Spam folder we use the dovecot sieve -# plugin. Unfortunately, each mail box needs its own sieve script set to do the -# filtering work. So users_update.sh must be run any time a new mail user is created. +# plugin. The tools/mail.py tool creates the necessary sieve script for each mail +# user when the mail user is created. # Install packages. apt-get -q -y install spampd dovecot-sieve dovecot-antispam diff --git a/scripts/start.sh b/scripts/start.sh index 58affc15..a56c5ff4 100755 --- a/scripts/start.sh +++ b/scripts/start.sh @@ -59,6 +59,13 @@ EOF . scripts/dkim.sh . scripts/spamassassin.sh . scripts/dns_update.sh -. scripts/add_mail_user.sh -. scripts/users_update.sh + +if [ -z `tools/mail.py user` ]; then + # The outut of "tools/mail.py user" is a list of mail users. If there + # are none configured, ask the user to configure one. + echo + echo "Let's create your first mail user." + read -e -i "user@`hostname`" -p "Email Address: " EMAIL_ADDR + tools/mail.py user add $EMAIL_ADDR # will ask for password +fi diff --git a/scripts/users_update.sh b/scripts/users_update.sh deleted file mode 100644 index 4e5f7685..00000000 --- a/scripts/users_update.sh +++ /dev/null @@ -1,22 +0,0 @@ -# Install dovecot sieve scripts to automatically move spam into the Spam folder. - -db_path=$STORAGE_ROOT/mail/users.sqlite - -for user in `echo "SELECT email FROM users;" | sqlite3 $db_path`; do - maildir=`echo $user | sed "s/\(.*\)@\(.*\)/\2\/\1/"` - - # Write the sieve file to move mail classified as spam into the spam folder. - mkdir -p $STORAGE_ROOT/mail/mailboxes/$maildir; # in case user has not received any mail - cat > $STORAGE_ROOT/mail/mailboxes/$maildir/.dovecot.sieve << EOF; -require ["regex", "fileinto", "imap4flags"]; - -if allof (header :regex "X-Spam-Status" "^Yes") { - setflag "\\\\Seen"; - fileinto "Spam"; - stop; -} -EOF - - -done - diff --git a/tools/mail.py b/tools/mail.py index 79b2aee6..2bf527bc 100755 --- a/tools/mail.py +++ b/tools/mail.py @@ -1,6 +1,6 @@ #!/usr/bin/python3 -import sys, sqlite3, subprocess +import sys, sqlite3, subprocess, shutil, os # Load STORAGE_ROOT setting from /etc/mailinabox.conf. env = { } @@ -59,6 +59,16 @@ elif sys.argv[1] == "user" and sys.argv[2] in ("add", "password"): if "INBOX" not in existing_mboxes: subprocess.check_call(["doveadm", "mailbox", "create", "-u", email, "-s", "INBOX"]) if "Spam" not in existing_mboxes: subprocess.check_call(["doveadm", "mailbox", "create", "-u", email, "-s", "Spam"]) + # Create the user's sieve script to move spam into the Spam folder, and make it owned by mail. + maildirstat = os.stat(env["STORAGE_ROOT"] + "/mail/mailboxes") + (em_user, em_domain) = email.split("@", 1) + user_mail_dir = env["STORAGE_ROOT"] + ("/mail/mailboxes/%s/%s" % (em_domain, em_user)) + if not os.path.exists(user_mail_dir): + os.makedirs(user_mail_dir) + os.chown(user_mail_dir, maildirstat.st_uid, maildirstat.st_gid) + shutil.copyfile("conf/dovecot_sieve.txt", user_mail_dir + "/.dovecot.sieve") + os.chown(user_mail_dir + "/.dovecot.sieve", maildirstat.st_uid, maildirstat.st_gid) + elif sys.argv[2] == "password": c.execute("UPDATE users SET password=? WHERE email=?", (pw, email)) if c.rowcount != 1: