postfix.sh 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. #!/bin/bash
  2. trap "postfix stop" EXIT
  3. [[ ! -d /opt/postfix/conf/sql/ ]] && mkdir -p /opt/postfix/conf/sql/
  4. if [[ -z $(grep null /etc/aliases) ]]; then
  5. echo null: /dev/null >> /etc/aliases;
  6. newaliases;
  7. fi
  8. cat <<EOF > /opt/postfix/conf/sql/mysql_relay_recipient_maps.cf
  9. user = ${DBUSER}
  10. password = ${DBPASS}
  11. hosts = mysql
  12. dbname = ${DBNAME}
  13. query = SELECT DISTINCT
  14. CASE WHEN '%d' IN (
  15. SELECT domain FROM domain
  16. WHERE relay_all_recipients=1
  17. AND domain='%d'
  18. AND backupmx=1
  19. )
  20. THEN '%s' ELSE (
  21. SELECT goto FROM alias WHERE address='%s' AND active='1'
  22. )
  23. END AS result;
  24. EOF
  25. cat <<EOF > /opt/postfix/conf/sql/mysql_tls_enforce_in_policy.cf
  26. user = ${DBUSER}
  27. password = ${DBPASS}
  28. hosts = mysql
  29. dbname = ${DBNAME}
  30. query = SELECT IF(EXISTS(
  31. SELECT 'TLS_ACTIVE' FROM alias
  32. LEFT OUTER JOIN mailbox ON mailbox.username = alias.goto
  33. WHERE (address='%s'
  34. OR address IN (
  35. SELECT CONCAT('%u', '@', target_domain) FROM alias_domain
  36. WHERE alias_domain='%d'
  37. )
  38. ) AND mailbox.tls_enforce_in = '1' AND mailbox.active = '1'
  39. ), 'reject_plaintext_session', NULL) AS 'tls_enforce_in';
  40. EOF
  41. cat <<EOF > /opt/postfix/conf/sql/mysql_sender_dependent_default_transport_maps.cf
  42. user = ${DBUSER}
  43. password = ${DBPASS}
  44. hosts = mysql
  45. dbname = ${DBNAME}
  46. query = SELECT GROUP_CONCAT(transport SEPARATOR '') AS transport_maps
  47. FROM (
  48. SELECT IF(EXISTS(SELECT 'smtp_type' FROM alias
  49. LEFT OUTER JOIN mailbox ON mailbox.username = alias.goto
  50. WHERE (address = '%s'
  51. OR address IN (
  52. SELECT CONCAT('%u', '@', target_domain) FROM alias_domain
  53. WHERE alias_domain = '%d'
  54. )
  55. )
  56. AND mailbox.tls_enforce_out = '1'
  57. AND mailbox.active = '1'
  58. ), 'smtp_enforced_tls:', 'smtp:') AS 'transport'
  59. UNION ALL
  60. SELECT hostname AS transport FROM relayhosts
  61. LEFT OUTER JOIN domain ON domain.relayhost = relayhosts.id
  62. WHERE relayhosts.active = '1'
  63. AND domain = '%d'
  64. OR domain IN (
  65. SELECT target_domain FROM alias_domain
  66. WHERE alias_domain = '%d'
  67. )
  68. )
  69. AS transport_view;
  70. EOF
  71. cat <<EOF > /opt/postfix/conf/sql/mysql_sasl_passwd_maps.cf
  72. user = ${DBUSER}
  73. password = ${DBPASS}
  74. hosts = mysql
  75. dbname = ${DBNAME}
  76. query = SELECT CONCAT_WS(':', username, password) AS auth_data FROM relayhosts
  77. WHERE id IN (
  78. SELECT relayhost FROM domain
  79. WHERE CONCAT('@', domain) = '%s'
  80. OR '%s' IN (
  81. SELECT CONCAT('@', alias_domain) FROM alias_domain
  82. )
  83. )
  84. AND username != '';
  85. EOF
  86. cat <<EOF > /opt/postfix/conf/sql/mysql_virtual_alias_domain_catchall_maps.cf
  87. user = ${DBUSER}
  88. password = ${DBPASS}
  89. hosts = mysql
  90. dbname = ${DBNAME}
  91. query = SELECT goto FROM alias, alias_domain
  92. WHERE alias_domain.alias_domain = '%d'
  93. AND alias.address = CONCAT('@', alias_domain.target_domain)
  94. AND alias.active = 1 AND alias_domain.active='1'
  95. EOF
  96. cat <<EOF > /opt/postfix/conf/sql/mysql_virtual_alias_domain_maps.cf
  97. user = ${DBUSER}
  98. password = ${DBPASS}
  99. hosts = mysql
  100. dbname = ${DBNAME}
  101. query = SELECT username FROM mailbox, alias_domain
  102. WHERE alias_domain.alias_domain = '%d'
  103. AND mailbox.username = CONCAT('%u', '@', alias_domain.target_domain)
  104. AND mailbox.active = '1'
  105. AND alias_domain.active='1'
  106. EOF
  107. cat <<EOF > /opt/postfix/conf/sql/mysql_virtual_alias_maps.cf
  108. user = ${DBUSER}
  109. password = ${DBPASS}
  110. hosts = mysql
  111. dbname = ${DBNAME}
  112. query = SELECT goto FROM alias
  113. WHERE address='%s'
  114. AND active='1';
  115. EOF
  116. cat <<EOF > /opt/postfix/conf/sql/mysql_recipient_bcc_maps.cf
  117. user = ${DBUSER}
  118. password = ${DBPASS}
  119. hosts = mysql
  120. dbname = ${DBNAME}
  121. query = SELECT bcc_dest FROM bcc_maps
  122. WHERE local_dest='%s'
  123. AND type='rcpt'
  124. AND active='1';
  125. EOF
  126. cat <<EOF > /opt/postfix/conf/sql/mysql_sender_bcc_maps.cf
  127. user = ${DBUSER}
  128. password = ${DBPASS}
  129. hosts = mysql
  130. dbname = ${DBNAME}
  131. query = SELECT bcc_dest FROM bcc_maps
  132. WHERE local_dest='%s'
  133. AND type='sender'
  134. AND active='1';
  135. EOF
  136. cat <<EOF > /opt/postfix/conf/sql/mysql_virtual_domains_maps.cf
  137. user = ${DBUSER}
  138. password = ${DBPASS}
  139. hosts = mysql
  140. dbname = ${DBNAME}
  141. query = SELECT alias_domain from alias_domain WHERE alias_domain='%s' AND active='1'
  142. UNION
  143. SELECT domain FROM domain
  144. WHERE domain='%s'
  145. AND active = '1'
  146. AND backupmx = '0'
  147. EOF
  148. cat <<EOF > /opt/postfix/conf/sql/mysql_virtual_mailbox_maps.cf
  149. user = ${DBUSER}
  150. password = ${DBPASS}
  151. hosts = mysql
  152. dbname = ${DBNAME}
  153. query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'
  154. EOF
  155. cat <<EOF > /opt/postfix/conf/sql/mysql_virtual_relay_domain_maps.cf
  156. user = ${DBUSER}
  157. password = ${DBPASS}
  158. hosts = mysql
  159. dbname = ${DBNAME}
  160. query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '1' AND active = '1'
  161. EOF
  162. cat <<EOF > /opt/postfix/conf/sql/mysql_virtual_sender_acl.cf
  163. user = ${DBUSER}
  164. password = ${DBPASS}
  165. hosts = mysql
  166. dbname = ${DBNAME}
  167. # First select queries domain and alias_domain to determine if domains are active.
  168. query = SELECT goto FROM alias
  169. WHERE address='%s'
  170. AND active='1'
  171. AND (domain IN
  172. (SELECT domain FROM domain
  173. WHERE domain='%d'
  174. AND active='1')
  175. OR domain in (
  176. SELECT alias_domain FROM alias_domain
  177. WHERE alias_domain='%d'
  178. AND active='1'
  179. )
  180. )
  181. UNION
  182. SELECT logged_in_as FROM sender_acl
  183. WHERE send_as='@%d'
  184. OR send_as='%s'
  185. OR send_as IN (
  186. SELECT CONCAT('@',target_domain) FROM alias_domain
  187. WHERE alias_domain = '%d')
  188. OR send_as IN (
  189. SELECT CONCAT('%u','@',target_domain) FROM alias_domain
  190. WHERE alias_domain = '%d')
  191. AND logged_in_as NOT IN (
  192. SELECT goto FROM alias
  193. WHERE address='%s')
  194. UNION
  195. SELECT username FROM mailbox, alias_domain
  196. WHERE alias_domain.alias_domain = '%d'
  197. AND mailbox.username = CONCAT('%u','@',alias_domain.target_domain)
  198. AND mailbox.active ='1'
  199. AND alias_domain.active='1'
  200. EOF
  201. cat <<EOF > /opt/postfix/conf/sql/mysql_virtual_spamalias_maps.cf
  202. user = ${DBUSER}
  203. password = ${DBPASS}
  204. hosts = mysql
  205. dbname = ${DBNAME}
  206. query = SELECT goto FROM spamalias
  207. WHERE address='%s'
  208. AND validity >= UNIX_TIMESTAMP()
  209. EOF
  210. # Reset GPG key permissions
  211. mkdir -p /var/lib/zeyple/keys
  212. chmod 700 /var/lib/zeyple/keys
  213. chown -R 600:600 /var/lib/zeyple/keys
  214. # Fix Postfix permissions
  215. chgrp -R postdrop /var/spool/postfix/public
  216. chgrp -R postdrop /var/spool/postfix/maildrop
  217. postfix set-permissions
  218. # Check Postfix configuration
  219. postconf -c /opt/postfix/conf
  220. if [[ $? != 0 ]]; then
  221. echo "Postfix configuration error, refusing to start."
  222. exit 1
  223. else
  224. postfix -c /opt/postfix/conf start
  225. sleep 126144000
  226. fi