postfix.sh 6.5 KB

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