2
0

postfix.sh 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  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 json_extract(`attributes`, '$.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 json_extract(`attributes`, '$.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_recipient_canonical_maps.cf
  137. user = ${DBUSER}
  138. password = ${DBPASS}
  139. hosts = mysql
  140. dbname = ${DBNAME}
  141. query = SELECT new_dest FROM recipient_maps
  142. WHERE old_dest='%s'
  143. AND active='1';
  144. EOF
  145. cat <<EOF > /opt/postfix/conf/sql/mysql_virtual_domains_maps.cf
  146. user = ${DBUSER}
  147. password = ${DBPASS}
  148. hosts = mysql
  149. dbname = ${DBNAME}
  150. query = SELECT alias_domain from alias_domain WHERE alias_domain='%s' AND active='1'
  151. UNION
  152. SELECT domain FROM domain
  153. WHERE domain='%s'
  154. AND active = '1'
  155. AND backupmx = '0'
  156. EOF
  157. cat <<EOF > /opt/postfix/conf/sql/mysql_virtual_mailbox_maps.cf
  158. user = ${DBUSER}
  159. password = ${DBPASS}
  160. hosts = mysql
  161. dbname = ${DBNAME}
  162. query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'
  163. EOF
  164. cat <<EOF > /opt/postfix/conf/sql/mysql_virtual_relay_domain_maps.cf
  165. user = ${DBUSER}
  166. password = ${DBPASS}
  167. hosts = mysql
  168. dbname = ${DBNAME}
  169. query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '1' AND active = '1'
  170. EOF
  171. cat <<EOF > /opt/postfix/conf/sql/mysql_virtual_sender_acl.cf
  172. user = ${DBUSER}
  173. password = ${DBPASS}
  174. hosts = mysql
  175. dbname = ${DBNAME}
  176. # First select queries domain and alias_domain to determine if domains are active.
  177. query = SELECT goto FROM alias
  178. WHERE address='%s'
  179. AND active='1'
  180. AND (domain IN
  181. (SELECT domain FROM domain
  182. WHERE domain='%d'
  183. AND active='1')
  184. OR domain in (
  185. SELECT alias_domain FROM alias_domain
  186. WHERE alias_domain='%d'
  187. AND active='1'
  188. )
  189. )
  190. UNION
  191. SELECT logged_in_as FROM sender_acl
  192. WHERE send_as='@%d'
  193. OR send_as='%s'
  194. OR send_as IN (
  195. SELECT CONCAT('@',target_domain) FROM alias_domain
  196. WHERE alias_domain = '%d')
  197. OR send_as IN (
  198. SELECT CONCAT('%u','@',target_domain) FROM alias_domain
  199. WHERE alias_domain = '%d')
  200. AND logged_in_as NOT IN (
  201. SELECT goto FROM alias
  202. WHERE address='%s')
  203. UNION
  204. SELECT username FROM mailbox, alias_domain
  205. WHERE alias_domain.alias_domain = '%d'
  206. AND mailbox.username = CONCAT('%u','@',alias_domain.target_domain)
  207. AND mailbox.active ='1'
  208. AND alias_domain.active='1'
  209. EOF
  210. cat <<EOF > /opt/postfix/conf/sql/mysql_virtual_spamalias_maps.cf
  211. user = ${DBUSER}
  212. password = ${DBPASS}
  213. hosts = mysql
  214. dbname = ${DBNAME}
  215. query = SELECT goto FROM spamalias
  216. WHERE address='%s'
  217. AND validity >= UNIX_TIMESTAMP()
  218. EOF
  219. # Reset GPG key permissions
  220. mkdir -p /var/lib/zeyple/keys
  221. chmod 700 /var/lib/zeyple/keys
  222. chown -R 600:600 /var/lib/zeyple/keys
  223. # Fix Postfix permissions
  224. chgrp -R postdrop /var/spool/postfix/public
  225. chgrp -R postdrop /var/spool/postfix/maildrop
  226. postfix set-permissions
  227. # Check Postfix configuration
  228. postconf -c /opt/postfix/conf
  229. if [[ $? != 0 ]]; then
  230. echo "Postfix configuration error, refusing to start."
  231. exit 1
  232. else
  233. postfix -c /opt/postfix/conf start
  234. sleep 126144000
  235. fi