前言:
现在很多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 begin for K := 0 to 18 do begin L:= 57*M + 3*K; Stream[Quads+1] := _Code64[(B[L] div 4)+1]; Stream[Quads+2] := _Code64[(B[L] mod 4)*16 + (B[L+1] div 16)+1]; Stream[Quads+3] := _Code64[(B[L+1] mod 16)*4 + (B[L+2] div 64)+1]; Stream[Quads+4] := _Code64[B[L+2] mod 64+1]; Inc(Quads, 4); if Quads = 76 then begin Stream[0] := #76; EncLine := Stream+#13#10; Encoded.Write(EncLine[1], Length(EncLine)); Quads := 0; end; end; end; end;
{对以2280为模的余数字节流进行编码} J := (Decoded.Size mod 2280) div 3; for I := 1 to J do begin Decoded.Read(B, 3); Stream[Quads+1] := _Code64[(B[0] div 4)+1]; Stream[Quads+2] := _Code64[(B[0] mod 4)*16 + (B[1] div 16)+1]; Stream[Quads+3] := _Code64[(B[1] mod 16)*4 + (B[2] div 64)+1]; Stream[Quads+4] := _Code64[B[2] mod 64+1]; Inc(Quads, 4); {每行76个字符} if Quads = 76 then begin Stream[0] := #76; EncLine := Stream+#13#10; Encoded.Write(EncLine[1], Length(EncLine)); Quads := 0; end; end; {“=”补位} if (Decoded.Size mod 3) = 2 then begin Decoded.Read(B, 2); Stream[Quads+1] := _Code64[(B[0] div 4)+1]; Stream[Quads+2] := _Code64[(B[0] mod 4)*16 + (B[1] div 16)+1]; Stream[Quads+3] := _Code64[(B[1] mod 16)*4 + 1]; Stream[Quads+4] := '='; Inc(Quads, 4); end;
if (Decoded.Size mod 3) = 1 then begin Decoded.Read(B, 1); Stream[Quads+1] := _Code64[(B[0] div 4)+1]; Stream[Quads+2] := _Code64[(B[0] mod 4)*16 + 1]; Stream[Quads+3] := '='; Stream[Quads+4] := '='; Inc(Quads, 4); end;
Stream[0] := Chr(Quads); if Quads > 0 then begin EncLine := Stream+#13#10; Encoded.Write(EncLine[1], Length(EncLine)); end;
Result := Encoded.Size; end; |
关键词: 运用TNMSMTP控件在需认证服务器上发送邮件