熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

使用TNMSMTP控件在需認證服務器上發送郵件

2013-11-23 17:46:19  來源: Delphi編程 

  前言

  現在很多STMP服務器在發送郵件時均需重新認證一遍而Delphi的TNMSMTP控件對它沒有很可視化的支持使很多人在開發過程中大打問號

  由於前段時間在做《CSDN查詢助手》的時候使用的也是需認證的服務器(com)從其它地方摘取了部分代碼得以解決現在此發布與大家共享

  實現

  在NMSMTP的OnConnect事件中添加代碼

var  strUserName strPassword: String;
begin
  strUserName := EncodeString(CoolSlob);//CoolSlob是服務器的帳號
  strPassword := EncodeString(Password);//Password是密碼
  {進行認證輸入編碼後的用戶名密碼}
  nmsmtpTransaction(EHLO) ;
  nmsmtpTransaction(AUTH LOGIN);
  nmsmtpTransaction(strUserName);
  nmsmtpTransaction(strPassword);
  StatusBarSimpleText := 連接成功;
end;

  EncodeString函數實現過程

{對參數Decoded字符串進行Base編碼返回編碼後的字符串}
function EncodeString(Decoded:string):String;
var
    mmTempmmDecoded:TMemoryStream;
    strTemp:TStrings;
begin
    mmTemp := TMemoryStreamCreate;
    mmDecoded:=TMemoryStreamCreate;
    strTemp:=TStringListCreate;
    strTempAdd(Decoded);
    strTempSaveToStream(mmTemp);
    mmTempPosition := ;
    {剔除mmTemp從strTemp中帶來的字符##}
    mmDecodedCopyFrom(mmTempmmTempSize);
    {對mmDecoded進行Base編碼由mmTemp返回編碼後的結果}
    EncodeBASE(mmTempmmDecoded);
    {獲得Base編碼後的字符串}
    mmTempPosition:=;
    strTempLoadFromStream(mmTemp);
    {返回結果必須從strTemp[]中獲得如果使用strTempText會
    帶來不必要的字符##}
    Result:=strTemp[];
end;

  EncodeBASE函數實現過程

function EncodeBASE(Encoded: TMemoryStream ; Decoded: TMemoryStream): Integer;
const
    _Code: String[] =
        (ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/);
var
    I: LongInt;
    B: array[] of Byte;
    J K L M Quads: Integer;
    Stream: string[];
    EncLine: String;
begin
    EncodedClear;
    Stream := ;
    Quads := ;
    {為提高效率字節流為一組進行編碼}
    J := DecodedSize div ;
    DecodedPosition := ;
    {對前J*個字節流進行編碼}
    for I := to J do
    begin
        DecodedRead(B );
        for M := to do
        begin
            for K := to do
            begin
                L:= *M + *K;
                Stream[Quads+] := _Code[(B[L] div )+];
                Stream[Quads+] := _Code[(B[L] mod )* + (B[L+] div )+];
                Stream[Quads+] := _Code[(B[L+] mod )* + (B[L+] div )+];
                Stream[Quads+] := _Code[B[L+] mod +];
                Inc(Quads );
                if Quads = then
                begin
                    Stream[] := #;
                    EncLine := Stream+##;
                    EncodedWrite(EncLine[] Length(EncLine));
                    Quads := ;
                end;
            end;
        end;
    end;

    {對以為模的余數字節流進行編碼}
    J := (DecodedSize mod ) div ;
    for I := to J do
    begin
        DecodedRead(B );
        Stream[Quads+] := _Code[(B[] div )+];
        Stream[Quads+] := _Code[(B[] mod )* + (B[] div )+];
        Stream[Quads+] := _Code[(B[] mod )* + (B[] div )+];
        Stream[Quads+] := _Code[B[] mod +];
        Inc(Quads );
        {每行個字符}
        if Quads = then
        begin
            Stream[] := #;
            EncLine := Stream+##;
            EncodedWrite(EncLine[] Length(EncLine));
            Quads := ;
        end;
    end;
    {=補位}
    if (DecodedSize mod ) = then
    begin
        DecodedRead(B );
        Stream[Quads+] := _Code[(B[] div )+];
        Stream[Quads+] := _Code[(B[] mod )* + (B[] div )+];
        Stream[Quads+] := _Code[(B[] mod )* + ];
        Stream[Quads+] := =;
        Inc(Quads );
    end;

    if (DecodedSize mod ) = then
    begin
        DecodedRead(B );
        Stream[Quads+] := _Code[(B[] div )+];
        Stream[Quads+] := _Code[(B[] mod )* + ];
        Stream[Quads+] := =;
        Stream[Quads+] := =;
        Inc(Quads );
    end;

    Stream[] := Chr(Quads);
    if Quads > then
    begin
        EncLine := Stream+##;
        EncodedWrite(EncLine[] Length(EncLine));
    end;

    Result := EncodedSize;
end;


From:http://tw.wingwit.com/Article/program/Delphi/201311/25054.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.