转贴:NMSMTP的密码认证解决方案 
const 
BaseTable = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; 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; 在SMTP.OnConnect事件中写身份验证. 
procedure TSendFile.NMSMTPConnect(Sender: TObject); 
begin {身份验证} 
if FSMTP.ReplyNumber = 250 then 
FSMTP.Transaction('auth login'); 
if FSMTP.ReplyNumber = 334 then 
begin 
FSMTP.Transaction(EncodeBase64(FUserID)); 
FSMTP.Transaction(EncodeBase64(FPassword)); 
end; 
end;