转帖:(小新写的)
你要用什么方式发,smtp 或 pop3//这是我写的一个演示程序, 
//窗体上有一个BUTTON控件,一个LABEL控件,一个NMSMTP控件 
//带密码险证的邮件发送程序需要BASE64编码,DecodeBase64和 EncodeBase64 
//为解码和编码函数 
//在263、163和SOHU上都能发送成功 
unit Unit1; interface uses 
  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;