/*

Bibliothek zum Versenden von Mails aus der tdbengine heraus
läuft nur unter LinuxFreeBSD mit installiertem sendmail
http-User muss Shell haben und Ausführungsrecht für sendmail.
Als Mail-Host wird der Name aus der Environment-Variablen SERVER_NAME
verwendet, kann aber durch Überschreiben der Variablen the_host
geändert werden.

Logfile wird unter binmail.log geführt

Exportiert werden folgende Prozeduren:

MailRamText(receiver,subject,from : STRING)
  receiver : EMail-adresse des Empfängers, es können auch mehrere Empfänger -
             durch Leerzeichen getrennt - angegeben werden.
  subject  : Betreff
  from     : Absenderadresse (Domain sollte mit realem Domainnamen übereinstimmen)

MailFile(file,receiver,subject,from : STRING)
  file    : Textdatei mit Mailinhalt
  subject  : Betreff
  from     : Absenderadresse (Domain sollte mit realem Domainnamen übereinstimmen)

 Achtung! file oder ramtext müssen im ANSI-Format sein

Erweiterung:

Sowohl MailFile als auch MailRamText können Mails in ein Spool-Verzeichnis schreiben.
Dieses Verzeichnis wird als globale Variable spool_dir defaultmäßig auf
"hometdbenginespoolmailmails" gesetzt, kann aber jederzeit geändert werden.
Wird die Variable do_spool auf 1 gesetzt, schreibt das Modul die Mails in's
Spoolverzeichnis und macht sonst nichts. In diesem Fall sollte ein Mailer-Dämon
in regelmäßigen Abständen diese Mails versenden.

Wichtiger Hinweis:

Falls die Spool-Variante verwendet wird, geben die exportierten Funktionen
alle bis zum Aufruf gültige Semaphoren frei und richten eigene ein.
Deshalb sollte hier der Mailversand ausserhalb von Transaktionen stattfinden.

*/

VARDEF mail_id, the_host : STRING

VAR do_spool : INTEGER = 0
VAR spool_dir : STRING = '/home/tdbengine/spoolmail/mails'

PROCEDURE spool_mail
VAR t, n, fc : INTEGER
VAR fn, sema : STRING
  endsema
  sema:='mails.lck'
  IF NOT waitsema(sema,1000) THEN cgiwriteln(sema+': sema failed...') END
  IF isfile(fn:=spool_dir+'/nextmail') THEN
    t:=reset(fn); n:=val(readln(t)); close(t);
  END
  endsema
  t:=rewrite(fn); writeln(t,str(n++)); close(t)
  fn:=spool_dir+'/'+str(n)+'.msg'
  fc:=copyfile(mail_id,fn)
  // cgiwriteln('fc = '+str(fc))
ENDPROC

PROCEDURE Mail_File(file,receiver,subject,sender,host : STRING)
VAR t,f : INTEGER
  IF receiver='' THEN
    t:=tappend('bin/mail.log');
    writeln(t,receiver+': '+sender+', '+oemtoansi(subject))
    close(t)
    RETURN
  END
  IF mail_id='' THEN mail_id:='mail.temp_'+str(random(10000))+'.'+str(random(10000)) END
  t:=rewrite(mail_id)
  writeln(t,'From: '+sender)
  writeln(t,'To: '+receiver)
  writeln(t,'Subject: '+oemtoansi(subject))
  writeln(t,'MIME-Version: 1.0')
  writeln(t,'Content-Type: text/plain;')
  writeln(t,'')
  f:=reset(file);
  WHILE NOT EOT(f) DO write(t,read(f)) END
  close(f); close(t);
  IF do_spool
  THEN spool_mail
  ELSE CGIExec('sendmail -pSMTP:'+host+' -f '+sender+' '+receiver+' < '+mail_id+' >> /home/tdbengine/bin/mail.log')
  END
  DelFile(mail_id)
ENDPROC

PROCEDURE MailRamtext(receiver, subject, sender : STRING)
  IF the_host='' THEN the_host:=getenv('SERVER_NAME') END
  Mail_File('ramtext',receiver,subject,sender,the_host)
ENDPROC

PROCEDURE MailRamText(receiver, subject, sender : STRING)
  MailRamtext(receiver,subject,sender)
ENDPROC

PROCEDURE mailramtext(receiver, subject, sender : STRING)
  MailRamtext(receiver,subject,sender)
ENDPROC

PROCEDURE MailFile(file, receiver, subject, sender : STRING) : REAL
  IF the_host='' THEN the_host:=getenv('SERVER_NAME') END
  Mail_File(file,receiver,subject,sender,the_host)
  RETURN 1
ENDPROC