postfix.sh 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  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. );
  81. EOF
  82. cat <<EOF > /opt/postfix/conf/sql/mysql_virtual_alias_domain_catchall_maps.cf
  83. user = ${DBUSER}
  84. password = ${DBPASS}
  85. hosts = mysql
  86. dbname = ${DBNAME}
  87. query = SELECT goto FROM alias, alias_domain
  88. WHERE alias_domain.alias_domain = '%d'
  89. AND alias.address = CONCAT('@', alias_domain.target_domain)
  90. AND alias.active = 1 AND alias_domain.active='1'
  91. EOF
  92. cat <<EOF > /opt/postfix/conf/sql/mysql_virtual_alias_domain_maps.cf
  93. user = ${DBUSER}
  94. password = ${DBPASS}
  95. hosts = mysql
  96. dbname = ${DBNAME}
  97. query = SELECT username FROM mailbox, alias_domain
  98. WHERE alias_domain.alias_domain = '%d'
  99. AND mailbox.username = CONCAT('%u', '@', alias_domain.target_domain)
  100. AND mailbox.active = '1'
  101. AND alias_domain.active='1'
  102. EOF
  103. cat <<EOF > /opt/postfix/conf/sql/mysql_virtual_alias_maps.cf
  104. user = ${DBUSER}
  105. password = ${DBPASS}
  106. hosts = mysql
  107. dbname = ${DBNAME}
  108. query = SELECT goto FROM alias
  109. WHERE address='%s'
  110. AND active='1';
  111. EOF
  112. cat <<EOF > /opt/postfix/conf/sql/mysql_virtual_domains_maps.cf
  113. user = ${DBUSER}
  114. password = ${DBPASS}
  115. hosts = mysql
  116. dbname = ${DBNAME}
  117. query = SELECT alias_domain from alias_domain WHERE alias_domain='%s' AND active='1'
  118. UNION
  119. SELECT domain FROM domain
  120. WHERE domain='%s'
  121. AND active = '1'
  122. AND backupmx = '0'
  123. EOF
  124. cat <<EOF > /opt/postfix/conf/sql/mysql_virtual_mailbox_maps.cf
  125. user = ${DBUSER}
  126. password = ${DBPASS}
  127. hosts = mysql
  128. dbname = ${DBNAME}
  129. query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'
  130. EOF
  131. cat <<EOF > /opt/postfix/conf/sql/mysql_virtual_relay_domain_maps.cf
  132. user = ${DBUSER}
  133. password = ${DBPASS}
  134. hosts = mysql
  135. dbname = ${DBNAME}
  136. query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '1' AND active = '1'
  137. EOF
  138. cat <<EOF > /opt/postfix/conf/sql/mysql_virtual_sender_acl.cf
  139. user = ${DBUSER}
  140. password = ${DBPASS}
  141. hosts = mysql
  142. dbname = ${DBNAME}
  143. # First select queries domain and alias_domain to determine if domains are active.
  144. query = SELECT goto FROM alias
  145. WHERE address='%s'
  146. AND active='1'
  147. AND (domain IN
  148. (SELECT domain FROM domain
  149. WHERE domain='%d'
  150. AND active='1')
  151. OR domain in (
  152. SELECT alias_domain FROM alias_domain
  153. WHERE alias_domain='%d'
  154. AND active='1'
  155. )
  156. )
  157. UNION
  158. SELECT logged_in_as FROM sender_acl
  159. WHERE send_as='@%d'
  160. OR send_as='%s'
  161. OR send_as IN (
  162. SELECT CONCAT('@',target_domain) FROM alias_domain
  163. WHERE alias_domain = '%d')
  164. OR send_as IN (
  165. SELECT CONCAT('%u','@',target_domain) FROM alias_domain
  166. WHERE alias_domain = '%d')
  167. AND logged_in_as NOT IN (
  168. SELECT goto FROM alias
  169. WHERE address='%s')
  170. UNION
  171. SELECT username FROM mailbox, alias_domain
  172. WHERE alias_domain.alias_domain = '%d'
  173. AND mailbox.username = CONCAT('%u','@',alias_domain.target_domain)
  174. AND mailbox.active ='1'
  175. AND alias_domain.active='1'
  176. EOF
  177. cat <<EOF > /opt/postfix/conf/sql/mysql_virtual_spamalias_maps.cf
  178. user = ${DBUSER}
  179. password = ${DBPASS}
  180. hosts = mysql
  181. dbname = ${DBNAME}
  182. query = SELECT goto FROM spamalias
  183. WHERE address='%s'
  184. AND validity >= UNIX_TIMESTAMP()
  185. EOF
  186. # Reset GPG key permissions
  187. mkdir -p /var/lib/zeyple/keys
  188. chmod 700 /var/lib/zeyple/keys
  189. chown -R 600:600 /var/lib/zeyple/keys
  190. # Fix Postfix permissions
  191. chgrp -R postdrop /var/spool/postfix/public
  192. chgrp -R postdrop /var/spool/postfix/maildrop
  193. postfix set-permissions
  194. # Check Postfix configuration
  195. postconf -c /opt/postfix/conf
  196. if [[ $? != 0 ]]; then
  197. echo "Postfix configuration error, refusing to start."
  198. exit 1
  199. else
  200. postfix -c /opt/postfix/conf start
  201. sleep 126144000
  202. fi