Patch title: Release 90 bulk changes
Abstract:
File: /protocol/smtp/mail.page
Key:
    Removed line
    Added line
   
module "/pliant/language/unsafe.pli"
module "/pliant/language/unsafe.pli"
module "/pliant/language/stream.pli"
module "/pliant/language/context.pli"
module "/pliant/admin/md5.pli"
module "/pliant/admin/file.pli"
module "/pliant/fullpliant/this_computer.pli"
module "/pliant/fullpliant/password.pli"
module "mail.pli"


para
  note "mail system global settings for this computer"
    read_only not allowed:"administrator"
    title "This computer mails settings"
    header "General settings"
      table columns 3 border 0
        cell [SMTP service:]
        cell
          var Str smtp := this_computer "pliant" "mail" "smt
          select "" smtp
            option "No" "false"
            option "Yes" "true"
        cell [Should we run the SMTP service on this server 
        cell [POP3 service:]
        cell
          var Str pop3 := this_computer "pliant" "mail" "pop
          select "" pop3
            option "No" "false"
            option "Yes" "true"
        cell [Should we run the POP3 service on this server 
        cell [Mailboxes redirect daemon:]
        cell
          var Str redirect := this_computer "pliant" "mail" 
          select "" redirect
            option "No" "false"
            option "Yes" "true"
        cell [Should we run the mailboxes redirection daemon
        cell [Mailboxes path:]
        cell
          var Str path := this_computer "pliant" "mail" "pat
          if path=""
            path := "data:/pliant/mail/"
          input "" path length 30 noeol
        cell
          [Where the mailboxes are stored on this computer.]
          [Keep in mind that a Pliant path starting with] ; 
          [Futhermore, a Pliant path must end with a] ; fixe
    header "SMTP service"
      table columns 3 border 0
        cell [Name:]
        cell
          var Str name := this_computer "pliant" "mail" "smt
          input "" name length 20 noeol
        cell
          [The name this computer will give to others when t
          [If blank,] ; fixed (text " "+computer_fullname+" 
        cell [Log file:]
        cell
          var Str log := this_computer "pliant" "mail" "smtp
          input "" log length 30 noeol
        cell [If not empty, all dialogs with SMTP clients co
    header "Forwarding messages"
      table columns 3 border 0
        cell [Next server:]
        cell
          var Str route := this_computer "pliant" "mail" "fo
          input "" route length 20 noeol
        cell [If set, all mails will be forwarded to the spe
        cell [ISP SMTP server:]
        cell
          var Str isp := this_computer "pliant" "mail" "forw
          input "" isp length 20 noeol
        cell [If set, a web mail user will be abble to force
        cell [Threads:]
        cell
          var Str threads := this_computer "pliant" "mail" "
          input "" threads length 3 noeol
        cell [How many mails should we try to forward at onc
        cell [Sleep:]
        cell
          var Str sleep := this_computer "pliant" "mail" "fo
          input "" sleep length 4 noeol
        cell [When we tryed to forward all messages, how man
    header "Redirecting mailboxes"
      table columns 3 border 0
        cell [Threads:]
        cell
          var Str r_threads := this_computer "pliant" "mail"
          input "" r_threads length 3 noeol
        cell [How many mailboxes should we try to redirect a
        cell [Sleep:]
        cell
          var Str r_sleep := this_computer "pliant" "mail" "
          input "" r_sleep length 4 noeol
        cell [When we tryed to redirect all mailboxes, how m
    if allowed:"administrator"
      button "Update"
        this_computer "pliant" "mail" "smtp_service" := smtp
        this_computer "pliant" "mail" "pop3_service" := pop3
        this_computer "pliant" "mail" "redirect_service" := 
        this_computer "pliant" "mail" "path" := path
        this_computer "pliant" "mail" "smtp_name" := name
        this_computer "pliant" "mail" "smtp_log" := log
        this_computer "pliant" "mail" "forward_route" := rou
        this_computer "pliant" "mail" "forward_isp" := isp
        this_computer "pliant" "mail" "forward_threads" := t
        this_computer "pliant" "mail" "forward_sleep" := sle
        this_computer "pliant" "mail" "redirect_threads" := 
        this_computer "pliant" "mail" "redirect_sleep" := r_
        goto_backward
module "/pliant/language/context.pli"
module "/pliant/admin/md5.pli"
module "/pliant/admin/file.pli"
module "/pliant/fullpliant/this_computer.pli"
module "/pliant/fullpliant/password.pli"
module "mail.pli"


para
  note "mail system global settings for this computer"
    read_only not allowed:"administrator"
    title "This computer mails settings"
    header "General settings"
      table columns 3 border 0
        cell [SMTP service:]
        cell
          var Str smtp := this_computer "pliant" "mail" "smt
          select "" smtp
            option "No" "false"
            option "Yes" "true"
        cell [Should we run the SMTP service on this server 
        cell [POP3 service:]
        cell
          var Str pop3 := this_computer "pliant" "mail" "pop
          select "" pop3
            option "No" "false"
            option "Yes" "true"
        cell [Should we run the POP3 service on this server 
        cell [Mailboxes redirect daemon:]
        cell
          var Str redirect := this_computer "pliant" "mail" 
          select "" redirect
            option "No" "false"
            option "Yes" "true"
        cell [Should we run the mailboxes redirection daemon
        cell [Mailboxes path:]
        cell
          var Str path := this_computer "pliant" "mail" "pat
          if path=""
            path := "data:/pliant/mail/"
          input "" path length 30 noeol
        cell
          [Where the mailboxes are stored on this computer.]
          [Keep in mind that a Pliant path starting with] ; 
          [Futhermore, a Pliant path must end with a] ; fixe
    header "SMTP service"
      table columns 3 border 0
        cell [Name:]
        cell
          var Str name := this_computer "pliant" "mail" "smt
          input "" name length 20 noeol
        cell
          [The name this computer will give to others when t
          [If blank,] ; fixed (text " "+computer_fullname+" 
        cell [Log file:]
        cell
          var Str log := this_computer "pliant" "mail" "smtp
          input "" log length 30 noeol
        cell [If not empty, all dialogs with SMTP clients co
    header "Forwarding messages"
      table columns 3 border 0
        cell [Next server:]
        cell
          var Str route := this_computer "pliant" "mail" "fo
          input "" route length 20 noeol
        cell [If set, all mails will be forwarded to the spe
        cell [ISP SMTP server:]
        cell
          var Str isp := this_computer "pliant" "mail" "forw
          input "" isp length 20 noeol
        cell [If set, a web mail user will be abble to force
        cell [Threads:]
        cell
          var Str threads := this_computer "pliant" "mail" "
          input "" threads length 3 noeol
        cell [How many mails should we try to forward at onc
        cell [Sleep:]
        cell
          var Str sleep := this_computer "pliant" "mail" "fo
          input "" sleep length 4 noeol
        cell [When we tryed to forward all messages, how man
    header "Redirecting mailboxes"
      table columns 3 border 0
        cell [Threads:]
        cell
          var Str r_threads := this_computer "pliant" "mail"
          input "" r_threads length 3 noeol
        cell [How many mailboxes should we try to redirect a
        cell [Sleep:]
        cell
          var Str r_sleep := this_computer "pliant" "mail" "
          input "" r_sleep length 4 noeol
        cell [When we tryed to redirect all mailboxes, how m
    if allowed:"administrator"
      button "Update"
        this_computer "pliant" "mail" "smtp_service" := smtp
        this_computer "pliant" "mail" "pop3_service" := pop3
        this_computer "pliant" "mail" "redirect_service" := 
        this_computer "pliant" "mail" "path" := path
        this_computer "pliant" "mail" "smtp_name" := name
        this_computer "pliant" "mail" "smtp_log" := log
        this_computer "pliant" "mail" "forward_route" := rou
        this_computer "pliant" "mail" "forward_isp" := isp
        this_computer "pliant" "mail" "forward_threads" := t
        this_computer "pliant" "mail" "forward_sleep" := sle
        this_computer "pliant" "mail" "redirect_threads" := 
        this_computer "pliant" "mail" "redirect_sleep" := r_
        goto_backward
  eol
  if allowed:"administrator"
    page note "mails cleanup"
      var Int days := 365 ; var Int kb := 8192 ; var Bool spams := false
      title "Mails cleanup"
      [Remove mails that are] ; eol
      input "more than " days length 4 noeol ; [ days old] ; eol
      input "and more than " kb noeol length 5 ; [ KB big.] ; eol
      select "Also remove all spams that are older than selected date: " spams
        option "no" "false"
        option "yes" "true"
      var DateTime now := datetime
      page button "Run an intitial study"
        var Int drop_count := 0 ; var Intn drop_bytes := 0
        var Int keep_count := 0 ; var Intn keep_bytes := 0
        each m mailbox
          for (var Int lap) 0 1
            var Array:FileInfo files := file_list (shunt lap=0 m:in_path m:archive_path) standard+recursive
            for (var Int i) 0 files:size-1
              if now:seconds-files:i:datetime:seconds>days*86400 and (files:i:size>kb*1024n or spams and { (var Stream s) open files:i:name in+safe ; var CBool spam := s:readline="spam" ; s close ; spam })
                drop_count += 1 ; drop_bytes += files:i:size
              else
                keep_count += 1 ; keep_bytes += files:i:size
        title "Mails cleanup initial study"
        table columns 3
          cell void ; cell header [Count] ; cell header [Space]
          cell header [Drop] ; cell (text string:drop_count) ; cell (text (string drop_bytes\2^20)+" MB")
          cell header [Keep] ; cell (text string:keep_count) ; cell (text (string keep_bytes\2^20)+" MB")
        button "Do delete selected mails" noeol
          each m mailbox
            for (var Int lap2) 0 1
              var Array:FileInfo files2 := file_list (shunt lap2=0 m:in_path m:archive_path) standard+recursive
              for (var Int i) 0 files2:size-1
                if now:seconds-files2:i:datetime:seconds>days*86400 and (files2:i:size>kb*1024n or spams and { (var Stream s2) open files2:i:name in+safe ; var CBool spam2 := s2:readline="spam" ; s2 close ; spam2 })
                  file_delete files2:i:name       
          goto_backward 2
        button "Cancel"
          goto_backward 2


header "Mailboxes"
  table columns (shunt allowed:"administrator" 4 3)
    cell header
      [Mailbox ID]
    cell header
      [Description]
    if allowed:"administrator"
      cell header
        [Content]
    cell
      void
    each m mailbox
      cell
        fixed (text keyof:m) ; eol
        text m:name
      cell
        text m:abstract
      if allowed:"administrator"
        cell
          small
            var Array:FileInfo in_files := file_list m:in_pa
            var Array:FileInfo out_files := file_list m:out_
            if in_files:size>0
              var Int count := 0
              var DateTime now := datetime
              var DateTime older := now
              for (var Int i) 0 in_files:size-1
                if in_files:i:extension=".mail" and in_files
                  count += 1 ; older := in_files:i:datetime
              var Int days := now:date:days-older:date:days
              text string:count+" in mail"+(shunt count>1 "s
              fixed [ ] ; text string:days+" day"+(shunt day
              if out_files:size>0 eol
            if out_files:size>0
              var Int count := 0 ; var Intn total := 0
              for (var Int i) 0 out_files:size-1
                if out_files:i:extension=".mail"
                  count += 1 ; total += out_files:i:size
              text string:count+" out mail"+(shunt count>1 "
              fixed [ ] ; text (string total\2^20)+" MB"
      cell
        button "Edit"
          read_only not allowed:"administrator"
          title "Mailbox '"+keyof:m+"'"
          header "Basic informations"
            table columns 3 border 0
              cell
                [Mailbox ID:]
              cell
                fixed (text keyof:m)
              cell
                []
              cell
                [User name:]
              cell
                input "" m:name
              cell
                [The usual name of the guy owning the mailbo
              cell
                [Computer:]
              cell
                input "" m:computer
              cell
                [The full name of the computer handling the 
              cell


header "Mailboxes"
  table columns (shunt allowed:"administrator" 4 3)
    cell header
      [Mailbox ID]
    cell header
      [Description]
    if allowed:"administrator"
      cell header
        [Content]
    cell
      void
    each m mailbox
      cell
        fixed (text keyof:m) ; eol
        text m:name
      cell
        text m:abstract
      if allowed:"administrator"
        cell
          small
            var Array:FileInfo in_files := file_list m:in_pa
            var Array:FileInfo out_files := file_list m:out_
            if in_files:size>0
              var Int count := 0
              var DateTime now := datetime
              var DateTime older := now
              for (var Int i) 0 in_files:size-1
                if in_files:i:extension=".mail" and in_files
                  count += 1 ; older := in_files:i:datetime
              var Int days := now:date:days-older:date:days
              text string:count+" in mail"+(shunt count>1 "s
              fixed [ ] ; text string:days+" day"+(shunt day
              if out_files:size>0 eol
            if out_files:size>0
              var Int count := 0 ; var Intn total := 0
              for (var Int i) 0 out_files:size-1
                if out_files:i:extension=".mail"
                  count += 1 ; total += out_files:i:size
              text string:count+" out mail"+(shunt count>1 "
              fixed [ ] ; text (string total\2^20)+" MB"
      cell
        button "Edit"
          read_only not allowed:"administrator"
          title "Mailbox '"+keyof:m+"'"
          header "Basic informations"
            table columns 3 border 0
              cell
                [Mailbox ID:]
              cell
                fixed (text keyof:m)
              cell
                []
              cell
                [User name:]
              cell
                input "" m:name
              cell
                [The usual name of the guy owning the mailbo
              cell
                [Computer:]
              cell
                input "" m:computer
              cell
                [The full name of the computer handling the 
              cell
                [IP:]
              cell
                select "" m:check_ip
                  option "Must be correct" "true"
                  option "Not checked" "false"
              cell
                [You can ask to reject mails from domains or servers that have no IP address since they are usually spams.]
              cell
                [From:]
              cell
                select "" m:check_from
                  option "Must be correct" "true"
                  option "Not checked" "false"
              cell
                [You can ask to reject mails with an imprope
              cell
                [To/Cc:]
              cell
                select "" m:check_to
                  option "Must be correct" "true"
                  option "Not checked" "false"
              cell
                [You can ask to reject mails with a missing 
                [The problem here is that mails sent from ma
              cell
                [Auto answer:]
              cell
                text_input "" m:auto_answer columns 40 rows 
              cell
                [If this field is not empty, anybody sending
              cell
                [Archive:]
              cell
                select "" m:archive
                  option "yes" "true"
                  option "no" "false"
              cell
                [Should the server keep a copy of the mails 
            table columns 2 border 0
              cell [Description:]
              cell (text_input "" m:abstract rows 5 columns 
          header "Accessing mails using an external mailer (
            table columns 3 border 0
              cell
                [SMTP IP:]
              cell
                input "" m:smtp_ip
              cell
                [Only clients connecting from the specifyed 
                [If empty, no client will be allowed to post
                note "extra details"
                  title "IP field"
                  [This is used to restrict the computers th
                  [As an example, you may want to specify th
                  para
                    [An axample can be:] ; fixed [ 127.0.0.1
                    [and it means either 127.0.0.1 or 10.30.
              cell
                [POP3:]
              cell
                select "" m:pop3_level
                  option "Not allowed on this mailbox" "0"
                  option "Can be used only to detect new mes
                  option "Can read messages" "2"
                  option "Can read and remove messages" "3"
              cell
                []
              cell
                [POP3 IP:]
              cell
                input "" m:pop3_ip
              cell
                [If not empty, only clients connecting from 
                note "extra details"
                  title "IP field"
                  [This is used to restrict the computers th
                  [As an example, you may want to specify th
                  para
                    [An axample can be:] ; fixed [ 127.0.0.1
                    [and it means either 127.0.0.1 or 10.30.
              cell
                [POP3 password:]
              cell
                if allowed:"administrator"
                  input "" (var Str password) password
              cell
                [Type in the clear password that the POP3 cl
                [In the mailboxes database, only the MD5 dig
          header "Relay computer (optional)"
            [You will use a relay computer when the server h
            table columns 3 border 0
              cell
                [Relay computer:]
              cell
                input "" m:relay_computer
              cell
                [You will use a relay computer if the comput
                [In such a case, the MX field of the domain 
              cell
                [Archive:]
              cell
                select "" m:relay_archive
                  option "no" "false"
                  option "yes" "true"
              cell
                [Should the relay computer also keep a copy 
          header "Mailing list (optional)"
            select "This is a mailing list: " m:list
              option "no" "false"
              option "yes" "true"
            [Subscribers:]
            table columns 2
              cell header [Line ID]
              cell header [Mailbox]
              each s m:subscriber
                cell
                  text keyof:s
                cell
                  input "" s length 30
            if allowed:"administrator"
              input "Line ID: " (var Str sid) length 10 noeo
              button "Add a line" noeol
                m:subscriber create sid
                reload_page
              button "Remove a line"
                m:subscriber delete sid
                reload_page
          header "Advanced settings (not recommended)"
            table columns 3 border 0
              cell
                [Mailbox path:]
              cell
                input "" m:path
              cell
                [Where mails related to this mailbox are sto
                [You should leave this field blank most of t
          if allowed:"administrator"
            button "Update mailbox informations"
              if password<>""
                mail_secret_database:data:box create keyof:m
                mail_secret_database:data:box:(keyof m) pop3
              goto_backward
  if allowed:"administrator"
    input "Mailbox ID: " (var Str mid) length 30 noeol
    button "Create the new mailbox" noeol
      mailbox create mid
      reload_page
    button "Delete the mailbox"
      mailbox delete mid
      mail_secret_database:data:box delete mid
      reload_page


                [From:]
              cell
                select "" m:check_from
                  option "Must be correct" "true"
                  option "Not checked" "false"
              cell
                [You can ask to reject mails with an imprope
              cell
                [To/Cc:]
              cell
                select "" m:check_to
                  option "Must be correct" "true"
                  option "Not checked" "false"
              cell
                [You can ask to reject mails with a missing 
                [The problem here is that mails sent from ma
              cell
                [Auto answer:]
              cell
                text_input "" m:auto_answer columns 40 rows 
              cell
                [If this field is not empty, anybody sending
              cell
                [Archive:]
              cell
                select "" m:archive
                  option "yes" "true"
                  option "no" "false"
              cell
                [Should the server keep a copy of the mails 
            table columns 2 border 0
              cell [Description:]
              cell (text_input "" m:abstract rows 5 columns 
          header "Accessing mails using an external mailer (
            table columns 3 border 0
              cell
                [SMTP IP:]
              cell
                input "" m:smtp_ip
              cell
                [Only clients connecting from the specifyed 
                [If empty, no client will be allowed to post
                note "extra details"
                  title "IP field"
                  [This is used to restrict the computers th
                  [As an example, you may want to specify th
                  para
                    [An axample can be:] ; fixed [ 127.0.0.1
                    [and it means either 127.0.0.1 or 10.30.
              cell
                [POP3:]
              cell
                select "" m:pop3_level
                  option "Not allowed on this mailbox" "0"
                  option "Can be used only to detect new mes
                  option "Can read messages" "2"
                  option "Can read and remove messages" "3"
              cell
                []
              cell
                [POP3 IP:]
              cell
                input "" m:pop3_ip
              cell
                [If not empty, only clients connecting from 
                note "extra details"
                  title "IP field"
                  [This is used to restrict the computers th
                  [As an example, you may want to specify th
                  para
                    [An axample can be:] ; fixed [ 127.0.0.1
                    [and it means either 127.0.0.1 or 10.30.
              cell
                [POP3 password:]
              cell
                if allowed:"administrator"
                  input "" (var Str password) password
              cell
                [Type in the clear password that the POP3 cl
                [In the mailboxes database, only the MD5 dig
          header "Relay computer (optional)"
            [You will use a relay computer when the server h
            table columns 3 border 0
              cell
                [Relay computer:]
              cell
                input "" m:relay_computer
              cell
                [You will use a relay computer if the comput
                [In such a case, the MX field of the domain 
              cell
                [Archive:]
              cell
                select "" m:relay_archive
                  option "no" "false"
                  option "yes" "true"
              cell
                [Should the relay computer also keep a copy 
          header "Mailing list (optional)"
            select "This is a mailing list: " m:list
              option "no" "false"
              option "yes" "true"
            [Subscribers:]
            table columns 2
              cell header [Line ID]
              cell header [Mailbox]
              each s m:subscriber
                cell
                  text keyof:s
                cell
                  input "" s length 30
            if allowed:"administrator"
              input "Line ID: " (var Str sid) length 10 noeo
              button "Add a line" noeol
                m:subscriber create sid
                reload_page
              button "Remove a line"
                m:subscriber delete sid
                reload_page
          header "Advanced settings (not recommended)"
            table columns 3 border 0
              cell
                [Mailbox path:]
              cell
                input "" m:path
              cell
                [Where mails related to this mailbox are sto
                [You should leave this field blank most of t
          if allowed:"administrator"
            button "Update mailbox informations"
              if password<>""
                mail_secret_database:data:box create keyof:m
                mail_secret_database:data:box:(keyof m) pop3
              goto_backward
  if allowed:"administrator"
    input "Mailbox ID: " (var Str mid) length 30 noeol
    button "Create the new mailbox" noeol
      mailbox create mid
      reload_page
    button "Delete the mailbox"
      mailbox delete mid
      mail_secret_database:data:box delete mid
      reload_page