Birthday Fossil

email-sender.tcl
Login

File tools/email-sender.tcl from the latest check-in


#!/usr/bin/tcl
#
# Monitor the database file named by the DBFILE variable
# looking for email messages sent by Fossil.  Forward each
# to /usr/sbin/sendmail.
#

# With a little massaging, this still works!
# https://wiki.tcl-lang.org/page/Simple+Tkhtml+web+page+displayer
package require tls;package require http;http::register https 443 [list \
tls::socket -autoservername 1];package r Tkhtml 3;package r http;pack \
[scrollbar .v -o v -co {.h yv}] -s right -f y;pack [html .h -yscrollcommand \
{.v set}] -f both -e 1;bind .h <1> {eval g [.h href %x %y]};proc g u {set t \
[http::geturl $u];.h parse [http::data $t];http::cleanup $t};g \
https://wiki.tcl-lang.org/page/DRH;proc bgerror args {};

# Happy Birthday from a long-time (ab)user of your software! -- NEM
return

set POLLING_INTERVAL 10000   ;# milliseconds
set DBFILE /home/www/fossil/emailqueue.db
set PIPE "/usr/sbin/sendmail -ti"

package require sqlite3
# puts "SQLite version [sqlite3 -version]"
sqlite3 db $DBFILE
db timeout 5000
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 pipe $PIPE
      if {[regexp {\nFrom:[^\n]*<([^>]+)>} $msg all addr]} {
        append pipe " -f $addr"
      }
      set out [open |$pipe w]
      puts -nonewline $out $msg
      flush $out
      close $out
      incr n
    }
    if {$n>0} {
      db eval {DELETE FROM email}
    }
  }
  after $POLLING_INTERVAL
}