postfix.sh 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  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_recipient_bcc_maps.cf
  113. user = ${DBUSER}
  114. password = ${DBPASS}
  115. hosts = mysql
  116. dbname = ${DBNAME}
  117. query = SELECT bcc_dest FROM bcc_maps
  118. WHERE local_dest='%s'
  119. AND type='rcpt'
  120. AND active='1';
  121. EOF
  122. cat <<EOF > /opt/postfix/conf/sql/mysql_sender_bcc_maps.cf
  123. user = ${DBUSER}
  124. password = ${DBPASS}
  125. hosts = mysql
  126. dbname = ${DBNAME}
  127. query = SELECT bcc_dest FROM bcc_maps
  128. WHERE local_dest='%s'
  129. AND type='sender'
  130. AND active='1';
  131. EOF
  132. cat <<EOF > /opt/postfix/conf/sql/mysql_virtual_domains_maps.cf
  133. user = ${DBUSER}
  134. password = ${DBPASS}
  135. hosts = mysql
  136. dbname = ${DBNAME}
  137. query = SELECT alias_domain from alias_domain WHERE alias_domain='%s' AND active='1'
  138. UNION
  139. SELECT domain FROM domain
  140. WHERE domain='%s'
  141. AND active = '1'
  142. AND backupmx = '0'
  143. EOF
  144. cat <<EOF > /opt/postfix/conf/sql/mysql_virtual_mailbox_maps.cf
  145. user = ${DBUSER}
  146. password = ${DBPASS}
  147. hosts = mysql
  148. dbname = ${DBNAME}
  149. query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'
  150. EOF
  151. cat <<EOF > /opt/postfix/conf/sql/mysql_virtual_relay_domain_maps.cf
  152. user = ${DBUSER}
  153. password = ${DBPASS}
  154. hosts = mysql
  155. dbname = ${DBNAME}
  156. query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '1' AND active = '1'
  157. EOF
  158. cat <<EOF > /opt/postfix/conf/sql/mysql_virtual_sender_acl.cf
  159. user = ${DBUSER}
  160. password = ${DBPASS}
  161. hosts = mysql
  162. dbname = ${DBNAME}
  163. # First select queries domain and alias_domain to determine if domains are active.
  164. query = SELECT goto FROM alias
  165. WHERE address='%s'
  166. AND active='1'
  167. AND (domain IN
  168. (SELECT domain FROM domain
  169. WHERE domain='%d'
  170. AND active='1')
  171. OR domain in (
  172. SELECT alias_domain FROM alias_domain
  173. WHERE alias_domain='%d'
  174. AND active='1'
  175. )
  176. )
  177. UNION
  178. SELECT logged_in_as FROM sender_acl
  179. WHERE send_as='@%d'
  180. OR send_as='%s'
  181. OR send_as IN (
  182. SELECT CONCAT('@',target_domain) FROM alias_domain
  183. WHERE alias_domain = '%d')
  184. OR send_as IN (
  185. SELECT CONCAT('%u','@',target_domain) FROM alias_domain
  186. WHERE alias_domain = '%d')
  187. AND logged_in_as NOT IN (
  188. SELECT goto FROM alias
  189. WHERE address='%s')
  190. UNION
  191. SELECT username FROM mailbox, alias_domain
  192. WHERE alias_domain.alias_domain = '%d'
  193. AND mailbox.username = CONCAT('%u','@',alias_domain.target_domain)
  194. AND mailbox.active ='1'
  195. AND alias_domain.active='1'
  196. EOF
  197. cat <<EOF > /opt/postfix/conf/sql/mysql_virtual_spamalias_maps.cf
  198. user = ${DBUSER}
  199. password = ${DBPASS}
  200. hosts = mysql
  201. dbname = ${DBNAME}
  202. query = SELECT goto FROM spamalias
  203. WHERE address='%s'
  204. AND validity >= UNIX_TIMESTAMP()
  205. EOF
  206. # Reset GPG key permissions
  207. mkdir -p /var/lib/zeyple/keys
  208. chmod 700 /var/lib/zeyple/keys
  209. chown -R 600:600 /var/lib/zeyple/keys
  210. # Fix Postfix permissions
  211. chgrp -R postdrop /var/spool/postfix/public
  212. chgrp -R postdrop /var/spool/postfix/maildrop
  213. postfix set-permissions
  214. # Check Postfix configuration
  215. postconf -c /opt/postfix/conf
  216. if [[ $? != 0 ]]; then
  217. echo "Postfix configuration error, refusing to start."
  218. exit 1
  219. else
  220. postfix -c /opt/postfix/conf start
  221. sleep 126144000
  222. fi