summaryrefslogtreecommitdiff
path: root/tools/fake-smtpd.tcl
diff options
context:
space:
mode:
Diffstat (limited to 'tools/fake-smtpd.tcl')
-rw-r--r--tools/fake-smtpd.tcl84
1 files changed, 84 insertions, 0 deletions
diff --git a/tools/fake-smtpd.tcl b/tools/fake-smtpd.tcl
new file mode 100644
index 0000000..e29fd3c
--- /dev/null
+++ b/tools/fake-smtpd.tcl
@@ -0,0 +1,84 @@
+#!/usr/bin/tclsh
+#
+# This script is a testing aid for working on the Relay notification method
+# in Fossil.
+#
+# This script listens for connections on port 25 or probably some other TCP
+# port specified by the "--port N" option. It pretend to be an SMTP server,
+# though it does not actually relay any email. Instead, it just prints the
+# SMTP conversation on stdout.
+#
+# If the "--max N" option is used, then the fake SMTP server shuts down
+# with an error after receiving N messages from the client. This can be
+# used to test retry capabilities in the client.
+#
+# Suggested Test Procedure For Fossil Relay Notifications
+#
+# 1. Bring up "fossil ui"
+# 2. Configure notification for relay to localhost:8025
+# 3. Start this script in a separate window. Something like:
+# tclsh fake-smtpd.tcl -port 8025 -max 100
+# 4. Send test messages using Fossil
+#
+proc conn_puts {chan txt} {
+ puts "S: $txt"
+ puts $chan $txt
+ flush $chan
+}
+set mxMsg 100000000
+proc connection {chan ip port} {
+ global mxMsg
+ set nMsg 0
+ puts "*** begin connection from $ip:$port ***"
+ conn_puts $chan "220 localhost fake-SMTPD"
+ set inData 0
+ while {1} {
+ set line [string trimright [gets $chan]]
+ if {$line eq ""} {
+ if {[eof $chan]} break
+ }
+ puts "C: $line"
+ incr nMsg
+ if {$inData} {
+ if {$line eq "."} {
+ set inData 0
+ conn_puts $chan "250 Ok"
+ }
+ } elseif {$nMsg>$mxMsg} {
+ conn_puts $chan "999 I'm done!"
+ break
+ } elseif {[string match "HELO *" $line]} {
+ conn_puts $chan "250 Ok"
+ } elseif {[string match "EHLO *" $line]} {
+ conn_puts $chan "250-SIZE 100000"
+ conn_puts $chan "250 HELP"
+ } elseif {[string match "DATA*" $line]} {
+ conn_puts $chan "354 End data with <CR><LF>.<CR><LF>"
+ set inData 1
+ } elseif {[string match "QUIT*" $line]} {
+ conn_puts $chan "221 Bye"
+ break
+ } else {
+ conn_puts $chan "250 Ok"
+ }
+ }
+ puts "*** connection closed ($nMsg messages) ***"
+ close $chan
+}
+set port 25
+set argc [llength $argv]
+for {set i 0} {$i<$argc-1} {incr i} {
+ set arg [lindex $argv $i]
+ if {$arg eq "-port" || $arg eq "--port"} {
+ incr i
+ set port [lindex $argv $i]
+ }
+ if {$arg eq "-max" || $arg eq "--max"} {
+ incr i
+ set mxMsg [lindex $argv $i]
+ }
+}
+puts "listening on localhost:$port"
+socket -server connection $port
+set forever 0
+vwait forever