maildroprc 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. # Global maildrop filter file
  2. # Uncomment this line to make maildrop default to ~/Maildir for
  3. # delivery- this is where courier-imap (amongst others) will look.
  4. #DEFAULT="$HOME/Maildir"
  5. SHELL="/bin/bash"
  6. SENDMAIL="/opt/cropswap/sendmail.sh"
  7. SUBUNSUB="/opt/cropswap/subunsub.sh"
  8. DEBUGMAIL="/opt/cropswap/debug.sh"
  9. MAILBOT="/usr/bin/mailbot"
  10. SIGNUPRESP="/opt/cropswap/signup.eml"
  11. SUBSCRIBERESP="/opt/cropswap/subunsub.eml"
  12. #
  13. # Uncomment to debug
  14. #SENDMAIL="/opt/cropswap/debug.sh"
  15. #MAILBOT="/opt/cropswap/debug.sh"
  16. #
  17. POSTMASTER="postmaster@localhost"
  18. POSTMASTERREGEX=escape($POSTMASTER)
  19. # bi-directional group
  20. # From subscribed member -> other subscribed members
  21. MEMBERGROUP="cropswap-members@shandan.one"
  22. MEMBERGROUPREGEX=escape($MEMBERGROUP)
  23. # uni-directional group
  24. # From anyone -> organizers
  25. # From organizers -> subscribed members
  26. ORGANIZERGROUP="cropswap@shandan.one"
  27. ORGANIZERGROUPREGEX=escape($ORGANIZERGROUP)
  28. SUFFIX=0
  29. FORWARD=0
  30. SUBSCRIBE=""
  31. CONTINUE=0
  32. TOPOSTMASTER=0
  33. TOORGANIZER=0
  34. TOMEMBER=0
  35. TO=""
  36. UNHANDLED=5
  37. BADREQUEST=4
  38. UNREGISTERED=3
  39. UNSUBSCRIBED=2
  40. FATAL=1
  41. foreach /^(To|Cc):.*/
  42. {
  43. ADDR=getaddr($MATCH)
  44. foreach (tolower $ADDR) =~ /^$POSTMASTER$/
  45. {
  46. if (/^X\-GROUP:\s*$ORGANIZERGROUPREGEX\s*$/)
  47. {
  48. TOORGANIZER=1
  49. }
  50. if (/^X\-GROUP:\s*$MEMBERGROUPREGEX\s*$/)
  51. {
  52. TOORGANIZER=1
  53. }
  54. CONTINUE=1
  55. TOPOSTMASTER=1
  56. }
  57. foreach (tolower $ADDR) =~ /^$ORGANIZERGROUPREGEX$/
  58. {
  59. TOORGANIZER=1
  60. CONTINUE=1
  61. }
  62. foreach (tolower $ADDR) =~ /^$MEMBERGROUPREGEX$/
  63. {
  64. TOMEMBER=1
  65. CONTINUE=1
  66. }
  67. foreach /^(To|Cc):\s+(.*)\s+\<$ORGANIZERGROUPREGEX\>$/
  68. {
  69. TOALIAS=$MATCH2
  70. }
  71. foreach /^(To|Cc):\s+(.*)\s+\<$MEMBERGROUPREGEX\>$/
  72. {
  73. TOALIAS=$MATCH2
  74. }
  75. }
  76. if (!$CONTINUE)
  77. {
  78. EXITCODE=$UNHANDLED
  79. exit
  80. }
  81. if ($TOMEMBER && $TOORGANIZER)
  82. {
  83. cc "|$DEBUGMAIL multiplemembergroupset"
  84. EXITCODE=$BADREQUEST
  85. exit
  86. }
  87. if ($TOMEMBER)
  88. {
  89. MAILGROUP=$MEMBERGROUP
  90. SUBJECT="Crop Swap Member"
  91. }
  92. elsif ($TOORGANIZER)
  93. {
  94. MAILGROUP=$ORGANIZERGROUP
  95. SUBJECT="Crop Swap Notice"
  96. }
  97. else
  98. {
  99. cc "|$DEBUGMAIL nomembergroupset"
  100. EXITCODE=$FATAL
  101. exit
  102. }
  103. LISTDIR="/var/mail/maildrop/$MAILGROUP"
  104. MLIST="$LISTDIR/mlist"
  105. SLIST="$LISTDIR/slist"
  106. if ($TOPOSTMASTER)
  107. {
  108. if (/^Subject:\s*\[SIGNUP\]\s*$/)
  109. {
  110. if (/^X-MEMBER-ALIAS:\s*(.*)\s*$/)
  111. {
  112. gdbmopen($MLIST, "W")
  113. ALIAS=$MATCH1
  114. KEY=$ALIAS
  115. EXISTS=gdbmfetch($KEY)
  116. while ($EXISTS ne "" && $EXISTS ne tolower($FROM))
  117. {
  118. SUFFIX=($SUFFIX + 1)
  119. KEY="$ALIAS $SUFFIX"
  120. EXISTS=gdbmfetch($KEY)
  121. }
  122. if (gdbmstore(tolower($FROM), $KEY) == 0 && gdbmstore($KEY, tolower($FROM)) == 0)
  123. {
  124. gdbmclose
  125. to "|$MAILBOT -N -t $SIGNUPRESP -A 'From: $MAILGROUP' -f$FROM /usr/bin/sendmail $FROM"
  126. }
  127. else
  128. {
  129. gdbmclose
  130. EXITCODE=$FATAL
  131. exit
  132. }
  133. }
  134. EXITCODE=$BADREQUEST
  135. # No response to unregistered users
  136. exit
  137. }
  138. EXITCODE=$UNHANDLED
  139. # No response to unregistered users
  140. exit
  141. }
  142. gdbmopen($MLIST, "R")
  143. ALIAS=gdbmfetch(tolower($FROM))
  144. if ($ALIAS eq "")
  145. {
  146. gdbmclose
  147. if ($TOORGANIZER)
  148. {
  149. #
  150. # TODO: test this works at all
  151. FROM=$FROM
  152. REPLYTO=$FROM
  153. SLIST="$LISTDIR/alist"
  154. to "!"
  155. }
  156. EXITCODE=$UNREGISTERED
  157. exit
  158. }
  159. gdbmclose
  160. #
  161. # REGISTERED USERS ONLY
  162. #
  163. if (/^Subject:\s*\[(SUBSCRIBE|UNSUBSCRIBE)\]\s*$/)
  164. {
  165. SUBSCRIBE=$MATCH1
  166. }
  167. if ($SUBSCRIBE ne "")
  168. {
  169. gdbmopen($SLIST, "W")
  170. if (gdbmstore(tolower($FROM), $SUBSCRIBE) == 0)
  171. {
  172. gdbmclose
  173. system "$SUBUNSUB '$SUBSCRIBE' '$ALIAS' '$FROM'"
  174. to "|$MAILBOT -N -t $SUBSCRIBERESP -A 'From: $MAILGROUP' -f$FROM /usr/sbin/sendmail $FROM"
  175. }
  176. else
  177. {
  178. gdbmclose
  179. EXITCODE=$FATAL
  180. exit
  181. }
  182. }
  183. gdbmopen($SLIST, "R")
  184. FORWARD=(gdbmfetch(tolower($FROM)) eq "SUBSCRIBE")
  185. gdbmclose
  186. if (!$FORWARD)
  187. {
  188. EXITCODE=$UNSUBSCRIBED
  189. exit
  190. }
  191. #
  192. # SUBSCRIBED USERS
  193. #
  194. NOFORWARD=$FROM
  195. if ($TOMEMBER)
  196. {
  197. FROM=$ALIAS
  198. gdbmopen($MLIST, "R")
  199. TO=gdbmfetch($TOALIAS)
  200. gdbmclose
  201. to "!"
  202. }
  203. MLIST="$LISTDIR/alist"
  204. gdbmopen($MLIST, "R")
  205. ORGANIZER=gdbmfetch(tolower($FROM))
  206. gdbmclose
  207. if ($ORGANIZER eq "")
  208. {
  209. SLIST="$LISTDIR/alist"
  210. to "!"
  211. }
  212. #
  213. # ORGANIZERS ONLY
  214. #
  215. FROM=$ORGANIZER
  216. MLIST="$LISTDIR/mlist"
  217. gdbmopen($MLIST, "R")
  218. TO=gdbmfetch($TOALIAS)
  219. gdbmclose
  220. to "!"