回复人:linzi(林子)    (2001-4-19 10:46:00)  得0分 
//这是我写的一个演示程序,
//窗体上有一个BUTTON控件,一个LABEL控件,一个NMSMTP控件
//带密码险证的邮件发送程序需要BASE64编码,DecodeBase64和 EncodeBase64
//为解码和编码函数
//在263、163和SOHU上都能发送成功
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Psock, NMsmtp, ComCtrls;type
  TForm1 = class(TForm)
    NMSMTP1: TNMSMTP;
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure NMSMTP1Connect(Sender: TObject);
    procedure NMSMTP1InvalidHost(var Handled: Boolean);
    procedure NMSMTP1ConnectionFailed(Sender: TObject);
    procedure NMSMTP1Status(Sender: TComponent; Status: String);
    procedure NMSMTP1SendStart(Sender: TObject);
    procedure NMSMTP1Success(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
//BaseTable为BASE64码表
const BaseTable:string='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';var
  Form1: TForm1;
  AuthSucc:boolean;// 是否需要密码验证
  function DecodeBase64(Source:string):string; //解码函数
  function FindInTable(CSource:char):integer;  //
  function EncodeBase64(Source:string):string; //编码函数
implementation{$R *.DFM}
//
function FindInTable(CSource:char):integer;
begin
  result:=Pos(string(CSource),BaseTable)-1;
end;
////
function DecodeBase64(Source:string):string;
var
  SrcLen,Times,i:integer;
  x1,x2,x3,x4,xt:byte;
begin
  result:='';
  SrcLen:=Length(Source);
  Times:=SrcLen div 4;
  for i:=0 to Times-1 do
  begin
    x1:=FindInTable(Source[1+i*4]);
    x2:=FindInTable(Source[2+i*4]);
    x3:=FindInTable(Source[3+i*4]);
    x4:=FindInTable(Source[4+i*4]);
    x1:=x1 shl 2;
    xt:=x2 shr 4;
    x1:=x1 or xt;
    x2:=x2 shl 4;
    result:=result+chr(x1);
    if x3= 64 then break;
    xt:=x3 shr 2;
    x2:=x2 or xt;
    x3:=x3 shl 6;
    result:=result+chr(x2);
    if x4=64 then break;
    x3:=x3 or x4;
    result:=result+chr(x3);
  end;
end;
/////
function EncodeBase64(Source:string):string;
var
  Times,LenSrc,i:integer;
  x1,x2,x3,x4:char;
  xt:byte;
begin
  result:='';
  LenSrc:=length(Source);
  if LenSrc mod 3 =0 then Times:=LenSrc div 3
  else Times:=LenSrc div 3 + 1;
  for i:=0 to times-1 do
  begin
    if LenSrc >= (3+i*3) then
    begin
      x1:=BaseTable[(ord(Source[1+i*3]) shr 2)+1];
      xt:=(ord(Source[1+i*3]) shl 4) and 48;
      xt:=xt or (ord(Source[2+i*3]) shr 4);
      x2:=BaseTable[xt+1];
      xt:=(Ord(Source[2+i*3]) shl 2) and 60;
      xt:=xt or (ord(Source[3+i*3]) shr 6);
      x3:=BaseTable[xt+1];
      xt:=(ord(Source[3+i*3]) and 63);
      x4:=BaseTable[xt+1];
    end
    else if LenSrc>=(2+i*3) then
    begin
      x1:=BaseTable[(ord(Source[1+i*3]) shr 2)+1];
      xt:=(ord(Source[1+i*3]) shl 4) and 48;
      xt:=xt or (ord(Source[2+i*3]) shr 4);
      x2:=BaseTable[xt+1];
      xt:=(ord(Source[2+i*3]) shl 2) and 60;
      x3:=BaseTable[xt+1];
      x4:='=';
    end else
    begin
      x1:=BaseTable[(ord(Source[1+i*3]) shr 2)+1];
      xt:=(ord(Source[1+i*3]) shl 4) and 48;
      x2:=BaseTable[xt+1];
      x3:='=';
      x4:='=';
    end;
    result:=result+x1+x2+x3+x4;
  end;
end;
//////////
procedure TForm1.Button1Click(Sender: TObject);
var MailTo,MailBody:TStringList;
begin
Nmsmtp1.Host :='smtp.sohu.com';
nmsmtp1.Port :=25;
nmsmtp1.UserID :='linbch';//发信人的用户名,必须是真实的
nmsmtp1.ReportLevel :=1;
Nmsmtp1.TimeOut :=10000;
nmsmtp1.Connect ;    ///连接
if AuthSucc=true then ////验证成功
begin
  MailTo:=TStringList.Create;
  MailTo.Add('[email protected]');
  MailBody.Add('Hello it is a test');
  nmsmtp1.PostMessage.FromAddress:='[email protected]'; //发信人的电子邮件地址
  nmsmtp1.PostMessage.ToAddress :=MailTo;
  nmsmtp1.PostMessage.Body:=MailBody;
  nmsmtp1.PostMessage.Subject :='My test';
  Mailto.Clear ;
  //Mailto.Add('c:\a.txt');
  //Mailto.Add('c:\b.txt');
  //nmsmtp1.PostMessage.Attachments:=MailTo; 附件
  MailTo.Free ;
  MailBody.Free;
  nmsmtp1.SendMail;
end;
end;
procedure TForm1.NMSMTP1Connect(Sender: TObject);
begin
//////连接成功,下面用户认证过程
  label1.caption:=nmsmtp1.Status;
  if nmsmtp1.ReplyNumber = 250 then
    label1.caption:=nmsmtp1.Transaction('auth login'); //开始认证
  if nmsmtp1.ReplyNumber =334 then //返回值为334,让你输入用BASE64编码后的用户名
    label1.caption:=nmsmtp1.Transaction('YWFhYWE=');// 用户名aaaaa
  if nmsmtp1.ReplyNumber =334 then  // 返回值为334,让你输入用BASE64编码后的用户密码
    label1.caption:=nmsmtp1.Transaction('MTIzNDU2'); //密码为123456
  if nmsmtp1.ReplyNumber =235 then
  begin
    label1.caption:='successful';
    AuthSucc:=true;
  end;
  //showmessage(label1.caption);
end;procedure TForm1.NMSMTP1InvalidHost(var Handled: Boolean);
begin
  label1.caption :='Invalid Host';
end;procedure TForm1.NMSMTP1ConnectionFailed(Sender: TObject);
begin
label1.caption :='connect failed';
end;procedure TForm1.NMSMTP1Status(Sender: TComponent; Status: String);
begin
  label1.caption :=nmsmtp1.Status ;
end;procedure TForm1.NMSMTP1SendStart(Sender: TObject);
begin
  label1.Caption :='start send';
end;procedure TForm1.NMSMTP1Success(Sender: TObject);
begin
  label1.Caption:='send success!';
end;end.