Main.pas
上传用户:dh8233980
上传日期:2014-10-16
资源大小:1015k
文件大小:25k
源码类别:

Email服务器

开发平台:

Delphi

  1. unit Main;
  2. (******************************************************************************)
  3. (*                                                                            *)
  4. (* Hermes Main Application Window                                             *)
  5. (* Part of Hermes SMTP/POP3 Server.                                           *)
  6. (* Copyright(C) 2000 by Alexander J. Fanti, All Rights Reserver Worldwide.    *)
  7. (*                                                                            *)
  8. (* Created January 10, 2000 by Alexander J. Fanti.  See License.txt           *)
  9. (*                                                                            *)
  10. (* Used by: Hermes                                                            *)
  11. (* Uses: DataU1, Pop3Server, SmtpServer, Pop3Agent                            *)
  12. (*       About, ManageUsers, ManageMailLists, ManageAliases,                  *)
  13. (*       Settings_General, Settings_SmtpServer,                               *)
  14. (*       Settings_SmtpAgent, Settings_Pop3Server                              *)
  15. (*                                                                            *)
  16. (* Description: This is the Hermes Main Application Window.  It is the        *)
  17. (*              central point of the program.  All settings are controlled    *)
  18. (*              from here.  Also, all log information is displayed here.      *)
  19. (*                                                                            *)
  20. (* Revisions: 1/17/2000  AJF  Unified event handlers                          *)
  21. (*            1/21/2000  AJF  Commented                                       *)
  22. (*            2/12/2000  AJF  Added Tray Icon, minimize to tray, and          *)
  23. (*                            Mutex to prevent multiple instances             *)
  24. (*            2/13/2000  AJF  Added Startup options                           *)
  25. (*            7/08/2001  AJF  Added Domain qualified Aliases                  *)
  26. (*                                                                            *)
  27. (******************************************************************************)
  28. interface
  29. uses
  30.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  31.   Menus, StdCtrls, ComCtrls, ExtCtrls, ShellAPI,
  32.   DataU1, Pop3Server, SmtpServer, SmtpAgent;
  33. const
  34.   WM_SERVER_SERVICEQUEUE = WM_USER + 100;
  35.   WM_TRAYICON_NOTIFICATION = WM_USER + 101;
  36. type
  37.   TfrmMain = class(TForm)
  38.     MainMenu1: TMainMenu;
  39.     mnuFile: TMenuItem;
  40.     mnuSettings: TMenuItem;
  41.     mnuSSMTPServer: TMenuItem;
  42.     mnuSSMTPAgent: TMenuItem;
  43.     mnuSPOP3Server: TMenuItem;
  44.     mnuAccounts: TMenuItem;
  45.     mnuAManageUsers: TMenuItem;
  46.     mnuFExit: TMenuItem;
  47.     mnuAManageMailLists: TMenuItem;
  48.     reLog: TRichEdit;
  49.     pnlStatus: TPanel;
  50.     mnuActive: TMenuItem;
  51.     mnuASMTPServer: TMenuItem;
  52.     mnuASMTPAgent: TMenuItem;
  53.     mnuAPOP3Server: TMenuItem;
  54.     shapeStatusPop3Server: TShape;
  55.     shapeStatusSmtpServer: TShape;
  56.     shapeStatusSmtpAgent: TShape;
  57.     mnuSGeneral: TMenuItem;
  58.     mnuAManageAliases: TMenuItem;
  59.     lblPop3Conn: TLabel;
  60.     lblSmtpConn: TLabel;
  61.     lblAgentConn: TLabel;
  62.     N1: TMenuItem;
  63.     mnuAServiceQueueNow: TMenuItem;
  64.     PopupMenu1: TPopupMenu;
  65.     puClear: TMenuItem;
  66.     mnuHelp: TMenuItem;
  67.     mnuHManual: TMenuItem;
  68.     mnuHWebSite: TMenuItem;
  69.     mnuHLicense: TMenuItem;
  70.     N3: TMenuItem;
  71.     mnuHAbout: TMenuItem;
  72.     mnuHFirstTime: TMenuItem;
  73.     puSave: TMenuItem;
  74.     SaveDialog1: TSaveDialog;
  75.     mnuHEMailtheAuthor: TMenuItem;
  76.     popupTray: TPopupMenu;
  77.     puTrayRestore: TMenuItem;
  78.     puTrayTerminate: TMenuItem;
  79.     TimerTray: TTimer;
  80.     TimerInactivity: TTimer;
  81.     mnuHHelpFile: TMenuItem;
  82.     procedure FormCreate(Sender: TObject);
  83.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  84.     procedure FormDestroy(Sender: TObject);
  85.     procedure mnuFExitClick(Sender: TObject);
  86.     procedure mnuSSMTPServerClick(Sender: TObject);
  87.     procedure mnuSSMTPAgentClick(Sender: TObject);
  88.     procedure mnuSPOP3ServerClick(Sender: TObject);
  89.     procedure mnuAManageUsersClick(Sender: TObject);
  90.     procedure mnuAManageMailListsClick(Sender: TObject);
  91.     procedure mnuAPOP3ServerClick(Sender: TObject);
  92.     procedure mnuASMTPServerClick(Sender: TObject);
  93.     procedure mnuASMTPAgentClick(Sender: TObject);
  94.     procedure mnuSGeneralClick(Sender: TObject);
  95.     procedure mnuAManageAliasesClick(Sender: TObject);
  96.     procedure mnuAServiceQueueNowClick(Sender: TObject);
  97.     procedure puClearClick(Sender: TObject);
  98.     procedure mnuHManualClick(Sender: TObject);
  99.     procedure mnuHelpClick(Sender: TObject);
  100.     procedure mnuHWebSiteClick(Sender: TObject);
  101.     procedure mnuHLicenseClick(Sender: TObject);
  102.     procedure mnuHAboutClick(Sender: TObject);
  103.     procedure mnuHFirstTimeClick(Sender: TObject);
  104.     procedure FormShow(Sender: TObject);
  105.     procedure puSaveClick(Sender: TObject);
  106.     procedure mnuHEMailtheAuthorClick(Sender: TObject);
  107.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  108.     procedure puTrayRestoreClick(Sender: TObject);
  109.     procedure TimerTrayTimer(Sender: TObject);
  110.     procedure TimerInactivityTimer(Sender: TObject);
  111.     procedure mnuHHelpFileClick(Sender: TObject);
  112.   private
  113.     { Private declarations }
  114.     ShowFirstTimer : Boolean;
  115.     WindowsIsTerminating : Boolean;
  116.     TrayActive : Boolean;           // True when we've inserted an icon in the
  117.                                     // windows tray (task bar)
  118.     TrayInfoID : TNOTIFYICONDATA;   // Task Bar structure for display
  119.     Pop3Server : TPop3Server;  // The Pop3 Server Object
  120.     SmtpServer : TSmtpServer;  // The Smtp Server Object
  121.     SmtpAgent : TSmtpAgent;    // The Smtp Agent Object
  122.     procedure Minimize(Sender: TObject);
  123.     procedure Restore;
  124.     procedure WMQUERYENDSESSION(var Msg: TWMQUERYENDSESSION);
  125.       message WM_QUERYENDSESSION;
  126.     procedure TrayIconNotification(var Msg: TMessage);
  127.       message WM_TRAYICON_NOTIFICATION;
  128.     function TrayIcon_Add : Boolean;
  129.     procedure TrayIcon_Remove;
  130.     // Event handler for Status Updates from the Servers and Agent
  131.     procedure AnyStatusUpdate(Sender : TObject; Status : String;
  132.                               Level : Integer);
  133.     // Event handler for State Change notices from the Servers and Agent
  134.     procedure AnyStateChange(Sender : TObject; Active : Boolean;
  135.                              OpenConnections : Longint);
  136.     procedure ServiceQueue(var Msg: TMSG); message WM_SERVER_SERVICEQUEUE;
  137.     // Event handler for notification of queue requiring service.
  138.     // Notification comes from a TSMTPMessageInformation Object through
  139.     // the ServerInformation Object
  140.     // Event handlers for errors from specific objects
  141.     procedure Pop3_Error(Sender : TObject; ErrorCode : TPop3Server_ErrorCode);
  142.     procedure Smtp_Error(Sender : TObject; ErrorCode : TSmtpServer_ErrorCode);
  143.   public
  144.     { Public declarations }
  145.   end;
  146. var
  147.   frmMain: TfrmMain;
  148. procedure Trigger_ServiceSMTPQueue;
  149. implementation
  150. uses UtilU1,
  151.      About,
  152.      ManageUsers,
  153.      ManageMailLists,
  154.      ManageAliases,
  155.      Settings_General,
  156.      Settings_SmtpServer,
  157.      Settings_SmtpAgent,
  158.      Settings_Pop3Server, License, FirstTime, CloseQuery;
  159. {$R *.DFM}
  160. (******************************************************************************)
  161. (*                                                                            *)
  162. (* This code is from a Borland TI/FAQ to prevent multiple instances           *)
  163. (* FAQ1355D.txt   Preventing multiple application instances                   *)
  164. (* Category   :Windows API                                                    *)
  165. (* Platform    :All                                                           *)
  166. (* Product    :All 32 bit                                                     *)
  167. (*                                                                            *)
  168. (* Other code related to this is marked with "MUTEX"                          *)
  169. (*                                                                            *)
  170. (******************************************************************************)
  171. var
  172.   OldWindowProc : Pointer; {Variable for the old windows proc}
  173.   WM_TASKBARCREATED : DWord; {custom systemwide message}
  174.   WM_HERMESRESTORE,         WM_HERMESREFRESHFROMINIFILE,
  175.   WM_HERMESSENDSTATUS,      WM_HERMESSTATUS,
  176.   WM_HERMESSMTPSERVERSTART, WM_HERMESSMTPSERVERSTOP,
  177.   WM_HERMESPOP3SERVERSTART, WM_HERMESPOP3SERVERSTOP,
  178.   WM_HERMESSMTPAGENTSTART,  WM_HERMESSMTPAGENTSTOP,
  179.   WM_HERMESSHUTDOWN,        WM_HERMESFORCESHUTDOWN  : DWord; {custom systemwide message}
  180. function NewWindowProc(WindowHandle : hWnd;
  181.                        TheMessage   : LongInt;
  182.                        ParamW       : LongInt;
  183.                        ParamL       : LongInt) : LongInt stdcall;
  184. var
  185.   Status : LongInt;
  186. begin
  187.   if TheMessage = WM_HERMESRESTORE  then begin
  188.     {Tell the application to restore, let it restore the form}
  189.     SendMessage(Application.handle, WM_SYSCOMMAND, SC_RESTORE, 0);
  190.     SetForegroundWindow(Application.Handle);
  191.     {We handled the message - we are done}
  192.     Result := 0;    exit;
  193.   end else
  194.   if TheMessage = WM_TASKBARCREATED  then begin
  195.     frmMain.TrayIcon_Remove;  {remove tray icon if still there}
  196.     frmMain.TrayIcon_Add;     {add tray icon...}
  197.     {We handled the message - we are done}
  198.     Result := 0;    exit;
  199.   end else
  200.   if TheMessage = WM_HERMESREFRESHFROMINIFILE then begin
  201.     INI.LoadFromFile;
  202.     Result := 0;    exit;    {We handled the message - we are done}
  203.   end else
  204.   if TheMessage = WM_HERMESSMTPSERVERSTART then begin
  205.     frmMain.SmtpServer.Listen;
  206.     Result := 0;    exit;    {We handled the message - we are done}
  207.   end else
  208.   if TheMessage = WM_HERMESSMTPSERVERSTOP  then begin
  209.     frmMain.SmtpServer.Stop;
  210.     Result := 0;    exit;    {We handled the message - we are done}
  211.   end else
  212.   if TheMessage = WM_HERMESPOP3SERVERSTART then begin
  213.     frmMain.Pop3Server.Listen;
  214.     Result := 0;    exit;    {We handled the message - we are done}
  215.   end else
  216.   if TheMessage = WM_HERMESPOP3SERVERSTOP  then begin
  217.     frmMain.Pop3Server.Stop;
  218.     Result := 0;    exit;    {We handled the message - we are done}
  219.   end else
  220.   if TheMessage = WM_HERMESSMTPAGENTSTART  then begin
  221.     frmMain.SmtpAgent.Start;
  222.     Result := 0;    exit;    {We handled the message - we are done}
  223.   end else
  224.   if TheMessage = WM_HERMESSMTPAGENTSTOP   then begin
  225.     frmMain.SmtpAgent.Stop;
  226.     Result := 0;    exit;    {We handled the message - we are done}
  227.   end else
  228.   if TheMessage = WM_HERMESSENDSTATUS  then begin
  229.     Status := 0;
  230.     if frmMain.SmtpServer.Active then Status := Status + 1;
  231.     if frmMain.SmtpAgent.Active  then Status := Status + 2;
  232.     if frmMain.Pop3Server.Active then Status := Status + 4;
  233.     // Send Message Back!
  234.     SendMessage(HWND_BROADCAST, WM_HERMESSTATUS, Integer(Application.Handle), Status);
  235.     Result := 0;    exit;    {We handled the message - we are done}
  236.   end else
  237.   if TheMessage = WM_HERMESSHUTDOWN  then begin
  238.     frmMain.Close;
  239.     Result := 0;    exit;    {We handled the message - we are done}
  240.   end else
  241.   if TheMessage = WM_HERMESFORCESHUTDOWN  then begin
  242.     frmMain.WindowsIsTerminating := True;
  243.     frmMain.Close;
  244.     Result := 0;    exit;    {We handled the message - we are done}
  245.   end;
  246.   {Call the original winproc}
  247.   Result := CallWindowProc(OldWindowProc, WindowHandle, TheMessage, ParamW, ParamL);
  248. end;
  249. procedure TfrmMain.FormCreate(Sender: TObject);
  250. begin
  251.   (*** Start MUTEX and MESSAGE CAPTURE ***)
  252.   {Register a custom windows message}
  253.   {Register the TrayBar Create windows message}
  254.   WM_TASKBARCREATED           := RegisterWindowMessage('TaskbarCreated');
  255.   {Register Hermes control messages}
  256.   WM_HERMESRESTORE            := RegisterWindowMessage('HermesRestore');
  257.   WM_HERMESREFRESHFROMINIFILE := RegisterWindowMessage('HermesRefreshFromINIFile');
  258.   WM_HERMESSENDSTATUS         := RegisterWindowMessage('HermesSendStatus');
  259.   WM_HERMESSTATUS             := RegisterWindowMessage('HermesStatus');
  260.   WM_HERMESSMTPSERVERSTART    := RegisterWindowMessage('HermesStartSMTPServer');
  261.   WM_HERMESSMTPSERVERSTOP     := RegisterWindowMessage('HermesStopSMTPServer');
  262.   WM_HERMESPOP3SERVERSTART    := RegisterWindowMessage('HermesStartPOP3Server');
  263.   WM_HERMESPOP3SERVERSTOP     := RegisterWindowMessage('HermesStopPOP3Server');
  264.   WM_HERMESSMTPAGENTSTART     := RegisterWindowMessage('HermesStartSMTPAgent');
  265.   WM_HERMESSMTPAGENTSTOP      := RegisterWindowMessage('HermesStopSMTPAgent');
  266.   WM_HERMESSHUTDOWN           := RegisterWindowMessage('HermesShutdown');
  267.   WM_HERMESFORCESHUTDOWN      := RegisterWindowMessage('HermesForceShutdown');
  268.   {Set form1's windows proc to ours and remember the old window proc}
  269.   OldWindowProc := Pointer(SetWindowLong(Handle, GWL_WNDPROC, LongInt(@NewWindowProc)));
  270.   (*** Stop MUTEX and MESSAGE CAPTURE ***)
  271.   WindowsIsTerminating := False;
  272.   TrayActive := False;
  273.   Application.OnMinimize := Minimize;  // call my app on minimize
  274.   // Create and load the Server's Information Object
  275.   INI := TServerInformation.Create;
  276.   ShowFirstTimer := not INI.Exists;
  277.   INI.LoadFromFile;
  278.   if not INI.StartMinimized then Restore;
  279.   // Create the Pop3 Server Object and start it up
  280.   Pop3Server := TPop3Server.Create(Self);
  281.   Pop3Server.OnStateChange  := AnyStateChange;
  282.   Pop3Server.OnStatusUpdate := AnyStatusUpdate;
  283.   Pop3Server.OnError        := Pop3_Error;
  284.   if INI.AutoStart_Pop3Server then Pop3Server.Listen;
  285.   // Create the Smtp Server Object and start it up
  286.   SmtpServer := TSmtpServer.Create(Self);
  287.   SmtpServer.OnStateChange  := AnyStateChange;
  288.   SmtpServer.OnStatusUpdate := AnyStatusUpdate;
  289.   SmtpServer.OnError        := Smtp_Error;
  290.   if INI.AutoStart_SmtpServer then SmtpServer.Listen;
  291.   // Create the Smtp Agent Object and start it up
  292.   SmtpAgent := TSmtpAgent.Create(Self);
  293.   SmtpAgent.OnStateChange  := AnyStateChange;
  294.   SmtpAgent.OnStatusUpdate := AnyStatusUpdate;
  295.   if INI.AutoStart_SmtpAgent then SmtpAgent.Start;
  296.   if INI.ProcessQueueOnStartup then SmtpAgent.ServiceQueue; 
  297. end;
  298. procedure TfrmMain.FormShow(Sender: TObject);
  299. var
  300.   frmFirstTime: TfrmFirstTime;
  301. begin
  302.   if ShowFirstTimer then begin
  303.     frmFirstTime := TfrmFirstTime.Create(Self);
  304.     frmFirstTime.ShowModal;
  305.   end;
  306. end;
  307. procedure TfrmMain.Minimize(Sender: TObject);
  308. begin
  309.   if TrayActive then begin
  310.     frmMain.Hide;
  311.     ShowWindow(Application.Handle, SW_HIDE);
  312.   end else begin
  313.     frmMain.Hide;
  314.   end;
  315. end;
  316. procedure TfrmMain.Restore;
  317. begin
  318.   ShowWindow(Application.Handle, SW_SHOW);
  319.   Show;
  320.   Application.Restore;
  321.   Application.BringToFront;
  322. end;
  323. procedure TfrmMain.WMQUERYENDSESSION(var Msg: TWMQUERYENDSESSION);
  324. // Windows CanShutdown
  325. begin
  326.   WindowsIsTerminating := True;
  327. //  Msg.Result := 0;  // CanClose := False;
  328.   Msg.Result := 1;  // CanClose := True;
  329.   Close;  // note, If I agree to shutdown, I must close my self!
  330. end;
  331. procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  332. var
  333.   x : Integer;
  334. begin
  335.   if not WindowsIsTerminating then begin
  336.     x := frmCloseQuery.ShowModal;
  337.     CanClose := x = mrYes;
  338.     if x = mrIgnore then Application.Minimize;
  339.   end else begin
  340.     Canclose := True;
  341.   end;
  342. end;
  343. procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
  344. begin
  345.   // Shutdown all server components
  346.   Pop3Server.Shutdown;
  347.   SmtpServer.Shutdown;
  348.   SmtpAgent.Shutdown;
  349.   // Save Server INI File ?  No real need. we save after setting changes
  350.   // INI.SaveToFile;
  351.   Action := caFree;
  352. end;
  353. procedure TfrmMain.FormDestroy(Sender: TObject);
  354. begin
  355.   (*** Start MUTEX ***)
  356.   {Set form1's window proc back to it's original procedure}
  357.   SetWindowLong(Handle, GWL_WNDPROC, LongInt(OldWindowProc));
  358.   (*** Stop  MUTEX ***)
  359.   // Free the Server Objects
  360.   Pop3Server.Free;
  361.   SmtpServer.Free;
  362.   SmtpAgent.Free;
  363.   INI.Free;
  364.   // Remove Icon from Tray
  365.   if TrayActive then Shell_NotifyIcon(NIM_DELETE, @TrayInfoID);
  366. end;
  367. // Handle Menu choices
  368. procedure TfrmMain.mnuFExitClick(Sender: TObject);
  369. begin  Close;                             end;
  370. procedure TfrmMain.mnuASMTPServerClick(Sender: TObject);
  371. begin
  372.   if SmtpServer.Active then SmtpServer.Stop else SmtpServer.Listen;
  373. end;
  374. procedure TfrmMain.mnuASMTPAgentClick(Sender: TObject);
  375. begin
  376.   if SmtpAgent.Active then SmtpAgent.Stop else SmtpAgent.Start;
  377. end;
  378. procedure TfrmMain.mnuAPOP3ServerClick(Sender: TObject);
  379. begin
  380.   if Pop3Server.Active then Pop3Server.Stop else Pop3Server.Listen;
  381. end;
  382. procedure TfrmMain.mnuAServiceQueueNowClick(Sender: TObject);
  383. begin
  384.   SmtpAgent.ServiceQueue;
  385. end;
  386. procedure TfrmMain.mnuSGeneralClick(Sender: TObject);
  387. begin
  388.   if frmSettings_General.ShowModal = mrOK then INI.SaveToFile;
  389. end;
  390. procedure TfrmMain.mnuSSMTPServerClick(Sender: TObject);
  391. begin
  392.   if frmSettings_SmtpServer.ShowModal = mrOK then INI.SaveToFile;
  393. end;
  394. procedure TfrmMain.mnuSSMTPAgentClick(Sender: TObject);
  395. begin
  396.   if frmSettings_SmtpAgent.ShowModal = mrOK then INI.SaveToFile;
  397. end;
  398. procedure TfrmMain.mnuSPOP3ServerClick(Sender: TObject);
  399. begin
  400.   if frmSettings_Pop3Server.ShowModal = mrOK then INI.SaveToFile;
  401. end;
  402. procedure TfrmMain.mnuAManageUsersClick(Sender: TObject);
  403. begin
  404.   frmManageUsers.ShowModal;
  405.   INI.SaveToFile;
  406. end;
  407. procedure TfrmMain.mnuAManageMailListsClick(Sender: TObject);
  408. begin
  409.   frmManageMailLists.ShowModal;
  410.   INI.SaveToFile;
  411. end;
  412. procedure TfrmMain.mnuAManageAliasesClick(Sender: TObject);
  413. begin
  414.   frmManageAliases.ShowModal;
  415.   INI.SaveToFile;
  416. end;
  417. procedure TfrmMain.mnuHelpClick(Sender: TObject);
  418. begin
  419.   mnuHManual.Enabled := FileExists(INI.AppPath + 'hermes.doc');
  420.   mnuHHelpFile.Enabled := FileExists(INI.AppPath + 'hermes.hlp');
  421. end;
  422. procedure TfrmMain.mnuHFirstTimeClick(Sender: TObject);
  423. var
  424.   frmFirstTime: TfrmFirstTime;
  425. begin
  426.   frmFirstTime := TfrmFirstTime.Create(Self);
  427.   frmFirstTime.Show;
  428. end;
  429. procedure TfrmMain.mnuHManualClick(Sender: TObject);
  430. begin
  431.   if not LaunchShellApp(INI.AppPath + 'hermes.doc') then
  432.     ShowMessage('Can''t open "Hermes.doc"');
  433. end;
  434. procedure TfrmMain.mnuHHelpFileClick(Sender: TObject);
  435. begin
  436.   if not LaunchShellApp(INI.AppPath + 'hermes.hlp') then
  437.     ShowMessage('Can''t open "Hermes.hlp"');
  438. end;
  439. procedure TfrmMain.mnuHWebSiteClick(Sender: TObject);
  440. begin
  441.   if not LaunchShellApp(AppWebSite) then
  442.     ShowMessage('Can''t open web browser to ' + AppWebSite);
  443. end;
  444. procedure TfrmMain.mnuHLicenseClick(Sender: TObject);
  445. begin  frmLicense.ShowModal;                end;
  446. procedure TfrmMain.mnuHAboutClick(Sender: TObject);
  447. begin  frmAbout.ShowModal;                end;
  448. procedure TfrmMain.mnuHEMailtheAuthorClick(Sender: TObject);
  449. begin
  450.   // Open the user's mailer to the Author's EMail Address
  451.   if not LaunchShellApp(AuthorEMail) then
  452.     ShowMessage('Can''t open EMailer to ' + AuthorEMail);
  453. end;
  454. procedure TfrmMain.puClearClick(Sender: TObject);
  455. begin
  456.   reLog.Clear;
  457. end;
  458. procedure TfrmMain.puSaveClick(Sender: TObject);
  459. begin
  460.   if SaveDialog1.Execute then begin
  461.     reLog.PlainText := UpperCase(ExtractFileExt(SaveDialog1.Filename)) = '.RTF';
  462.     reLog.Lines.SaveToFile(SaveDialog1.Filename);
  463.     reLog.PlainText := False;
  464.   end;
  465. end;
  466. procedure TfrmMain.puTrayRestoreClick(Sender: TObject);
  467. begin
  468.   Restore;
  469. end;
  470. procedure TfrmMain.AnyStatusUpdate(Sender : TObject; Status : String;
  471.                                    Level : Integer);
  472. var
  473.   Entry : String;
  474.   F : TextFile;
  475. begin
  476.   if Level <= INI.LogLevel then begin
  477.     Entry := '[' + DateToStr(Now) + ' - ' + TimeToStr(Now) + ']  ' + Status;
  478.     if reLog.Lines.Count > 500 then reLog.Clear;
  479.     reLog.Lines.Add(Entry);
  480.     if INI.LogFile <> '' then begin
  481.       // I need to add to the log file here...
  482.       AssignFile(F, INI.LogFile);
  483.       try
  484.         Append(F);
  485.         Writeln(F, Entry);
  486.       except
  487.         on E: Exception do try
  488.           ReWrite(F);
  489.           Writeln(F, Entry);
  490.         except
  491.           on E: Exception do begin end;
  492.         end;
  493.       end;
  494.       CloseFile(F);
  495.     end;
  496.   end;
  497. end;
  498. procedure TfrmMain.AnyStateChange(Sender : TObject; Active : Boolean;
  499.                                   OpenConnections : Longint);
  500. begin
  501.   // Perform different actions based on which object sent the "StateChange"
  502.   // But it's all basically the same...
  503.   // check a menu, color a shape, set a caption
  504.   if Sender is TSmtpServer then begin
  505.     mnuASMTPServer.Checked := Active;
  506.     if Active then shapeStatusSmtpServer.Brush.Color := clLime
  507.       else shapeStatusSmtpServer.Brush.Color := clRed;
  508.     shapeStatusSmtpServer.Hint := 'SMTP Server, ' + IntToStr(OpenConnections) +
  509.                                   ' open connections.';
  510.     lblSmtpConn.Caption := 'Smtp:' + IntToStr(OpenConnections);
  511.   end;
  512.   if Sender is TSmtpAgent then begin
  513.     mnuASMTPAgent.Checked := Active;
  514.     if Active then shapeStatusSmtpAgent.Brush.Color := clLime
  515.       else shapeStatusSmtpAgent.Brush.Color := clRed;
  516.     shapeStatusSmtpAgent.Hint := 'SMTP Agent, ' + IntToStr(OpenConnections) +
  517.                                  ' open messages.';
  518.     lblAgentConn.Caption := 'Agent:' + IntToStr(OpenConnections);
  519.   end;
  520.   if Sender is TPop3Server then begin
  521.     mnuAPOP3Server.Checked := Active;
  522.     if Active then shapeStatusPop3Server.Brush.Color := clLime
  523.       else shapeStatusPop3Server.Brush.Color := clRed;
  524.     shapeStatusPop3Server.Hint := 'POP3 Server, ' + IntToStr(OpenConnections) +
  525.                                   ' open connections.';
  526.     lblPop3Conn.Caption := 'Pop3:' + IntToStr(OpenConnections);
  527.   end;
  528. end;
  529. procedure TfrmMain.ServiceQueue(var Msg: TMSG);
  530. begin
  531.   // Queue Requires Service
  532.   // This is a Windows Message Posted from the MailRouting Unit's DeliverMail
  533.   // Object.  This allows us to process the queue immediately, rather than
  534.   // wait for the Queue Service Timer.  I like instant mail...!
  535.   SmtpAgent.ServiceQueue;
  536. end;
  537. procedure TfrmMain.Pop3_Error(Sender : TObject;
  538.                               ErrorCode : TPop3Server_ErrorCode);
  539. begin
  540. end;
  541. procedure TfrmMain.Smtp_Error(Sender : TObject;
  542.                               ErrorCode : TSmtpServer_ErrorCode);
  543. begin
  544. end;
  545. {
  546.   This timer will try to insert a tray icon into the Windows task bar.
  547.   it will try until it succeeds.  This is because sometimes it can't do it
  548.   on the first time...  After that, it won't try anymore.
  549.   We then get click notifications at the TrayIconNotification procedure
  550. }
  551. function TfrmMain.TrayIcon_Add : Boolean;
  552. begin
  553.   // Try to place an Icon in the Tray... until we're successful!
  554.   Result := False;
  555.   if not TrayActive then begin
  556.     TrayInfoID.cbSize := SizeOf(TNOTIFYICONDATA);
  557.     TrayInfoID.uID := 0;
  558.     TrayInfoID.Wnd := Handle;
  559.     TrayInfoID.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
  560.     TrayInfoID.uCallbackMessage := WM_TRAYICON_NOTIFICATION;
  561.     TrayInfoID.hIcon := 0;
  562.     if Application.Icon <> nil then TrayInfoID.hIcon := Application.Icon.Handle;
  563.     StrLCopy(TrayInfoID.szTip, 'Hermes SMTP/POP3 Server',
  564.              SizeOf(TrayInfoID.szTip));
  565.     if Shell_NotifyIcon(NIM_ADD, @TrayInfoID) then begin
  566.       TrayActive := True;
  567.       Result := True;
  568.     end;
  569.   end;
  570. end;
  571. procedure TfrmMain.TrayIcon_Remove;
  572. begin
  573.   // Remove Icon from Tray
  574.   if TrayActive then begin
  575.     Shell_NotifyIcon(NIM_DELETE, @TrayInfoID);
  576.     TrayActive := False;
  577.   end;
  578. end;
  579. procedure TfrmMain.TimerTrayTimer(Sender: TObject);
  580. begin
  581.   if TrayIcon_Add then TimerTray.Enabled := False;
  582. (*
  583.   // Try to place an Icon in the Tray... until we're successful!
  584.   if not TrayActive then begin
  585.     TrayInfoID.cbSize := SizeOf(TNOTIFYICONDATA);
  586.     TrayInfoID.uID := 0;
  587.     TrayInfoID.Wnd := Handle;
  588.     TrayInfoID.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
  589.     TrayInfoID.uCallbackMessage := WM_TRAYICON_NOTIFICATION;
  590.     TrayInfoID.hIcon := 0;
  591.     if Application.Icon <> nil then TrayInfoID.hIcon := Application.Icon.Handle;
  592.     StrLCopy(TrayInfoID.szTip, 'Hermes SMTP/POP3 Server',
  593.              SizeOf(TrayInfoID.szTip));
  594.     if Shell_NotifyIcon(NIM_ADD, @TrayInfoID) then begin
  595.       TrayActive := True;
  596. //      TimerTray.Enabled := False;
  597.       TimerTray.Interval := 300000;
  598.       if INI.StartMinimized then Application.Minimize;
  599.     end;
  600.   end;
  601. *)
  602. end;
  603. // We get tray click notifications here.  Wr restore or offer a popup menu.
  604. procedure TfrmMain.TrayIconNotification(var Msg: TMessage);
  605. var
  606.   MouseMsg: longint;
  607.   Pt: TPoint;
  608. begin
  609.   MouseMsg := Msg.LParam;
  610.   case MouseMsg of
  611.     wm_LButtonDown : Restore;
  612.     wm_RButtonUp   : begin
  613.                        GetCursorPos(Pt);
  614.                        popupTray.PopUp(Pt.X,Pt.Y);
  615.                      end;
  616.   end;
  617. end;
  618. procedure TfrmMain.TimerInactivityTimer(Sender: TObject);
  619. begin
  620.   if Assigned(INI) then begin
  621.     if Assigned(Pop3Server) then
  622.       Pop3Server.ConnectionInactivityTimeout(INI.Pop3_InactivityTimeout);
  623.     if Assigned(SmtpServer) then
  624.       SmtpServer.ConnectionInactivityTimeout(INI.Smtp_InactivityTimeout);
  625.     if Assigned(SmtpAgent) then
  626.       SmtpAgent.ConnectionInactivityTimeout(INI.Agent_InactivityTimeout);
  627.   end;
  628. end;
  629. procedure Trigger_ServiceSMTPQueue;
  630. begin
  631.   // This is to post a message to ourselves to cause the SMTP Agent to service
  632.   // its Queue of outbound messages.
  633.   PostMessage(frmMain.Handle, WM_SERVER_SERVICEQUEUE, 0, 0);
  634. end;
  635. end.