summaryrefslogtreecommitdiff
path: root/tools/email-monitor.tcl
diff options
context:
space:
mode:
Diffstat (limited to 'tools/email-monitor.tcl')
-rwxr-xr-xtools/email-monitor.tcl51
1 files changed, 51 insertions, 0 deletions
diff --git a/tools/email-monitor.tcl b/tools/email-monitor.tcl
new file mode 100755
index 0000000..5af228a
--- /dev/null
+++ b/tools/email-monitor.tcl
@@ -0,0 +1,51 @@
+#!/usr/bin/tcl
+#
+# Monitor the database file named on the command line for
+# incoming email messages. Print the "To:" line of each
+# email on standard output as it is received.
+#
+# It should be relatively easy to modify this scribe to actually
+# deliver the emails to a real email transfer agent such as
+# Postfix.
+#
+# For long-term use, set the polling interval to something
+# greater than the default 100 milliseconds. Polling once
+# every 10 seconds is probably sufficient.
+#
+set POLLING_INTERVAL 100 ;# milliseconds
+
+set dbfile [lindex $argv 0]
+if {[llength $argv]!=1} {
+ puts stderr "Usage: $argv0 DBFILE"
+ exit 1
+}
+package require sqlite3
+puts "SQLite version [sqlite3 -version]"
+sqlite3 db $dbfile
+db timeout 2000
+catch {db eval {PRAGMA journal_mode=WAL}}
+db eval {
+ CREATE TABLE IF NOT EXISTS email(
+ emailid INTEGER PRIMARY KEY,
+ msg TXT
+ );
+}
+while {1} {
+ db transaction immediate {
+ set n 0
+ db eval {SELECT msg FROM email} {
+ set email ???
+ regexp {To: \S*} $msg to
+ puts "$to ([string length $msg] bytes)"
+ incr n
+ }
+ if {$n>0} {
+ db eval {DELETE FROM email}
+ }
+ # Hold the write lock a little longer in order to exercise
+ # the SQLITE_BUSY handling logic on the writing inside of
+ # Fossil. Probably comment-out this line for production use.
+ after 100
+ }
+ after $POLLING_INTERVAL
+}