前言:
现在很多STMP服务器在发送邮件时均需重新认证一遍,而Delphi的TNMSMTP控件对它没有很“可视化”的支持,使很多人在开发过程中大打问号。
由于前段时间在做《CSDN
查询助手》的时候,使用的也是需认证的服务器(163.com)。从其它地方摘取了部分代码得以解决,现在此发布与大家共享。
实现:
1、在NMSMTP的OnConnect事件中添加代码:
var strUserName, strPassword: String;
begin
strUserName := EncodeString(''CoolSlob'');//CoolSlob是服务器的帐号
strPassword := EncodeString(''Password'');//Password是密码
{进行认证,输入编码后的用户名、密码}
nmsmtp1.Transaction(''EHLO'') ;
nmsmtp1.Transaction(''AUTH LOGIN'');
nmsmtp1.Transaction(strUserName);
nmsmtp1.Transaction(strPassword);
StatusBar1.SimpleText := ''连接成功'';
end;
2、EncodeString函数实现过程:
{对参数Decoded字符串进行Base64编码,返回编码后的字符串}
function EncodeString(Decoded:string):String;
var
mmTemp,mmDecoded:TMemoryStream;
strTemp:TStrings;
begin
mmTemp := TMemoryStream.Create;
mmDecoded:=TMemoryStream.Create;
strTemp:=TStringList.Create;
strTemp.Add(Decoded);
strTemp.SaveToStream(mmTemp);
mmTemp.Position := 0;
{剔除mmTemp从strTemp中带来的字符#13#10}
mmDecoded.CopyFrom(mmTemp,mmTemp.Size-2);
{对mmDecoded进行Base64编码,由mmTemp返回编码后的结果}
EncodeBASE64(mmTemp,mmDecoded);
{获得Base64编码后的字符串}
mmTemp.Position:=0;
strTemp.LoadFromStream(mmTemp);
{返回结果必须从strTemp[0]中获得,如果使用strTemp.Text会
带来不必要的字符#13#10}
Result:=strTemp[0];
end;
3、EncodeBASE64函数实现过程:
function EncodeBASE64(Encoded: TMemoryStream ; Decoded: TMemoryStream): Integer;
const
_Code64: String[64] =
(''ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'');
var
I: LongInt;
B: array[0..2279] of Byte;
J, K, L, M, Quads: Integer;
Stream: string[76];
EncLine: String;
begin
Encoded.Clear;
Stream := '''';
Quads := 0;
{为提高效率,每2280字节流为一组进行编码}
J := Decoded.Size div 2280;
Decoded.Position := 0;
{对前J*2280个字节流进行编码}
for I := 1 to J do
begin
Decoded.Read(B, 2280);
for M := 0 to 39 do
&n