uCommon.pas
上传用户:yjb1804
上传日期:2021-01-30
资源大小:3105k
文件大小:9k
源码类别:

Email服务器

开发平台:

Delphi

  1. unit uCommon;
  2. interface
  3. uses
  4.   Classes,SysUtils,Forms,Dialogs,Windows,ComObj,ActiveX,SHDocVw,Messages,SyncObjs;
  5.   
  6. //{$DEFINE DEBUG}
  7. const
  8.   Decimals=['0'..'9'];
  9.   IdentifyChar=['0'..'9','a'..'z','A'..'Z','_'];
  10.   WM_PREVINSTRUN    = WM_USER + 522;
  11.   WM_SHOW_TIP_FORM  = WM_USER + 523;
  12.   INST_NAME='EMail V1.0.0 By Wp';
  13.   APP_XML='EmailServers.xml';
  14.   PATH_APP='{APP}';
  15.   PATH_SYS='{SYS}';
  16.   PATH_TEMP='{TEMP}';
  17.   
  18. type
  19.   PPop3LoginInfo=^TPop3LoginInfo;
  20.   TPop3LoginInfo=record
  21.     FPopServer,
  22.     FUserName,
  23.     FPwd:string[225];
  24.     FPort:Integer; //added by wp 2009-03-05
  25.   end;
  26.   PPopInfo=^TPopInfo;
  27.   TPopInfo=record
  28.     EMailAddr:string[255];
  29.     pwd:string[16];
  30.     saveto:string[255];
  31.     pop3Server:string[255];
  32.   end;
  33.   PContactAddress=^TContactAddress;
  34.   TContactAddress=record
  35.     Email:string[255];
  36.     displayname:string[20];
  37.   end;
  38.   TEMailAddress=class
  39.     class  function IsEmail(addr:string):Boolean;
  40.     class  function EmailSever(addr:string):string;
  41.     class  function SMTPEmailSever(addr:string):string;
  42.     class  function POP3EmailSever(addr:string):string;
  43.   end;
  44.   //全局函数
  45.   function AppPath:string;
  46.   function SysPath:string;
  47.   function TempPath:string;
  48.   function GetFullPath(path:string):string;
  49.   procedure WriteLog(msg:string);
  50.   procedure Split(spliter,SrcStr:string;List:TStrings;CaseinSense:Boolean=False);
  51.   function Join(spliter:string;List:TStrings):string;
  52.   function PartStr(AStr:string;ASpliter:string;Behind:Boolean=false):string;
  53.   function GenalFileName:string;
  54.   procedure SetHtml(const WebBrowser:TWebBrowser; const Html: string);
  55.   procedure MsgBoxWarn(Msg:string);
  56.   procedure MsgBoxError(Msg:string);
  57.   function MsgBoxYesOrNo(Msg:string):Integer;
  58.   
  59.   function StrBeginWith(StrBegin,Str:string):Boolean;
  60.   function StrEndWith(StrEnd,Str:string):Boolean;
  61.   function MeasureFileSize(Path:string):Int64;
  62.   function FileSizeInKB(Path:string):string;
  63.   function SysTempDir:string;
  64. implementation
  65. {$IFDEF DEBUG}
  66. var
  67.   CS:TCriticalSection;
  68. {$Endif}
  69.  //============================全局函数======================================
  70. function AppPath:string;
  71. begin
  72.   Result:=IncludeTrailingPathDelimiter(ExtractFileDir(ParamStr(0)));
  73. end;
  74. procedure WriteLog(msg:string);
  75. {$IFDEF DEBUG}
  76.  var
  77.   f:TextFile;
  78. {$ENDIF}
  79. begin
  80.   {$IFDEF DEBUG}
  81.   CS.Acquire;
  82.   try
  83.     AssignFile(f,AppPath+'log.txt');
  84.     if FileExists(AppPath+'log.txt') then
  85.       Append(f)
  86.     else
  87.       Rewrite(f);
  88.     Writeln(f,msg);
  89.     Flush(f);
  90.     CloseFile(f);
  91.   finally
  92.     CS.Release;
  93.   end;
  94.   {$ENDIF}
  95. end;
  96. function SysPath:string;
  97. var
  98.   buf:array[0..MAX_PATH]of AnsiChar;
  99. begin
  100.   FillChar(buf[0],MAX_PATH+1,0);
  101.   GetSystemDirectory(@buf[0],MAX_PATH+1);
  102.   Result:=StrPas(buf);
  103.   Result:=IncludeTrailingPathDelimiter(Result) ;
  104. end;
  105. function TempPath:string;
  106. var
  107.   buf:array[0..MAX_PATH]of AnsiChar;
  108. begin
  109.   FillChar(buf[0],MAX_PATH+1,0);
  110.   GetTempPath(MAX_PATH+1,@buf[0]);
  111.   Result:=StrPas(buf);
  112.   Result:=IncludeTrailingPathDelimiter(Result) ;
  113. end;
  114. function GetFullPath(path:string):string;
  115. begin
  116.   path:= StringReplace(path,PATH_APP,AppPath,[rfReplaceAll, rfIgnoreCase]);
  117.   path:=StringReplace(path,PATH_SYS,SysPath,[ rfReplaceAll,rfIgnoreCase]);
  118.   Result:=StringReplace(path,PATH_TEMP,TempPath,[ rfReplaceAll,rfIgnoreCase]);
  119. end;
  120. procedure Split(spliter,SrcStr:string;List:TStrings;CaseinSense:Boolean=False);
  121. var
  122.   PSrc,PSrcTemp,PSpliter:PAnsiChar;
  123.   I:Integer;
  124.   Dest:string;
  125. begin
  126.   if CaseinSense then
  127.   begin
  128.     SrcStr:=UpperCase(SrcStr);
  129.     spliter:=UpperCase(spliter);
  130.   end;
  131.   
  132.   I:=0;
  133.   PSrcTemp:=PChar(SrcStr);
  134.   PSrc:=PChar(SrcStr);
  135.   PSpliter:=PChar(spliter);
  136.   repeat
  137.     while (StrLComp(PSrcTemp,PSpliter,StrLen(PSpliter))<>0)and (StrLen(PSrcTemp)>=StrLen(PSpliter)) do
  138.     begin
  139.       PSrcTemp:=PSrcTemp+1;
  140.       Inc(I);
  141.     end;
  142.     
  143.     if I<>0 then
  144.     begin
  145.       SetString(Dest,PSrc,I);
  146.       List.Add(Dest);
  147.     end;
  148.     if StrLen(PSrcTemp)<StrLen(PSpliter) then
  149.         Exit
  150.     else
  151.       PSrc:=PSrcTemp+StrLen(PSpliter);
  152.   
  153.     PSrcTemp:=PSrc;
  154.     I:=0;
  155.   until(StrLen(PSrcTemp)<StrLen(PSpliter));
  156.   if (StrLen(PSrc)<>0) and (I<>0)then
  157.   begin
  158.       SetString(Dest,PSrc,I);
  159.       List.Add(Dest);
  160.   end;
  161. end;
  162. function Join(spliter:string;List:TStrings):string;
  163. var
  164.   I:integer;
  165. begin
  166.   Result:='';
  167.   for I:=0  to List.Count-1 do
  168.     Result:=Result +List[I]+spliter;
  169. end;
  170. function PartStr(AStr:string;ASpliter:string;Behind:Boolean=false):string;
  171. var
  172.   post:Integer;
  173. begin
  174.   post:=Pos(ASpliter,AStr);
  175.   if post=0 then
  176.     Result:=AStr
  177.   else
  178.   begin
  179.     if Behind then
  180.       Result:=Copy(AStr,Post+length(ASpliter),MAXWORD)
  181.     else
  182.       Result:= Copy(AStr,0,Post-1)
  183.   end;
  184. end;
  185. function GenalFileName:string;
  186. var
  187.   TmpGUID: TGUID;
  188. begin
  189.   Result:='';
  190.   if CoCreateGUID(TmpGUID) = S_OK then
  191.     Result := GUIDToString(TmpGUID)
  192.   else
  193.     Result:=FormatDateTime('yy-mm-dd-hh-nn-ss',now)
  194. end;
  195. procedure SetHtml(const WebBrowser:TWebBrowser; const Html: string);
  196. var
  197.   Stream: IStream;
  198.   hHTMLText: HGLOBAL;
  199.   psi: IPersistStreamInit;
  200. begin
  201.   if not Assigned(WebBrowser.Document) then  WebBrowser.Navigate('about:blank');
  202.   
  203.   hHTMLText := GlobalAlloc(GPTR, Length(Html) + 1);
  204.   {$WARNINGS OFF}
  205.   if 0 = hHTMLText then RaiseLastWin32Error;
  206.   {$WARNINGS ON}
  207.   CopyMemory(Pointer(hHTMLText),
  208.   PChar(Html), Length(Html));
  209.   OleCheck(CreateStreamOnHGlobal
  210.   (hHTMLText, True, Stream));
  211.   try
  212.     OleCheck(WebBrowser.Document.
  213.     QueryInterface(IPersistStreamInit, psi));
  214.     try
  215.       OleCheck(psi.InitNew);
  216.       OleCheck(psi.Load(Stream));
  217.     finally
  218.       psi := nil;
  219.     end;
  220.   finally
  221.     Stream := nil;
  222.   end;
  223. end;
  224. procedure MsgBoxWarn(Msg:string);
  225. var
  226.   P:TPoint;
  227. begin
  228.   GetCursorPos(P);
  229.   Dialogs.MessageDlgPos(msg,mtWarning,[mbYes],0,P.X,P.Y);
  230. end;
  231. procedure MsgBoxError(Msg:string);
  232. var
  233.   P:TPoint;
  234. begin
  235.   GetCursorPos(P);
  236.   Dialogs.MessageDlgPos(msg,mtError,[mbYes],0,P.X,P.Y);
  237. end;
  238. function MsgBoxYesOrNo(Msg:string):Integer;
  239. var
  240.   P:TPoint;
  241. begin
  242.   GetCursorPos(P);
  243.   Result:=Dialogs.MessageDlgPos(msg,mtInformation,mbOKCancel,0,P.X,P.Y);
  244. end;
  245. function StrBeginWith(StrBegin,Str:string):Boolean;
  246. var
  247.   I:Integer;
  248. begin
  249.   Result:=False ;
  250.   if Length(StrBegin)<=Length(Str) then
  251.   begin
  252.     Result:=True;
  253.     for I:=1 to Length(StrBegin) do
  254.     begin
  255.       if StrBegin[I]<>Str[I] then
  256.       begin
  257.         Result:=False;
  258.         Break;
  259.       end;
  260.     end;
  261.   end;
  262. end;
  263. function StrEndWith(StrEnd,Str:string):Boolean;
  264. var
  265.   I:Integer;
  266. begin
  267.   Result:=False ;
  268.   if Length(StrEnd)<=Length(Str) then
  269.   begin
  270.     Result:=True;
  271.     for I:=1 to Length(StrEnd) do
  272.     begin
  273.       if StrEnd[I]<>Str[Length(Str)-Length(StrEnd)+I] then
  274.       begin
  275.         Result:=False;
  276.         Break;
  277.       end;
  278.     end;
  279.   end;
  280. end;
  281. function MeasureFileSize(Path:string):Int64;
  282. var
  283.   f:file of Byte;
  284. begin
  285.   try
  286.     AssignFile(f,Path);
  287.     try
  288.       Reset(f);
  289.       Result:=FileSize(f);
  290.     finally
  291.       CloseFile(f);
  292.     end;
  293.   except
  294.     Result:=0;
  295.   end;
  296. end;
  297. function FileSizeInKB(Path:string):string;
  298. begin
  299.   Result:=IntToStr(MeasureFileSize(path)div 1024)+'KB';
  300. end;
  301. function SysTempDir:string;
  302. var
  303.   arr: array[0..MAX_PATH] of Char;
  304. begin
  305.   FillChar(arr[0],MAX_PATH+1,0);
  306.   if GetTempPath(MAX_PATH, arr)=0 then raise Exception.Create('无法获取系统临时文件夹路径');
  307.   Result:=StrPas(arr);
  308. end;
  309. //==============================================================================
  310. { TEMailAddress }
  311. class function TEMailAddress.EmailSever(addr: string): string;
  312. var
  313.   postion:Integer;
  314. begin
  315.   Result:='';
  316.   if not IsEmail(addr) then Exit;
  317.   postion:=Pos('@',addr);
  318.   Result:=Copy(addr,postion+1,MAX_PATH);
  319. end;
  320. class function TEMailAddress.IsEmail(addr: string): Boolean;
  321. var
  322.   I,postion:Integer;
  323.   part:string;
  324. begin
  325.   postion:=Pos('@',addr) ;
  326.   part:=Copy(addr,postion+1,MAX_PATH);
  327.   Result:=(postion>1) {and (not(addr[1] in Decimals))} and  (Length(part)>0);
  328.   if Result=False then Exit;
  329.   for I:=1 to postion-1 do
  330.     if not (addr[I] in IdentifyChar) then
  331.     begin
  332.       Result:=False;
  333.       Exit;
  334.     end;
  335.   postion:=Pos('.',part);
  336.   if (postion=0) or (postion=1) or (postion=Length(part)) then
  337.   begin
  338.     Result:=False;
  339.     Exit;
  340.   end;
  341.   for I:=1 to Length(part)  do
  342.   begin
  343.     if I=postion then Continue;
  344.     if not (part[I] in IdentifyChar) then
  345.     begin
  346.       Result:=False;
  347.       Exit;
  348.     end;
  349.   end;
  350. end;
  351. class function TEMailAddress.POP3EmailSever(addr: string): string;
  352. begin
  353.   Result:='pop3.'+EmailSever(addr);
  354. end;
  355. class function TEMailAddress.SMTPEmailSever(addr: string): string;
  356. begin
  357.   Result:='smtp.'+EmailSever(addr);
  358. end;
  359. {$IFDEF DEBUG}
  360. initialization
  361.   CS:=TCriticalSection.Create;
  362. finalization
  363.   CS.free;
  364. {$Endif}
  365. end.