diff --git a/mail/postfix/access.cf b/mail/postfix/access.cf new file mode 100644 index 0000000..025ab71 --- /dev/null +++ b/mail/postfix/access.cf @@ -0,0 +1,2 @@ +dbpath = /data/mail/config/vmail.db +query = SELECT action FROM access WHERE address = '%s' diff --git a/mail/postfix/alias.cf b/mail/postfix/alias.cf new file mode 100644 index 0000000..856c3cc --- /dev/null +++ b/mail/postfix/alias.cf @@ -0,0 +1,2 @@ +dbpath = /data/mail/config/vmail.db +query = SELECT goto FROM alias WHERE address = '%s' AND active = 1 diff --git a/mail/postfix/db-access.cf b/mail/postfix/db-access.cf deleted file mode 100644 index ff5491b..0000000 --- a/mail/postfix/db-access.cf +++ /dev/null @@ -1,2 +0,0 @@ -dbpath = /data/mail/config/vmail.db -query = SELECT v FROM setting WHERE active = 1 AND k = '%s' AND name = 'recipient_access' diff --git a/mail/postfix/db-alias.cf b/mail/postfix/db-alias.cf deleted file mode 100644 index 00acaf4..0000000 --- a/mail/postfix/db-alias.cf +++ /dev/null @@ -1,2 +0,0 @@ -dbpath = /data/mail/config/vmail.db -query = SELECT v FROM setting WHERE active = 1 AND k = '%s' AND name = 'alias' diff --git a/mail/postfix/db-domains.cf b/mail/postfix/db-domains.cf deleted file mode 100644 index 6c1d1e4..0000000 --- a/mail/postfix/db-domains.cf +++ /dev/null @@ -1,2 +0,0 @@ -dbpath = /data/mail/config/vmail.db -query = SELECT domain FROM domain WHERE active = 1 AND domain = '%s' AND NOT (transport LIKE 'smtp%%' OR transport LIKE 'relay%%') diff --git a/mail/postfix/db-login.cf b/mail/postfix/db-login.cf deleted file mode 100644 index f0b7654..0000000 --- a/mail/postfix/db-login.cf +++ /dev/null @@ -1,2 +0,0 @@ -dbpath = /data/mail/config/vmail.db -query = SELECT username FROM mailbox WHERE active = 1 AND username = '%s' diff --git a/mail/postfix/db-relay.cf b/mail/postfix/db-relay.cf deleted file mode 100644 index 48272f9..0000000 --- a/mail/postfix/db-relay.cf +++ /dev/null @@ -1,2 +0,0 @@ -dbpath = /data/mail/config/vmail.db -query = SELECT domain FROM domain WHERE active = 1 AND domain = '%s' AND (transport LIKE 'smtp%%' OR transport LIKE 'relay%%') diff --git a/mail/postfix/db-transport.cf b/mail/postfix/db-transport.cf deleted file mode 100644 index 9fa28bc..0000000 --- a/mail/postfix/db-transport.cf +++ /dev/null @@ -1,2 +0,0 @@ -dbpath = /data/mail/config/vmail.db -query = SELECT transport FROM domain WHERE active = 1 AND domain = '%s' diff --git a/mail/postfix/db-virtual.cf b/mail/postfix/db-virtual.cf deleted file mode 100644 index 742da6d..0000000 --- a/mail/postfix/db-virtual.cf +++ /dev/null @@ -1,2 +0,0 @@ -dbpath = /data/mail/config/vmail.db -query = SELECT maildir FROM mailbox WHERE active = 1 AND username = '%s' diff --git a/mail/postfix/domains.cf b/mail/postfix/domains.cf new file mode 100644 index 0000000..619b14a --- /dev/null +++ b/mail/postfix/domains.cf @@ -0,0 +1,2 @@ +dbpath = /data/mail/config/vmail.db +query = SELECT domain FROM domain WHERE domain = '%s' AND active = 1 AND NOT (transport LIKE 'smtp%%' OR transport LIKE 'relay%%') diff --git a/mail/postfix/login.cf b/mail/postfix/login.cf new file mode 100644 index 0000000..30acf06 --- /dev/null +++ b/mail/postfix/login.cf @@ -0,0 +1,2 @@ +dbpath = /data/mail/config/vmail.db +query = SELECT username FROM mailbox WHERE username = '%s' AND active = 1 diff --git a/mail/postfix/main.cf b/mail/postfix/main.cf index 8e5106c..2ec11c3 100644 --- a/mail/postfix/main.cf +++ b/mail/postfix/main.cf @@ -6,7 +6,6 @@ disable_vrfy_command = yes mailbox_size_limit = 0 message_size_limit = 0 mynetworks_style = subnet -alias_maps = hash:/etc/aliases # Custom @@ -26,26 +25,27 @@ tls_server_sni_maps = hash:/etc/postfix/sni.cf smtpd_tls_received_header = yes -relay_domains = sqlite:/etc/postfix/db-relay.cf -transport_maps = sqlite:/etc/postfix/db-transport.cf +relay_domains = sqlite:/etc/postfix/relay.cf +transport_maps = sqlite:/etc/postfix/transport.cf virtual_mailbox_base = /data/mail/mail virtual_uid_maps = static:2000 virtual_gid_maps = static:2000 -virtual_mailbox_domains = sqlite:/etc/postfix/db-domains.cf -virtual_mailbox_maps = sqlite:/etc/postfix/db-virtual.cf -virtual_alias_maps = sqlite:/etc/postfix/db-alias.cf +virtual_mailbox_domains = sqlite:/etc/postfix/domains.cf +virtual_mailbox_maps = sqlite:/etc/postfix/virtual.cf +virtual_alias_maps = sqlite:/etc/postfix/alias.cf virtual_mailbox_limit = 0 smtpd_sasl_auth_enable = yes smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth -smtpd_sender_login_maps = sqlite:/etc/postfix/db-login.cf, $virtual_alias_maps +smtpd_sender_login_maps = sqlite:/etc/postfix/login.cf, $virtual_alias_maps +smtpd_delay_reject = no smtpd_hard_error_limit = 1 smtpd_client_restrictions = reject_unknown_reverse_client_hostname smtpd_sender_restrictions = reject_sender_login_mismatch -smtpd_recipient_restrictions = check_recipient_access sqlite:/etc/postfix/db-access.cf +smtpd_recipient_restrictions = check_recipient_access sqlite:/etc/postfix/access.cf smtpd_milters = unix:private/opendkim non_smtpd_milters = $smtpd_milters diff --git a/mail/postfix/relay.cf b/mail/postfix/relay.cf new file mode 100644 index 0000000..7fe86eb --- /dev/null +++ b/mail/postfix/relay.cf @@ -0,0 +1,2 @@ +dbpath = /data/mail/config/vmail.db +query = SELECT domain FROM domain WHERE domain = '%s' AND active = 1 AND (transport LIKE 'smtp%%' OR transport LIKE 'relay%%') diff --git a/mail/postfix/transport.cf b/mail/postfix/transport.cf new file mode 100644 index 0000000..0e8deac --- /dev/null +++ b/mail/postfix/transport.cf @@ -0,0 +1,2 @@ +dbpath = /data/mail/config/vmail.db +query = SELECT transport FROM domain WHERE domain = '%s' AND active = 1 diff --git a/mail/postfix/virtual.cf b/mail/postfix/virtual.cf new file mode 100644 index 0000000..dd3705d --- /dev/null +++ b/mail/postfix/virtual.cf @@ -0,0 +1,2 @@ +dbpath = /data/mail/config/vmail.db +query = SELECT maildir FROM mailbox WHERE username = '%s' AND active = 1 diff --git a/mail/schema.sql b/mail/schema.sql index b2f238e..007c022 100644 --- a/mail/schema.sql +++ b/mail/schema.sql @@ -1,7 +1,7 @@ +create table alias (address varchar(255) not null primary key, goto varchar(255) not null, active int not null default 1); create table domain (domain varchar(255) not null primary key, transport varchar(255) not null default 'virtual', active int not null default 1); create table mailbox (username varchar(255) not null primary key, password varchar(255) not null default '', name varchar(255) not null default '', maildir varchar(255) not null, active int not null default 1); -create table setting (name varchar(255) not null, k varchar(255) not null, v varchar(255) not null, active int not null default 1, primary key (name, k)); - create table dkim (match varchar(255) not null primary key, key varchar(255) not null); create table dkim_key (key varchar(255) not null primary key, domain varchar(255) not null, selector varchar(255) not null, private_key varchar(65535) not null); +create table access (address varchar(255) not null primary key, action varchar(255) not null);