关于SMTP的身份认证问题(200分)

  • 主题发起人 主题发起人 sherman
  • 开始时间 开始时间
S

sherman

Unregistered / Unconfirmed
GUEST, unregistred user!
我通常使用SAK的SMTP组件作为SMTP的客户端,但它不支持身份认证(Auth-Login)
我知道indy支持身份认证,所以想修改SAK的源代码,让他支持身份认证,但对
SMTP的协议中如何实现身份认证不是很了解,在RFC821规范中,没有身份认证
(Auth-Login)的说明,请问在那里有相关说明或请高手们帮我说明说明SMTP中的
身份认证实现机制和命令,谢谢
 
http://www.rfc-editor.org/rfc/rfc821.txt
 
to 三代坦克
能不能看完整问题再回答,RFC821,RFC1893等我都看过了,没有找到相关的身份
认证命令的说明
 
如果你用的是Delphi6的话,你可以打开它的Indy页的ISmtp控件的源代码来看看,它能
够支持身份验证的。要不你到这个网站去看看也行,那里也有说明smtp协议中如何进行
身份验证。
http://www.longen.com/
 
我去www.longen.com看了,他只是将RFC821翻译了一下,还是没有找到关于
身份认证方面的解释
 
我已经找到了身份认证的命令是auth login,但是在用
telnet serveraddress 25手工连接的时侯,帐号以及
密码的输入需要加密过的,请问加密算法和有否相关的
算法程序!
 
是mime编码,如smtp.263.net,输入auth login后,会出现
334 VXNlcm5hbWU6

334 UGFzc3dvcmQ6
分别就是"username"和"password"这两个字符串的mime编码。
所以在这两个提示下输入的username和password也要先mime编码。
 
我就是用这个,163,sina,都试过,发妹儿没问题。

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;
 
还有更简单的办法:
到http://www.nevrona.com/Indy/下载8.0版控件和DEMO,其中有邮件认证及发送例程
 
谢谢风间苍月的回答,我主要是想修改SakMail控件组,使他拥有身份认证的功能
所以需要关于base64 encode的编码原理,使用其它控件我当然有了,谢谢
 
没看清问题,我道歉.8-)

Base64的编码原理.你随便找个email控件就会有base64的编码函数.
 
后退
顶部