The next thing which I've wanted for a while are some slimmed
down sample configs. The general scheme that I'm proposing:

        /mail/lib:
                comes with a sample config that allows sending
                mail with minimal configuration. What I've got
                in this patch works with:

                        upasname=o...@eigenstate.org
                        echo 'key proto=pass server=eigenstate.org '\
                             'service=smtp user=ori email=o...@eigensate.org '\
                                 '!password=redacted' > /mnt/factotum/ctl

                I'm reasonably happy with this config.

        /mail/lib/smtp.example

                A minimal smtp config that I'm using on my
                orib.dev domain at the moment. This, I'm less
                confident about; I've scraped together the config
                from /mail/lib, gotten it working, but haven't
                seriously used it in anger. It may be horribly
                misconfigured.

I'm also going to put out a call for more complex configs.

        /mail/lib/smtpd-graylist.example
        /mai/lib/smtpd-mailinglists.example

Other changes in this patch include moving the various
rc script bits to /mail/lib/rc, to make it clearer what
users are expected to configure, and what they shouldn't
need to touch.

diff -r 0281cd6caa8c sys/lib/dist/mail/lib/remotemail
--- a/sys/lib/dist/mail/lib/remotemail  Sat Oct 24 17:24:59 2020 -0700
+++ b/sys/lib/dist/mail/lib/remotemail  Sat Oct 24 18:08:00 2020 -0700
@@ -1,14 +1,21 @@
 #!/bin/rc
