邮件短信自动通知系统关键代码如下:
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;
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;
//
// 依次获取账号连表中的每一个账号
//
pAccount := Account.m_lstAccount.Items[act_index];
//
// 确保 lstNewMail 已经初始化
//
lstNewMail := TList.Create();
//
// 确保 NMPOP3 已经初始化
//
if NMPOP3 = nil then
NMPOP3 := TNMPOP3.Create(self);
//
// 设置POP3连接信息
//
NMPOP3.Host := pAccount^.m_Server;
NMPOP3.Port := StrToInt(pAccount^.m_Port);
NMPOP3.UserID := pAccount^.m_User;
NMPOP3.Password := pAccount^.m_Pwd;
//
// 加入连接日志
//
AddLog('**********' + '正在检测账号' + pAccount^.m_Account + '**********', SCHEDULE);
frmRight.frmBottom.SetStatus('正在检测账号' + pAccount^.m_Account);
AddLog('正在连接服务器 ' + pAccount^.m_Server + '...', INFO);
//
// 如果没有连接,则重新连接
// m_IsCancel 标志是否因用户名密码不匹配而取消连接
// m_IsReLogin 标志是否因用户名密码不匹配而重新登录
//
m_IsCancel := False;
m_IsReLogin := False;
m_IsFirstConn := True;
try
if NMPOP3.Connected then
NMPOP3.Disconnect();
NMPOP3.Connect();
except
on E : Exception do
m_IsReLogin := True;
end;
m_isFirstConn := False;
//
// 如果取消连接,则停止以下代码的执行,继续检测下一账号
//
if m_IsCancel then
Continue;
// if not NMPOP3.Connected then
// continue;
//
// 此时登录成功,以下开始获取邮件信息
// 首先根据选项来决定是否记住新用户名和密码
//
if (frmLogin.chkStore.Checked = True) and (m_IsReLogin = True) then
begin
pAccount^.m_User := frmLogin.edtUser.text;
pAccount^.m_Pwd := frmLogin.edtPwd.text;
UpdateLeftView();
UpdateTopView();
end;
//
// 加入连接日志
//
AddLog('正在读取邮件列表...', INFO);
AddLog('收件箱中共有邮件 ' + IntToStr(NMPOP3.MailCount), INFO );
//
// 然后首先获取邮件数目
//
for mail_index := 1 to NMPOP3.MailCount do
begin
if m_IsStop then
begin
AddLog('用户取消操作', WARNING);
exit;
end;
if not NMPOP3.Connected then
NMPOP3.Connect();
//
// 加入检测日志
//
AddLog('正在分析第 ' + IntToStr(mail_index) + ' 封邮件', INFO);
//
// 检测邮件是否已经存在
//
tmp := NMPOP3.UniqueID(mail_index);
if IsMailExist(NMPOP3.UniqueID(mail_index), pAccount^) then
continue;
// 有新邮件
m_HaveNewmail := True;
//
// 加入检测日志
//
AddLog('正在接收第' + IntToStr(mail_index) + ' 的摘要...', INFO);
//
// 获取邮件摘要
//
NMPOP3.GetSummary(mail_index);
//
// 如果不存在,给新邮件分配空间并初始化
//
new(pEmail);
pEmail^.m_Id := NMPOP3.UniqueID(mail_index);
pEmail^.m_From := NMPOP3.Summary.From;
pEmail^.m_Subject := NMPOP3.Summary.Subject;
pEmail^.m_Size := IntToStr(NMPOP3.Summary.Bytes);
pEmail^.m_Date := NMPOP3.Summary.Header.Values['Date'];
pEmail^.m_IsNew := True;
NMPOP3.Disconnect();
//
// 加入到新邮件链表和账号邮件信息列表中
//
lstNewMail.Add(pEmail);
pAccount^.m_lstEmail.Add(pEmail);
//
// 如果是当前活动账号,更新显示列表
//
if act_index = frmRight.frmTop.tabAccount.TabIndex then
begin
frmRight.frmTop.AddToMailList(pEmail^);
UpdateLeftView();
end;
end; // end of storing new mails for one account;
//
// 加入连接日志
//
AddLog('账号 ' + pAccount^.m_Account + ' 共有新邮件 ' + IntToStr(lstNewMail.count), INFO );
AddLog('正在从服务器 ' + pAccount^.m_Server + ' 断开连接...', INFO);
AddLog('************************完成对 ' + pAccount^.m_Account + '的检测******************************', SCHEDULE);
//
// 将新邮件编辑短信发送到手机
//
if (pAccount^.m_SendToMobile) and (lstNewMail.Count > 0) then
begin
//
// 发送短信日志在 SendSMS函数中
//
frmRight.frmBottom.SetStatus('正在向手机 ' + pAccount^.m_Mobile + '发送短信');
SendSMS(lstNewMail, pAccount^.m_Mobile);
end;
end; // end of checking mail for all the accounts;
//
// 如果有新邮件,播放声音
//
if (Config.m_Config.m_WaveFile <> '') and (m_HaveNewMail) then
sndPlaySound(PChar(Config.m_Config.m_WaveFile), SND_ASYNC);
//sndPlaySound(PChar(edtWaveFile.Text), SND_ASYNC);
//
// 设置当前状态
//
frmRight.frmBottom.SetStatus('空闲');
end;
//
// 将 lst 中的邮件编辑短信发送到手机 Mobile 上
//
procedure TfrmMain.SendSMS(lst: TList; Mobile: string);
var
i : integer;
strSMS : string;
strLog : string;
pEmail : ^TEmailInfo;
begin
//
// 加入发送短消息日志
//
AddLog('###################开始向手机 ' + Mobile + ' 发送短消息######################', SMS);
if length(Mobile) <> 11 then
begin
ShowMessage('目标手机号不正确,发送短信失败!');
AddLog('目标手机号不正确,发送短信失败!', ERROR);
exit;
end;
if length(Config.m_Config.m_SMSCenter) <> 13 then
begin
ShowMessage('短信中心地址不正确,发送短信失败!');
AddLog('短信中心地址不正确,发送短信失败!', ERROR);
exit;
end;
//
// 打开端口
//
if not OpenPort() then
exit;
//
// 初始化短消息,指定编码模式和短消息中心地址
//
IniSMS();
for i := 0 to lst.Count - 1 do
begin
pEmail := lst.Items;
strLog := '向手机 ' + Mobile + ' 发送短信息:';
if Config.m_Config.m_SMSMode = 'Text' then
begin
strSMS := 'you have new mail from ' + pEmail^.m_From;
strSMS := strSMS + 'the subject is ' + pEmail^.m_Subject;
SendInEncodeText(strSMS, Mobile);
end
else
begin
strSMS := strSMS + '您有新邮件来自 ' + pEmail^.m_From;
strSMS := strSMS + '邮件主题是: ' + pEmail^.m_Subject;
SendInEncodePdu(strSMS, Mobile);
end;
strLog := strLog + strSMS;
//
// 加入连接日志
//
AddLog(strLog, SMS);
end;
//
// 关闭串口
//
MSComm.PortOpen := False;
AddLog('###################向手机' + Mobile + '发送短消息完毕,共发送' + IntToStr(lst.Count) + '条短消息#####################', SMS);
end;
//
// 检测 ID 为 MsgId的邮件在 act 的邮链表中是否已经存在,如果存在,返回 true
//
function TfrmMain.IsMailExist(MsgId: string;
act: TAccountInfo): Boolean;
var
i : integer;
pEmail : ^TEmailInfo;
begin
for i := 0 to act.m_lstEmail.Count -1 do
begin
pEmail := act.m_lstEmail.Items;
if MsgId = pEmail^.m_Id then
begin
IsMailExist := true;
exit
end;
end;
IsMailExist := false;
end;
procedure TfrmMain.NMPOP3ConnectionFailed(Sender: TObject);
begin
ShowMessage('与服务器连接失败,请检查网络联接');
end;
procedure TfrmMain.NMPOP3Failure(Sender: TObject);
begin
AddLog('有错误发生,错误代码:' + IntToStr(NMPOP3.LastErrorNo), ERROR );
end;
//
// 登录失败时触发此事件
//
procedure TfrmMain.NMPOP3AuthenticationFailed(var Handled: Boolean);
begin
//
// 捕获异常,加入自己的处理代码
//
Handled := True;
if NMPOP3.Connected then
begin
NMPOP3.Abort();
NMPOP3.Disconnect();
end;
AddLog('用户 ' + NMPOP3.UserID + ' 登录失败,等待重新输入用户名和密码...', ERROR);
//
// 弹出登录对话框,重新输入用户名和密码
//
frmLogin.ShowModal();
m_IsCancel := not frmLogin.m_IsOk;
//
// 如果用户没有取消登录,则用新的用户名和密码重新尝试
//
if not m_IsCancel then
begin
NMPOP3.UserID := frmLogin.edtUser.Text;
NMPOP3.Password := frmLogin.edtPwd.Text;
NMPOP3.Connect();
end;
end;
//
// 记录日志
//
procedure TfrmMain.AddLog(msg: string; const LogTp : integer);
var
Item : TListItem;
begin
Item := frmRight.frmBottom.lstLog.Items.Add();
Item.Caption := msg;
Item.ImageIndex := LogTp;
frmRight.frmBottom.lstLog.Scroll(0, 20 );
frmRight.frmBottom.lstLog.Refresh();
end;
procedure TfrmMain.NMPOP3InvalidHost(var Handled: Boolean);
begin
AddLog('无法连接服务器...', ERROR);
end;
procedure TfrmMain.NMPOP3Success(Sender: TObject);
begin
AddLog('连接成功', INFO);
end;
procedure TfrmMain.NMPOP3HostResolved(Sender: TComponent);
begin
if m_IsFirstConn then
begin
AddLog('判断主机 ' + NMPOP3.Host + ' 为 [' + NMPOP3.RemoteIP + ']', INFO);
m_IsFirstConn := False;
end;
end;
//
// 当前活动账号改变时触发此事件
//
procedure TfrmMain.frmToptabAccountChange(Sender: TObject);
var
pAccount : ^TAccountInfo;
begin
//
// 更新左侧视图
//
UpDateLeftView();
//
// 更新邮件显示列表
//
pAccount := Account.m_lstAccount.Items[frmRight.frmTop.tabAccount.TabIndex];
UpdateEmailList(pAccount^.m_lstEmail);
end;
//
// 更新当前账号的邮件列表
//
procedure TfrmMain.UpdateEmailList(lst : TList);
begin
frmRight.frmTop.lsvEmail.Clear();
frmRight.frmTop.AddToMailList(lst);
end;
//
// 定时检测事件
//
procedure TfrmMain.TimCheckTimer(Sender: TObject);
begin
TimCheck.Enabled := False;
TimShow.Enabled := False;
StartCheckMail();
m_CheckTime := Time;
TimCheck.Enabled := True;
if Account.m_lstAccount = nil then
exit;
if Account.m_lstAccount.Count = 0 then
exit;
TimShow.Enabled := True;
end;
//
// 刷新当前时间
//
procedure TfrmMain.TimShowTimer(Sender: TObject);
var
LastTime : TTime;
begin
if Config.m_Config.m_Interval < 1 then
Config.m_Config.m_Interval := 1;
LastTime := timCheck.Interval / (1000 * 3660 * 24) + m_CheckTime - Time;
if LastTime < 30 / (60 * 60 * 24) then
frmRight.frmBottom.labLastTime.Font.Color := clRed
else
frmRight.frmBottom.labLastTime.Font.Color := clBlack;
frmRight.frmBottom.labLastTime.Caption := '剩余时间:' + TimeToStr(LastTime);
end;
procedure TfrmMain.tbtnAccountClick(Sender: TObject);
begin
MnAccountClick(Sender);
end;
procedure TfrmMain.tbtnConfigClick(Sender: TObject);
begin
MnConfigClick(Sender);
end;
procedure TfrmMain.tbtnStopClick(Sender: TObject);
begin
m_IsStop := True;
end;
procedure TfrmMain.tbtnExitClick(Sender: TObject);
begin
MnExitClick(Sender);
end;
procedure TfrmMain.MnExitClick(Sender: TObject);
begin
Application.Terminate();
end;
//
// 自定义消息, 表示数据读取完毕,
// 注意project中,frmAccount, frmConfig两个顺取不能更改
//
procedure TfrmMain.IniFinished(var Msg: TMessage);
var
pAccount : ^TAccountInfo;
begin
//
// 要先更新上部视图,然后再更新左视图
//
UpdateTopView();
UpdateLeftView();
//
// 更新邮件列表
//
if Account.m_lstAccount = nil then
exit;
pAccount := Account.m_lstAccount.Items[frmRight.frmTop.tabAccount.TabIndex];
UpdateEmailList(pAccount^.m_lstEmail);
//
// 程序启动时马上开始检测邮件
//
TimCheck.OnTimer(self);
end;
//
// 托盘图标响应事件
//
procedure TfrmMain.OnNotify(var Msg: TMessage);
var
pos : TPoint;
begin
case Msg.LParam of
WM_LBUTTONDBLCLK: // 双击事件
begin
frmMain.Visible := True ;
Shell_NotifyIcon(NIM_DELETE,@NotifyIcon);
Application.Restore();
SetForegroundWindow(frmMain.Handle);
end;
WM_RBUTTONUP: // 右键点击
begin
GetCursorPos(pos);
frmMain.PopupMenu1.Popup(pos.X, pos.Y);
end;
End;
end;
procedure TfrmMain.tbtnScheduleClick(Sender: TObject);
begin
MnScheduleClick(Sender);
end;
procedure TfrmMain.FormDestroy(Sender: TObject);
begin
Shell_NotifyIcon(NIM_DELETE,@NotifyIcon);
end;
//
// 应用程序最小化时调用此函数
//
procedure TfrmMain.OnAppMinimize(Sender: TObject);
begin
if Config.m_Config.m_Hide then
begin
frmMain.Visible := False;
//
// 把设置好的变量NotifyIcon加入到系统中以便处理
//
Shell_NotifyIcon(NIM_ADD,@NotifyIcon);
end;
end;
procedure TfrmMain.ppMAccountClick(Sender: TObject);
begin
MnAccountClick(Sender);
end;
procedure TfrmMain.ppMConfigClick(Sender: TObject);
begin
MnConfigClick(Sender);
end;
procedure TfrmMain.ppMCheckClick(Sender: TObject);
begin
MnCheckClick(Sender);
end;
procedure TfrmMain.ppMStopClick(Sender: TObject);
begin
MnStopClick(Sender);
end;
procedure TfrmMain.MnStopClick(Sender: TObject);
begin
m_IsStop := True;
end;
procedure TfrmMain.MnScheduleClick(Sender: TObject);
begin
Config.m_Config.m_Hide := True;
Application.Minimize();
end;
procedure TfrmMain.ppMRestoreClick(Sender: TObject);
var
msg : TMessage;
begin
msg.LParam := WM_LBUTTONDBLCLK;
OnNotify(msg);
end;
procedure TfrmMain.ppMExitClick(Sender: TObject);
begin
MnExitClick(Sender);
end;
//
// 打开串口
//
function TfrmMain.OpenPort: Boolean;
begin
//
// 更新MSComm的设置
//
try
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;
MSComm.InBufferSize := 1024; // 指定接收缓冲区大小
MSComm.InBufferCount := 0; // 清空接收缓冲区
MSComm.InputMode := 1; // 设置数据获取方式
MSComm.InputLen := 0; // 设置读取方式
MSComm.PortOpen := True; // 打开指定的串口
OpenPort := MSComm.PortOpen; // 反回值
except
OpenPort := False;
MessageBox(self.Handle, PChar('串口' + PChar(IntToStr(Mscomm.CommPort)) + '打开失败!,请更换其它串口'),'串口打开失败',MB_OK);
end;
end;
//
// 初始化短信息设置
//
procedure TfrmMain.IniSMS;
var
SendData : string;
begin
//
// 先判断串口是否打开
//
if not MSComm.PortOpen then
exit;
//
// 设置编码模式,其中Text=1, pdu = 0
//
if Config.m_Config.m_SMSMode = 'Text' then
SendData := 'AT+CMGF=1' + chr(13) // Text
else
SendData := 'AT+CMGF=0' + chr(13); // Pdu
MSComm.Output := SendData;
//
// 设置短信中心号码
//
SendData := 'AT+CSCA="' + Config.m_Config.m_SMSCenter + '"' + chr(13);
MSComm.Output := SendData;
end;
//
// Text模式编码
//
procedure TfrmMain.SendInEncodeText(sms, mobile: string);
var
strOut : string; // 定义成string型,一个字符用一个字节来表示
begin
strOut := 'AT+CMGS="' + mobile + '"' + chr(13); // chr(13)是回车
MSComm.Output := strOut;
strOut := sms + chr(26); // chr(26) 是 ctrl + z
MSComm.Output := strOut;
end;
//
// Pdu模式编码
//
procedure TfrmMain.SendInEncodePdu(sms, mobile: string);
var
Widesms : WideString; // 定义成WideString型,每个字符占两上字节
SendData : string;
tmp : string;
len : integer;
begin
//
// 参考pdu串 08 91 683108701305F0 11 00 0B 91 3176378290F9 00 00 00 02 C834
//
SendData := 'AT+CMGS="';
SendData := SendData + '0891';
//
// 每两位交换构造短信中心串
//
tmp := ExchangeCode(Config.m_Config.m_SMSCenter);
SendData := SendData + tmp;
SendData := SendData + '11000B91';
//
// 每两位交换构造接收手机号码串
//
tmp := ExchangeCode(mobile);
SendData := SendData + tmp;
SendData := Senddata + '0000A7';
//
// 将中文GB2312编码转换为代码页为CP936的Unicode编码
//
Widesms := WideString(sms);
tmp := EncodeGb(Widesms);
//
// 此处为Widesms 的长度,不是sms的长度!
//
len := length(Widesms);
SendData := SendData + IntToStr(len) + tmp;
SendData := SendData + '"' + chr(13);
//
// Pdu串构造完毕,发送
//
MSComm.Output := SendData;
end;
//
// 将中文GB2312编码转换为代码页为CP936的Unicode编码
//
function TfrmMain.EncodeGb(var s: WideString): String;
var
i,len:Integer;
cur:Integer;
t:String;
begin
Result:='';
len:=Length(s);
i:=1;
while i<=len do
begin
cur:=ord(s);
//BCD转换
FmtStr(t,'%4.4X',[cur]);
Result:=Result+t;
inc(i);
end;
end;
//
// 用来交换移位
//
function TfrmMain.ExchangeCode(src: string): string;
var
Len, i : integer;
tmp : string;
begin
Len := length(src);
if (len <> 11) and (len <> 13) then
begin
ExchangeCode := '';
exit;
end;
src := src + 'F';
i := 1;
while i<=len do
begin
tmp := tmp + src[i + 1] + src;
inc(i, 2);
end;
ExchangeCode := tmp;
end;
end.