· 6 years ago · Aug 22, 2019, 01:04 PM
1#!/usr/bin/env bash
2
3#####
4# Script to install postfix
5#####
6
7
8DOMAIN="example.com"
9EMAIL="haisum@example.com"
10PASSWORD="example.com1*"
11DATABASE="servermail"
12DB_USER="usermail"
13DB_USER_PASS="mailpassword"
14
15export DEBIAN_FRONTEND=noninteractive
16
17installpkg(){
18 dpkg-query --status $1 >/dev/null || apt-get install -y $1
19}
20
21apt-get update
22installpkg mysql-server
23installpkg mysql-client
24debconf-set-selections <<< "postfix postfix/mailname string $DOMAIN"
25debconf-set-selections <<< "postfix postfix/main_mailer_type string 'Internet Site'"
26installpkg postfix
27installpkg postfix-mysql
28installpkg dovecot-core
29installpkg dovecot-imapd
30installpkg dovecot-pop3d
31installpkg dovecot-lmtpd
32installpkg dovecot-mysql
33
34bootstrapdb(){
35 cat <<EOF | mysql -uroot
36
37 CREATE DATABASE IF NOT EXISTS $DATABASE;
38
39 GRANT SELECT ON $DATABASE.* TO '$DB_USER'@'127.0.0.1' IDENTIFIED BY '$DB_USER_PASS';
40
41 FLUSH PRIVILEGES;
42
43 USE servermail;
44
45 CREATE TABLE IF NOT EXISTS virtual_domains (
46 id INT NOT NULL AUTO_INCREMENT,
47 name VARCHAR(50) NOT NULL,
48 PRIMARY KEY (id)
49 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
50
51 CREATE TABLE IF NOT EXISTS virtual_users (
52 id INT NOT NULL AUTO_INCREMENT,
53 domain_id INT NOT NULL,
54 password VARCHAR(106) NOT NULL,
55 email VARCHAR(120) NOT NULL,
56 PRIMARY KEY (id),
57 UNIQUE KEY email (email),
58 FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
59 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
60
61 CREATE TABLE IF NOT EXISTS virtual_aliases (
62 id INT NOT NULL AUTO_INCREMENT,
63 domain_id INT NOT NULL,
64 source varchar(100) NOT NULL,
65 destination varchar(100) NOT NULL,
66 PRIMARY KEY (id),
67 FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
68 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
69
70 INSERT INTO servermail.virtual_domains
71 (id ,name)
72 VALUES
73 ('1', '$DOMAIN'),
74 ('2', 'mail.$DOMAIN');
75
76 INSERT INTO servermail.virtual_users
77 (id, domain_id, password , email)
78 VALUES
79 ('1', '1', ENCRYPT('$PASSWORD', CONCAT('\$6\$', SUBSTRING(SHA(RAND()), -16))), '$EMAIL');
80
81EOF
82}
83bootstrapdb
84
85##Configure postfix main.cf config
86postconf smtpd_recipient_restrictions="permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination"
87postconf smtpd_sasl_auth_enable=yes
88postconf smtpd_sasl_path=private/auth
89postconf smtpd_sasl_type=dovecot
90postconf mydestination=localhost
91postconf myhostname=`hostname`
92postconf virtual_transport=lmtp:unix:private/dovecot-lmtp
93
94postconf virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
95postconf virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
96postconf virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf
97
98#set IFS to blank so we preserve new lines in multiline strings
99IFS=""
100
101echo "user = $DB_USER
102password = $DB_USER_PASS
103hosts = 127.0.0.1
104dbname = $DATABASE
105query = SELECT 1 FROM virtual_domains WHERE name='%s'" > /etc/postfix/mysql-virtual-mailbox-domains.cf
106
107service postfix restart
108
109status=`postmap -q techtalik.co mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf`
110if [ $status -ne 1 ]; then
111 echo "Virtual Domains config failed."
112fi
113
114echo "user = $DB_USER
115password = $DB_USER_PASS
116hosts = 127.0.0.1
117dbname = $DATABASE
118query = SELECT 1 FROM virtual_users WHERE email='%s'" > /etc/postfix/mysql-virtual-mailbox-maps.cf
119
120service postfix restart
121
122status=`postmap -q umair@techtalik.co mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf`
123
124status=`postmap -q umair@techtalik.co mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf`
125if [ $status -ne 1 ]; then
126 echo "Virtual users config failed."
127fi
128
129echo "user = $DB_USER
130password = $DB_USER_PASS
131hosts = 127.0.0.1
132dbname = $DATABASE
133query = SELECT destination FROM virtual_aliases WHERE source='%s'" > /etc/postfix/mysql-virtual-alias-maps.cf
134
135service postfix restart
136
137#master.cf config
138postconf -M submission/inet="submission inet n - - - - smtpd"
139postconf -P submission/inet/syslog_name=postfix/submission
140postconf -P submission/inet/smtpd_tls_security_level=may
141postconf -P submission/inet/smtpd_sasl_auth_enable=yes
142postconf -P submission/inet/smtpd_client_restrictions=permit_sasl_authenticated,reject
143
144service postfix restart
145
146##Dovecot
147
148cp /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.orig
149cp /etc/dovecot/conf.d/10-mail.conf /etc/dovecot/conf.d/10-mail.conf.orig
150cp /etc/dovecot/conf.d/10-auth.conf /etc/dovecot/conf.d/10-auth.conf.orig
151cp /etc/dovecot/dovecot-sql.conf.ext /etc/dovecot/dovecot-sql.conf.ext.orig
152cp /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.orig
153cp /etc/dovecot/conf.d/10-ssl.conf /etc/dovecot/conf.d/10-ssl.conf.orig
154#uncomment !include conf.d/*.conf
155sed -i '/\!include conf\.d\/\*\.conf/s/^#//' /etc/dovecot/dovecot.conf
156status = `grep "protocols = imap lmtp" /etc/dovecot/dovecot.conf`
157if [ -z $status ];then
158 echo "protocols = imap lmtp pop3" >> /etc/dovecot/dovecot.conf
159fi
160
161sed -i '/^mail_location =.*/s/^/#/g' /etc/dovecot/conf.d/10-mail.conf #comment default mail_location
162echo "mail_location = maildir:/var/mail/vhosts/%d/%n" >> /etc/dovecot/conf.d/10-mail.conf
163
164
165sed -i '/^mail_privileged_group =.*/s/^/#/g' /etc/dovecot/conf.d/10-mail.conf
166echo "mail_privileged_group = mail" >> /etc/dovecot/conf.d/10-mail.conf
167
168mkdir -p /var/mail/vhosts/"$DOMAIN"
169groupadd -g 5000 vmail
170useradd -g vmail -u 5000 vmail -d /var/mail
171chown -R vmail:vmail /var/mail
172
173sed -i '/^auth_mechanisms =.*/s/^/#/g' /etc/dovecot/conf.d/10-auth.conf
174echo "auth_mechanisms = plain login" >> /etc/dovecot/conf.d/10-auth.conf
175
176sed -i '/\!include auth-system\.conf\.ext/s/^/#/g' /etc/dovecot/conf.d/10-auth.conf
177
178sed -i '/\!include auth-sql\.conf\.ext/s/^#//g' /etc/dovecot/conf.d/10-auth.conf
179
180
181
182if [[ ! -f /etc/dovecot/conf.d/auth-sql.conf.ext.orig ]]; then
183 mv /etc/dovecot/conf.d/auth-sql.conf.ext /etc/dovecot/conf.d/auth-sql.conf.ext.orig
184fi
185
186auth10="
187passdb {
188 driver = sql
189 args = /etc/dovecot/dovecot-sql.conf.ext
190}
191userdb {
192 driver = static
193 args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
194}
195"
196echo $auth10 > /etc/dovecot/conf.d/auth-sql.conf.ext
197
198sed -i '/^driver =.*/s/^/#/g' /etc/dovecot/dovecot-sql.conf.ext
199echo "driver = mysql" >> /etc/dovecot/dovecot-sql.conf.ext
200
201sed -i '/^connect =.*/s/^/#/g' /etc/dovecot/dovecot-sql.conf.ext
202echo "connect = host=127.0.0.1 dbname=$DATABASE user=$DB_USER password=$DB_USER_PASS" >> /etc/dovecot/dovecot-sql.conf.ext
203
204sed -i '/^default_pass_scheme =.*/s/^/#/g' /etc/dovecot/dovecot-sql.conf.ext
205echo "default_pass_scheme = SHA512-CRYPT" >> /etc/dovecot/dovecot-sql.conf.ext
206
207sed -i '/^password_query =.*/s/^/#/g' /etc/dovecot/dovecot-sql.conf.ext
208echo "password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';" >> /etc/dovecot/dovecot-sql.conf.ext
209
210chown -R vmail:dovecot /etc/dovecot
211chmod -R o-rwx /etc/dovecot
212
213if [[ ! -f /etc/dovecot/conf.d/10-master.conf.orig ]]; then
214 mv /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.orig
215fi
216dovecotmaster="service imap-login {
217 inet_listener imap {
218 port = 0
219 }
220 inet_listener imaps {
221 #port = 993
222 #ssl = yes
223 }
224}
225service pop3-login {
226 inet_listener pop3 {
227 #port = 110
228 }
229 inet_listener pop3s {
230 #port = 995
231 #ssl = yes
232 }
233}
234
235service lmtp {
236 unix_listener /var/spool/postfix/private/dovecot-lmtp {
237 mode = 0600
238 user = postfix
239 group = postfix
240 }
241}
242
243service imap {
244}
245
246service pop3 {
247}
248
249service auth {
250 unix_listener /var/spool/postfix/private/auth {
251 mode = 0666
252 user = postfix
253 group = postfix
254 }
255
256 unix_listener auth-userdb {
257 mode = 0600
258 user = vmail
259 #group =
260 }
261 # Auth process is run as this user.
262 user = dovecot
263}
264
265service auth-worker {
266 user = vmail
267}
268
269service dict {
270 unix_listener dict {
271 }
272}"
273echo $dovecotmaster > /etc/dovecot/conf.d/10-master.conf
274service dovecot restart
275service postfix restart
276echo "\n\nYour mail server should be accessible now."
277unset $IFS