-shift
-sender=$1
-shift
-addr=$1
-shift
-fd=`{/bin/upas/aliasmail -f $sender}
-switch($fd){
-case *.*
-       ;
-case *
-       fd=yourdomain.dom
+
+# allow per-user customization
+if(test -x $home/mail/lib/remotemail)
+       exec $home/mail/lib/remotemail
+
+sender=$2
+svcpat='[      ]service=smtp[  ]'
+addrpat='[     ]email='$2'[    ]'
+config=`{grep -e $svcpat -e $addrpat /mnt/factotum/ctl}
+if(~ $#config 0)
+       exit 'no server'
+for(kv in $config){
+       parts=`'='{echo -n $kv}
+       switch($parts(1)){
+       case server;    server=$parts(2)
+       case user;      login=$parts(2)
+       }
 }
-exec /bin/upas/smtp -h $fd $addr $sender $*
+
+exec /bin/upas/smtp -as -u $login $server $addr $sender $*(4-)
diff -r 0281cd6caa8c sys/lib/dist/mail/lib/rewrite
--- a/sys/lib/dist/mail/lib/rewrite     Sat Oct 24 17:24:59 2020 -0700
+++ b/sys/lib/dist/mail/lib/rewrite     Sat Oct 24 18:08:00 2020 -0700
@@ -1,9 +1,14 @@
-# mail rewrite rules, see rewrite(6)
-#
-# see the appropriate example rewrite files
-# your type of mail system:
-#
-# /mail/lib/rewrite.direct - for systems that deliver all mail directly
-# /mail/lib/rewrite.gateway - for systems that route all mail to a gateway
-#                              or mail server for delivery
-#
+# translate local aliases from /mail/lib/namefiles
+\"(.+)\"               translate       "/bin/upas/aliasmail '\1'"
+[^!@.]+                        translate       "/bin/upas/aliasmail '&'"
+
+## If you don't set $upasname, then the email comes from your
+## local user name; translate it to a domain-qualified name.
+## Not needed with the default configuration, which expects
+## $upasname to be set.
+# 
+#local!"(.+)"          alias           \1...@yourdomain.dom
+#local!(.*)            alias           \1...@yourdomain.dom
+
+# send all mail to the gateway or mail server, $smtp,  for delivery
+([^!]*)!(.*)           |               "/mail/lib/qmail '\s' 'net!$smtp'" 
"'\2@\1'"
diff -r 0281cd6caa8c sys/lib/dist/mail/lib/smtp.example/namefiles
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/lib/dist/mail/lib/smtp.example/namefiles      Sat Oct 24 18:08:00 
2020 -0700
@@ -0,0 +1,3 @@
+# files listed here will be consulted for aliases
+
+names.local
diff -r 0281cd6caa8c sys/lib/dist/mail/lib/smtp.example/names.local
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/lib/dist/mail/lib/smtp.example/names.local    Sat Oct 24 18:08:00 
2020 -0700
@@ -0,0 +1,5 @@
+# alias file, listed in /mail/lib/namefiles
+
+# postmaster goes to glenda
+postmaster     glenda
+
diff -r 0281cd6caa8c sys/lib/dist/mail/lib/smtp.example/qmail
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/lib/dist/mail/lib/smtp.example/qmail  Sat Oct 24 18:08:00 2020 -0700
@@ -0,0 +1,6 @@
+#!/bin/rc
+# qmail sender machine user...
+rfork s
+upas/vf | upas/qer /mail/queue mail $* || exit 'qer failed'
+upas/runq -n 10 /mail/queue /mail/lib/remotemail </dev/null >/dev/null >[2=1] &
+exit ''
diff -r 0281cd6caa8c sys/lib/dist/mail/lib/smtp.example/remotemail
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/lib/dist/mail/lib/smtp.example/remotemail     Sat Oct 24 18:08:00 
2020 -0700
@@ -0,0 +1,9 @@
+#!/bin/rc
+
+# program sender addr args...
+sender=$2
+addr=$3
+fd=`{/bin/upas/aliasmail -f $sender}
+if(! ~ $fd *.*)
+       fd=YOURDOMAIN.DOM
+exec /bin/upas/smtp -h $fd $addr $sender $*(4-)
diff -r 0281cd6caa8c sys/lib/dist/mail/lib/smtp.example/rewrite
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/lib/dist/mail/lib/smtp.example/rewrite        Sat Oct 24 18:08:00 
2020 -0700
@@ -0,0 +1,29 @@
+#
+#      sample rewrite file for systems that send and receive mail directly.
+#
+#      by default, the return address points to this system; if you have 
multiple systems
+#      and don't want them all to be mail recipients, set $site to a generic
+#      name (e.g., plan9) or system name in /rc/bin/termrc and /rc/bin/cpurc
+#      and put an MX DNS record in /lib/ndb to point to that system.
+#
+#      replace YOURDOMAIN.DOM in the following rules with your domain name.
+# case conversion for postmaster
+pOsTmAsTeR alias postmaster
+
+# local mail
+\l!(.*) alias \1
+(YOURDOMAIN.COM)!(.*)    alias \2
+[^!@]+ translate "/bin/upas/aliasmail '&'"
+local!(.*) >> /mail/box/\1/mbox
+
+# we can be just as complicated as BSD sendmail...
+# convert source domain address to a chain a@b@c@d...
+@([^@!,]*):([^!@]*)@([^!]*) alias \2@\3@\1
+@([^@!]*),([^!@,]*):([^!@]*)@([^!]*) alias @\1:\3@\4@\2
+
+# convert a chain a@b@c@d... to ...d!c!b!a
+([^@]+)@([^@]+)@(.+) alias \2!\1@\3
+([^@]+)@([^@]+) alias \2!\1
+
+# /mail/lib/remotemail will take care of gating to systems we don’t know
+([^!]*)!(.*) | "/mail/lib/qmail '\\s' 'net!\1'" "'\2'"
diff -r 0281cd6caa8c sys/lib/dist/mail/lib/smtp.example/smtpd.conf
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/lib/dist/mail/lib/smtp.example/smtpd.conf     Sat Oct 24 18:08:00 
2020 -0700
@@ -0,0 +1,22 @@
+#
+#      sample smtpd configuration options for inside connections
+#
+
+#
+#      replace YOURDOMAIN.COM with the name of your domain
+#      replace 10.0.0.0 with the IP address range of your networks
+
+defaultdomain          YOURDOMAIN.COM
+norelay                        on      #disallow relaying
+verifysenderdom                on      #disable dns verification of sender 
domain
+saveblockedmsg         off     #save blocked messages
+
+#
+# if norelay is on, you need to set the
+# networks allowed to relay through 
+# as well as the domains to accept mail for
+#
+
+ournets 144.202.1.203
+ourdomains YOURDOMAIN.COM
+# ourdomains *.fakedom.dom, *.fakedom.rog
diff -r 0281cd6caa8c sys/lib/dist/mail/lib/smtp.example/validateaddress
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/lib/dist/mail/lib/smtp.example/validateaddress        Sat Oct 24 
18:08:00 2020 -0700
@@ -0,0 +1,2 @@
+#!/bin/rc
+mail -x $1 | grep -vs '^unknown user|^Invalid address'
diff -r 0281cd6caa8c sys/lib/dist/mail/lib/smtp.example/validateattachment
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/lib/dist/mail/lib/smtp.example/validateattachment     Sat Oct 24 
18:08:00 2020 -0700
@@ -0,0 +1,64 @@
+#!/bin/rc
+# validateattachment mboxfile
+rfork en
+upastmp=/mail/tmp
+#
+# exit status matching:
+#
+#      *discard* - is really bad, refuse the message 
+#      *accept* - is really good, leave attachment alone
+#      * - rewrite attachment to have .suspect extension
+# 
+
+if(! ~ $#* 1){
+       echo usage: validateattachment mboxfile >[1=2]
+       exit usage
+}
+
+echo validating >[1=2]
+fn save {
+       d=`{date -n}
+       cp body $upastmp/$d.$1
+       cp raw  $upastmp/$d.$1.raw
+       whatis x >$upastmp/$d.$1.file
+}
+fn sigexit {
+       rm -f $upastmp/$d.$1^('' .raw .file)
+}
+
+upas/fs -f $1
+cd /mail/fs/mbox/1
+
+x=`{file body | sed s/body://}
+x=$"x
+switch($x){
+case *Ascii* *text* *'c program'* *'rc executable'* 
+       save accept
+       exit accept
+
+case *'zip archive'*
+       # >[2=1] because sometimes we get zip files we can't parse
+       # but the errors look like
+       # unzip: reading data for philw.doc.scr failed: ...
+       # so we can still catch these.
+       if(unzip -tsf body >[2=1] | grep -si '      |\.(scr|exe|pif|bat|com)$'){
+               echo executables inside zip file!
+               exit discard
+       }
+
+case jpeg 'PNG image' bmp 'GIF image' *'plan 9 image'*
+       save accept
+       exit accept
+
+case *Microsoft* *Office*
+       save wrap
+       exit wrap
+
+case *MSDOS*
+       # no executables
+       echo $x
+       exit discard
+}
+
+save wrap
+exit wrap
diff -r 0281cd6caa8c sys/lib/dist/mail/rc/isspam.rc
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/lib/dist/mail/rc/isspam.rc    Sat Oct 24 18:08:00 2020 -0700
@@ -0,0 +1,36 @@
+#!/bin/rc
+
+if (~ $#USER 0)
+       USER=$user
+cd /mail/box/$USER
+rfork en
+
+TMP=/tmp/spam.$sysname.$pid
+sed '/^$/,$ s/^From / From /' >$TMP.msg
+upas/fs -f $TMP.msg
+{
+       echo '# hash table'
+       upas/msgcat $TMP.msg | upas/msgtok |
+               grep -v '^....................(.*)      ' |
+               sed 's/$/       1/'
+       } >$TMP.tok
+
+x=`{upas/bayes -k _prof.mbox _prof.spam ~ $TMP.tok}
+#echo xx $x xx >>/tmp/spam
+#ls -l _prof.mbox _prof.spam  $TMP.tok>>/tmp/spam
+where=$x(1)
+prob=$x(2)
+echo $where $prob
+*=($x)
+shift 2
+while(! ~ $#* 0){
+       echo '  ' $1 $2
+       shift 2
+}
+rm -f $TMP.tok $TMP.msg
+if (~ $where *spam*){
+       exit ''
+}
+if not {
+       exit 'is ok'
+}
diff -r 0281cd6caa8c sys/lib/dist/mail/rc/msgcat.rc
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/lib/dist/mail/rc/msgcat.rc    Sat Oct 24 18:08:00 2020 -0700
@@ -0,0 +1,49 @@
+#!/bin/rc
+
+rfork ne
+
+if(~ $1 /mail/fs/mbox*){
+       dir=$*
+}
+if not{
+       upas/fs -f $1
+       dir=/mail/fs/mbox/[0-9]*
+}
+
+fn catmsg {
+       t=`{cat type}
+       switch($t){
+       case text/html
+               echo '
+                       ,x/<!--(-?[^\-]|--[^>]|\n)*-->/ c//
+                       ,x/<[^>]+>/d
+                       ,p
+                       u
+                       ,y/<[^>]+>/d
+                       ,p
+               ' | sam -d body |[2] sed '1d;/^\?/d'
+       case text/*
+               cat body
+       case message/*
+               cat body
+       case multipart/alternative
+               if(~ `{cat 1/type} text/plain)
+                       cd 1 && {catmsg; cd ..}
+               if not if (~ `{cat 2/type >[2]/dev/null} text/plain)
+                       cd 2 && {catmsg; cd ..}
+               if not {
+                       for (i in [0-9]*)
+                               cd $i && {catmsg; cd ..}
+               }
+       case *
+               echo $t
+       }
+}
+
+for(i in $dir){
+       cd $i
+       cat unixheader header
+       echo
+       catmsg
+       echo
+}
diff -r 0281cd6caa8c sys/lib/dist/mail/rc/spam.rc
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/lib/dist/mail/rc/spam.rc      Sat Oct 24 18:08:00 2020 -0700
@@ -0,0 +1,18 @@
+#!/bin/rc
+
+rfork en
+TMP=/tmp/spam.$sysname.$pid
+sed '/^$/,$ s/^From / From /' >$TMP.msg
+upas/fs -f $TMP.msg
+{
+       echo '# hash table'
+upas/msgcat $TMP.msg | upas/msgtok |
+       grep -v '^....................(.*)      '|
+               sed 's/$/       1/'
+} >$TMP.tok
+cd /mail/box/$user
+#cp $TMP.tok /tmp/_prof.spam
+upas/addhash -o _prof.mbox _prof.mbox 1 $TMP.tok -1
+upas/addhash -o _prof.spam _prof.spam 1 $TMP.tok 1
+rm -f $TMP.*
+
diff -r 0281cd6caa8c sys/lib/dist/mail/rc/unspam.rc
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/lib/dist/mail/rc/unspam.rc    Sat Oct 24 18:08:00 2020 -0700
@@ -0,0 +1,18 @@
+#!/bin/rc
+
+rfork en
+TMP=/tmp/spam.$sysname.$pid
+sed '/^$/,$ s/^From / From /' >$TMP.msg
+upas/fs -f $TMP.msg
+{
+       echo '# hash table'
+upas/msgcat $TMP.msg | upas/msgtok |
+       grep -v '^....................(.*)      '|
+               sed 's/$/       1/'
+} >$TMP.tok
+cd /mail/box/$user
+#cp $TMP.tok /tmp/_prof.mbox
+upas/addhash -o _prof.mbox _prof.mbox 1 $TMP.tok 1
+upas/addhash -o _prof.spam _prof.spam 1 $TMP.tok -1
+rm -f $TMP.*
+
diff -r 0281cd6caa8c sys/src/cmd/upas/binscripts/isspam.rc
--- a/sys/src/cmd/upas/binscripts/isspam.rc     Sat Oct 24 17:24:59 2020 -0700
+++ b/sys/src/cmd/upas/binscripts/isspam.rc     Sat Oct 24 18:08:00 2020 -0700
@@ -1,2 +1,8 @@
 #!/bin/rc
-exec /mail/lib/isspam.rc $*
+
+# pre-cleanup, these were tossed
+# in /mail/lib: exec them so we
+# don't break working configs.
+if(test -x /mail/lib/isspam.rc)
+       exec /mail/lib/isspam.rc
+exec /mail/rc/isspam.rc $*
diff -r 0281cd6caa8c sys/src/cmd/upas/binscripts/spam.rc
--- a/sys/src/cmd/upas/binscripts/spam.rc       Sat Oct 24 17:24:59 2020 -0700
+++ b/sys/src/cmd/upas/binscripts/spam.rc       Sat Oct 24 18:08:00 2020 -0700
@@ -1,2 +1,2 @@
 #!/bin/rc
-exec /mail/lib/spam.rc $*
+exec /mail/rc/spam.rc $*
diff -r 0281cd6caa8c sys/src/cmd/upas/binscripts/unspam.rc
--- a/sys/src/cmd/upas/binscripts/unspam.rc     Sat Oct 24 17:24:59 2020 -0700
+++ b/sys/src/cmd/upas/binscripts/unspam.rc     Sat Oct 24 18:08:00 2020 -0700
@@ -1,2 +1,8 @@
 #!/bin/rc
-exec /mail/lib/unspam.rc $*
+
+# pre-cleanup, these were tossed
+# in /mail/lib: exec them so we
+# don't break working configs.
+if(test -x /mail/lib/unspam.rc)
+       exec /mail/lib/unspam.rc
+exec /mail/rc/unspam.rc $*


------------------------------------------
9fans: 9fans
Permalink: 
https://9fans.topicbox.com/groups/9fans/T0522feda11c4e3a2-M94d1273b1aade8b038177cd8
Delivery options: https://9fans.topicbox.com/groups/9fans/subscription

Reply via email to