📄 main.~pas
字号:
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Menus, StdCtrls, Buttons, ComCtrls, ToolWin, ImgList,
Account, Config, LeftView, RightView, TopView, BottomView, CoreData, Login,
Psock, NMpop3, mmSystem, OleCtrls, MSCommLib_TLB, ShellAPI;
type
TfrmMain = class(TForm)
frmLeft: TfrmLeft;
Splitter1: TSplitter;
frmRight: TfrmRight;
MainMenu: TMainMenu;
MnFile: TMenuItem;
MnExit: TMenuItem;
MnTool: TMenuItem;
MnAccount: TMenuItem;
MnConfig: TMenuItem;
MnCheck: TMenuItem;
StatusBar1: TStatusBar;
ToolBar1: TToolBar;
tbtnAccount: TToolButton;
tbtnConfig: TToolButton;
tbtnCheck: TToolButton;
tbtnSchedule: TToolButton;
tbtnStop: TToolButton;
tbtnExit: TToolButton;
ToolButton8: TToolButton;
PopupMenu1: TPopupMenu;
ppMAccount: TMenuItem;
ppMConfig: TMenuItem;
NMPOP3: TNMPOP3;
TimCheck: TTimer;
TimShow: TTimer;
MSComm: TMSComm;
imlToolbar: TImageList;
imlMenu: TImageList;
MnStop: TMenuItem;
MnSchedule: TMenuItem;
N1: TMenuItem;
N2: TMenuItem;
imlEmail: TImageList;
imlLog: TImageList;
N3: TMenuItem;
ppMCheck: TMenuItem;
ppMStop: TMenuItem;
N4: TMenuItem;
ppMExit: TMenuItem;
ppMRestore: TMenuItem;
N5: TMenuItem;
MnHelp: TMenuItem;
MnAbout: TMenuItem;
procedure BitBtn1Click(Sender: TObject);
procedure MnAccountClick(Sender: TObject);
procedure MnConfigClick(Sender: TObject);
procedure tbtnCheckClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure MnCheckClick(Sender: TObject);
procedure NMPOP3ConnectionFailed(Sender: TObject);
procedure NMPOP3Failure(Sender: TObject);
procedure NMPOP3AuthenticationFailed(var Handled: Boolean);
procedure NMPOP3InvalidHost(var Handled: Boolean);
procedure NMPOP3Success(Sender: TObject);
procedure NMPOP3HostResolved(Sender: TComponent);
procedure frmToptabAccountChange(Sender: TObject);
procedure TimCheckTimer(Sender: TObject);
procedure TimShowTimer(Sender: TObject);
procedure tbtnAccountClick(Sender: TObject);
procedure tbtnConfigClick(Sender: TObject);
procedure tbtnStopClick(Sender: TObject);
procedure tbtnExitClick(Sender: TObject);
procedure MnExitClick(Sender: TObject);
procedure tbtnScheduleClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure ppMAccountClick(Sender: TObject);
procedure ppMConfigClick(Sender: TObject);
procedure ppMCheckClick(Sender: TObject);
procedure ppMStopClick(Sender: TObject);
procedure MnStopClick(Sender: TObject);
procedure MnScheduleClick(Sender: TObject);
procedure ppMRestoreClick(Sender: TObject);
procedure ppMExitClick(Sender: TObject);
private
{ Private declarations }
procedure UpdateLeftView(); // 更新左侧视图
procedure UpdateTopView(); // 更新上侧视图
procedure UpdateEmailList(lst : TList); // 更新当前账号的邮件列表
procedure StartCheckMail(); // 开始检测邮件
function IsMailExist(MsgId : string; Act : TAccountInfo) : Boolean; //检测邮件MsgId在pAccount中是否已经存在
procedure AddLog(msg : string; const LogTp : integer);
procedure OnAppMinimize(Sender: TObject); // 应用程序最小化响应函数
procedure SendSMS(lst : TList; Mobile : string); // 将 lst 中的邮件编辑短信发送到手机
function OpenPort() : Boolean;
procedure IniSMS(); // 初始化短消息
procedure SendInEncodeText(sms : string; mobile : string); // Text mode
procedure SendInEncodePdu(sms : string; mobile : string); // pdu mode
function ExchangeCode(src : string) : string;
function EncodeGb(var s:WideString):String;
//
// 自定义消息
//
procedure IniFinished(var Msg : TMessage); message WM_INIFINISHED;
procedure OnNotify(var Msg : TMessage); message WM_NOTIFY;
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
m_HideLeft : Boolean; // 左侧视图是否被隐藏
m_IsCancel : Boolean; // 是否取消对本账号的检测
m_IsFirstConn : Boolean;// 第一次连接
m_CheckTime : TTime; // 上一次检测时间
m_IsStop : Boolean; // 是否接到停止命令
NotifyIcon : TNotifyIconData;
Const
INFO = 0; // 信息
WARNING = 1; // 警告
ERROR = 2; // 错误
SMS = 3; // 发送短信
SCHEDULE = 4; // 定时检测标志
implementation
{$R *.dfm}
//
//
//
procedure TfrmMain.BitBtn1Click(Sender: TObject);
begin
end;
//
// 账号菜单 单击事件处理函数
//
procedure TfrmMain.MnAccountClick(Sender: TObject);
//var
// str1 : string;
begin
frmAccount.ShowModal();
if not Account.m_IsChanged then
exit;
//
// 如果邮件账号修改了,则更新上侧和左侧视图
//
UpDateTopView();
UpdateLeftView();
end;
//
// 设置菜单 单击事件处理函数
//
procedure TfrmMain.MnConfigClick(Sender: TObject);
begin
TimCheck.Enabled := False;
Timshow.Enabled := False;
frmConfig.ShowModal();
//
// 更新NMPOP3的设置
//
TimCheck.Interval := Config.m_Config.m_Interval * 60 * 1000;
NMPOP3.TimeOut := Config.m_Config.m_Timeout * 60 * 1000;
//
// 更新MSComm的设置
//
MSComm.CommPort := Config.m_Com.m_ComPort;
MSComm.Settings := Config.m_Com.m_BaudRate + ',' + Copy(Config.m_Com.m_Parity, 0, 1) + ',' + Config.m_Com.m_DataBits + Config.m_Com.m_StopBits;
//
// 重新计时
//
m_CheckTime := Time;
TimCheck.Enabled := True;
TimShow.Enabled := True;
end;
procedure TfrmMain.tbtnCheckClick(Sender: TObject);
begin
MnCheckClick(Sender);
end;
//
// 更新左侧视图
//
procedure TfrmMain.UpdateLeftView;
var
TreeNode : TTreeNode;
SelTreeNode : TTreeNode;
SelIndex : integer; // Tab 的当前活动索引
pAccount : ^TAccountInfo;
cnt : string;
begin
SelIndex := frmRight.frmTop.tabAccount.TabIndex;
if SelIndex < 0 then
exit;
pAccount := Account.m_lstAccount.Items[SelIndex];
if pAccount^.m_lstEmail = nil then
cnt := '0'
else
str(pAccount^.m_lstEmail.Count, cnt);
//
// 清空当前树中的结点
//
frmLeft.treAccount.Items.Clear();
//
// 为其添加新结点
//
TreeNode := TTreeNode.Create(frmLeft.treAccount.Items);
TreeNode := frmLeft.treAccount.Items.Add(TreeNode, '帐号:' + pAccount^.m_Account);
frmLeft.treAccount.Items.AddChild(TreeNode, 'POP服务器:' + pAccount^.m_Server);
frmLeft.treAccount.Items.AddChild(TreeNode, '端口:' + pAccount^.m_Port);
frmLeft.treAccount.Items.AddChild(TreeNode, '用户名:' + pAccount^.m_User);
frmLeft.treAccount.Items.AddChild(TreeNode, '手机号:' + pAccount^.m_Mobile);
SelTreeNode := frmLeft.treAccount.Items.AddChild(TreeNode, '邮件数:' + cnt);
//
// 设置各个结点的图标
//
frmLeft.treAccount.Items.Item[1].ImageIndex := 1;
frmLeft.treAccount.Items.Item[2].ImageIndex := 2;
frmLeft.treAccount.Items.Item[3].ImageIndex := 3;
frmLeft.treAccount.Items.Item[4].ImageIndex := 4;
frmLeft.treAccount.Items.Item[5].ImageIndex := 5;
//
// 设置当前选种的节点
//
frmLeft.treAccount.Selected := SelTreeNode;
end;
//
// 更新上侧视图
//
procedure TfrmMain.UpdateTopView;
var
i : integer;
pAccount : ^TAccountInfo;
begin
//
// 清空当前所有的账号
//
frmRight.frmTop.tabAccount.Tabs.Clear();
if Account.m_lstAccount = nil then
begin
frmRight.frmTop.lsvEmail.Clear();
exit;
end;
//
// 加入m_lstAccount中的账号
//
for i := 0 to Account.m_lstAccount.Count - 1 do
begin
pAccount := Account.m_lstAccount.Items[i];
frmRight.frmTop.tabAccount.Tabs.Add(pAccount^.m_Account);
end;
if Account.m_lstAccount.Count = 0 then
begin
frmRight.frmTop.lsvEmail.Clear();
end;
end;
//
// MainForm 创建时响应的函数
//
procedure TfrmMain.FormCreate(Sender: TObject);
var
Icon : TIcon;
begin
//
// 默认左侧视图可见
//
m_HideLeft := false;
//
// 给Config传递frmMain的句柄,从Config向frmMain发送消息时用到
//
Config.m_MainhWnd :=self.Handle;
//
//NotifyIcon为全局变量,在程序的开头已经定义了
//
with NotifyIcon do
begin
cbSize:=SizeOf(TNotifyIconData);
Wnd:=Handle; //指向当前窗体frmMain的句柄
uID:=1;
uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallBackMessage:=WM_NOTIFY;
hIcon:=Application.Icon.Handle;
icon := TIcon.Create();
frmmain.imlToolbar.GetIcon(0, icon);
hIcon := icon.Handle;
szTip:='邮件短信发送程序';
end;
Application.OnMinimize := OnAppMinimize;
end;
//
// 检测菜单项响应函数
//
procedure TfrmMain.MnCheckClick(Sender: TObject);
begin
TimCheck.Enabled := False;
TimShow.Enabled := False;
StartCheckMail();
m_CheckTime := Time;
TimCheck.Enabled := True;
TimShow.Enabled := True;
end;
//
// 检测邮件
//
procedure TfrmMain.StartCheckMail;
var
act_index, mail_index : integer;
pAccount : ^TAccountInfo;
pEmail : ^TEmailInfo;
lstNewMail : TList; // 新邮件暂存链表
tmp : string;
m_IsReLogin : Boolean; // 是否因默认用户名和密码不匹配而重新登录
m_HaveNewMail : Boolean; // 有新邮件
begin
if (Account.m_lstAccount = nil) or (m_lstAccount.Count <= 0) then
exit;
m_HaveNewMail := False;
m_IsStop := False;
for act_index := 0 to Account.m_lstAccount.Count - 1 do
begin
if m_IsStop then
begin
AddLog('用户取消操作', WARNING);
exit;
end;
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -