使用TNMSMTP控件在需认证服务器上发送邮件

    技术2022-05-11  105

    前言:

      现在很多STMP服务器在发送邮件时均需重新认证一遍,而Delphi的TNMSMTP控件对它没有很“可视化”的支持,使很多人在开发过程中大打问号。

      由于前段时间在做《查询助手》的时候,使用的也是需认证的服务器(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;

    声明:

      上述代码非本人所作,由于不知其原始出处,故仍作为“原创”!


    最新回复(0)