winsock отправка письма с вложением

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by realcoder, 13 Nov 2011.

  1. realcoder

    realcoder Member

    Joined:
    9 Dec 2010
    Messages:
    226
    Likes Received:
    11
    Reputations:
    4
    собственно сабж: хочу отправить письмо используюя только средства windows. набросал отправку письма на winsock:

    [cut]
    Code:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,winsock, StdCtrls;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        Button2: TButton;
        Memo2: TMemo;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    {ðåàëèçàöèÿ base64 àëãîðèòìà äëÿ ñòðîê. íå ìîÿ - âçÿë ñ torry.net}
    const
      B64Table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    
    function Base64Encode(const S: string): string;
    var
      InBuf: array[0..2] of Byte;
      OutBuf: array[0..3] of Char;
      iI, iJ: Integer;
    begin
      SetLength(Result, ((Length(S) + 2) div 3) * 4);
      for iI := 1 to ((Length(S) + 2) div 3) do begin
        if Length(S) < (iI * 3) then
          Move(S[(iI - 1) * 3 + 1], InBuf, Length(S) - (iI - 1) * 3)
        else
          Move(S[(iI - 1) * 3 + 1], InBuf, 3);
        OutBuf[0] := B64Table[((InBuf[0] and $FC) shr 2) + 1];
        OutBuf[1] := B64Table[(((InBuf[0] and $3) shl 4) or ((InBuf[1] and $F0) shr 4)) + 1];
        OutBuf[2] := B64Table[(((InBuf[1] and $F) shl 2) or ((InBuf[2] and $C0) shr 6)) + 1];
        OutBuf[3] := B64Table[(InBuf[2] and $3F) + 1];
        Move(OutBuf, Result[(iI - 1) * 4 + 1], 4);
      end;
      if Length(S) mod 3 = 1 then begin
        Result[Length(Result) - 1] := '=';
        Result[Length(Result)] := '=';
      end else if Length(S) mod 3 = 2 then
        Result[Length(Result)] := '=';
    end;
    
    
    
    {ðåàëèçàöèÿ base64 äëÿ ôàéëîâ. âçÿë ñ ñîðöôîðæà ñîðöû êîäèðîâøùèêà}
    procedure encode_f(filename:string);
    
    var input  : Array[0..2] of byte;
    var mid    : Array[0..5] of byte;
    var values : Array[0..3] of byte;
    var output : Array[0..3] of char;
    var b      : byte;
    var i      : integer;
    var fileop : File of byte;
    var fileex : File of char;
    var pad    : integer;
    var s      : string;
    var c      : char;
    var l      : integer;
    
    const CRLF : String = #13#10;
    
    begin
    System.Assign(fileop, filename);
        {$I-}
        System.Reset(fileop);
        {$I+}
           s := '.b64';
    
        System.Assign(fileex, filename + s);
        {$I-}
        System.Rewrite(fileex);
        {$I+}
    
        while not System.Eof(fileop) do begin
            { read 3 bytes from input file }
            i := 0;
            while (i < 3) and (not System.Eof(fileop)) do begin
                System.Read(fileop, b);
                input[i] := b;
                i := i + 1
            end;
    
            { Don't know if this is correct, but it seems to work }
            if i = 1 then begin { Couldn't get full array from file before end }
                input[1] := $00;
                input[2] := $00;
                pad := 2;
            end
            else if i = 2 then begin
                input[2] := $00;
                pad := 1;
            end;
    
            { [XXXXXXXX, XXXXXXXX, XXXXXXXX] }
            { [XXXXXX-XX, XXXX-XXXX, XX-XXXXXX] }
            mid[0] := input[0] shr 2;           { from XXXXXXXX to 00XXXXXX }
            mid[1] := (input[0] shl 4) and $30; { from XXXXXXXX to XXXX0000 to 00XX0000 }
            mid[2] := input[1] shr 4;           { from XXXXXXXX to 0000XXXX }
            mid[3] := (input[1] shl 2) and $3c; { from XXXXXXXX to XXXXXX00 to 00XXXX00 }
            mid[4] := input[2] shr 6;           { from XXXXXXXX to 000000XX }
            mid[5] := input[2] and $3f;         { from XXXXXXXX to 00XXXXXX }
    
            { [00XXXXXX, 00XXXXXX, 00XXXXXX, 00XXXXXX] }
            values[0] := mid[0];
            values[1] := mid[1] or mid[2];
            values[2] := mid[3] or mid[4];
            values[3] := mid[5];
    
    
            { switch bytes to get char values }
            for i := 0 to 3 do begin
                case values[i] of
                     0..25 : output[i] := char(byte('A') + values[i]);
                    26..51 : output[i] := char(byte('a') + (values[i] - 26));
                    52..61 : output[i] := char(byte('0') + (values[i] - 52));
                    62     : output[i] := '+';
                    63     : output[i] := '/';
                end;
            end;
    
            { write output }
            for i := 0 to 3 do begin
                l := l + 1;
    
                if l > 76 then begin
                    { The base64 standard defines a line break here as \r\n }
                    c := #13;
                    System.Write(fileex, c);
                    c := #10;
                    System.Write(fileex, c);
                    l := 1;
                end;
    
                System.Write(fileex, output[i]);
            end;
        end;
    
        { close input file }
        System.Close(fileop);
    
        { add padding to output }
        { BUG ALERT: if the lenhth of the line is 0 or 1 then the
                     padding will only eat the \r\n.
                     It will be fixed... eventually.
        }
        if pad > 0 then begin
            System.Seek(fileex, System.filePos(fileex) - pad);
    
            for i := 1 to pad do begin
                c := '=';
                System.Write(fileex, c);
            end;
        end;
    
        { close output file and exit }
        System.Close(fileex);
    
    end;
    
    
    
    
      function GetComputerNetName: string;    {îïðåäåëåíèå èìåíè êîìïà}
    var
      buffer: array[0..255] of char;
      size: dword;
    begin
      size := 256;
      if GetComputerName(buffer, size) then
        Result := buffer
      else
        Result := ''
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
    s:tsocket;
    sa:sockaddr_in;
    h:phostent;
    sendbuf,recvbuf:array[0..4095] of char;
    b64:file;
    res:integer;
    buf:string;
    begin
    
    s:=socket(af_inet,sock_stream,0);//ñîçäàåì ñîêåò
    //çàïîëíÿåì ñòðóêòóðó àäðåñà
    sa.sin_family:=af_inet;
    sa.sin_port:=htons(25);
    h:=gethostbyname('smtp.mail.ru');
    sa.sin_addr:=PInaddr(h^.h_addr^)^;
    connect(s,sa,sizeof(sa));//êîííåêò
    
    fillchar(sendbuf,4096,0);
    lstrcpy(sendbuf,'EHLO ') ;//ñîáèðàåì ïðèâåòñòâèå
    lstrcat(sendbuf,pchar(getcomputernetname));
    lstrcat(sendbuf,#13#10);
    send(s,sendbuf[0],lstrlen(sendbuf),0);//ïîñûëàåì ïðèâåòñòâèå
    memo1.Lines.Add(sendbuf);
    
    fillchar(recvbuf,4096,0);
    recv(s,recvbuf[0],4096,0);  //ïîëó÷àåì îòâåò
    memo1.Lines.Add(recvbuf);
    
    fillchar(recvbuf,4096,0);
    recv(s,recvbuf[0],4096,0);  //ïîñëå ïðèâåòñòâèÿ ñåðâåð äîëæåí ïîñëàòü ñïèñîê ïîääåðæèâàåìûõ ìåòîäîâ è ïàðàìåòðû
    memo1.Lines.Add(recvbuf);
    
    fillchar(sendbuf,4096,0);
    lstrcpy(sendbuf,'AUTH PLAIN'#13#10);//àâòîðèçóåìñÿ ìåòîäîì plain
    send(s,sendbuf[0],lstrlen(sendbuf),0);
    memo1.Lines.Add(sendbuf);
    
    fillchar(recvbuf,4096,0);
    recv(s,recvbuf[0],4096,0);  //ïîëó÷àåì îòâåò
    memo1.Lines.Add(recvbuf);
    if strtoint(copy(recvbuf,1,3))<>334 then//åñëè ñåðâåð æäåò îò íàñ ëîãèí è ïàðîëü - îí ïîøëåò êîä 334, åñëè ïðèñëàë äðóãîé êîä - ïðîèçîøëà îøèáêà
    begin
     showmessage('èçâèíèòå, íî ïðîèçîøåë îáëîì((');
     closesocket(s);
     exit;
     end;
    
    fillchar(sendbuf,4096,0);
    lstrcpy(sendbuf,pchar(base64encode(#00'v.v*v***'#00'*******')));//àâòîðèçóåìñÿ ìåòîäîì plain
    lstrcat(sendbuf,#13#10);
    send(s,sendbuf[0],lstrlen(sendbuf),0);
    memo1.Lines.Add(sendbuf);
    
    fillchar(recvbuf,4096,0);
    recv(s,recvbuf[0],4096,0);  //ïîëó÷àåì îòâåò
    memo1.Lines.Add(recvbuf);
    
    fillchar(sendbuf,4096,0);
    lstrcpy(sendbuf,'MAIL FROM:<v****@mail.ru>'#13#10);//îò êîãî
    send(s,sendbuf[0],lstrlen(sendbuf),0);
    memo1.Lines.Add(sendbuf);
    
    fillchar(recvbuf,4096,0);
    recv(s,recvbuf[0],4096,0);  //ïîëó÷àåì îòâåò
    memo1.Lines.Add(recvbuf);
    
    fillchar(sendbuf,4096,0);
    lstrcpy(sendbuf,'RCPT TO:<v******@mail.ru>'#13#10);//êîìó
    send(s,sendbuf[0],lstrlen(sendbuf),0);
    memo1.Lines.Add(sendbuf);
    
    fillchar(recvbuf,4096,0);
    recv(s,recvbuf[0],4096,0);  //ïîëó÷àåì îòâåò
    memo1.Lines.Add(recvbuf);
    
    
    fillchar(sendbuf,4096,0);
    lstrcpy(sendbuf,'DATA'#13#10);//íà÷èíàåì ïîñûëàòü ïèñüìî
    send(s,sendbuf[0],lstrlen(sendbuf),0);
    memo1.Lines.Add(sendbuf);
    
    
    fillchar(recvbuf,4096,0);
    recv(s,recvbuf[0],4096,0);  //ïîëó÷àåì îòâåò
    memo1.Lines.Add(recvbuf);
    
    if strtoint(copy(recvbuf,1,3))<>354 then//åñëè ñåðâåð æäåò îò íàñ òåêñò ïèñüìà - îí ïîøëåò êîä 354, åñëè ïðèñëàë äðóãîé êîä - ïðîèçîøëà îøèáêà
    begin
     showmessage('èçâèíèòå, íî ïðîèçîøåë îáëîì((');
     closesocket(s);
     exit;
     end;
    fillchar(sendbuf,4096,0);
    
    {ñîñòàâëÿåì rfc ïèñüìà}
    
    lstrcpy(sendbuf,'To: v.vov******'#13#10);//êîìó
    lstrcat(sendbuf,'From: vova <v.vov******>'#13#10);//îò êîãî
    lstrcat(sendbuf,'Subject: lol'#13#10);//òåìà
    lstrcat(sendbuf,'MIME-Version: 1.0'#13#10  );                    // Âåðñèÿ MIME
    lstrcat(sendbuf,'Content-Type: multipart/mixed;'#13#10);              // Òèï ñîäåðæèìîãî
    lstrcat(sendbuf,' boundary="----------E9F73DF8FFBD3"'#13#10#13#10);                   // Ðàçäåëèòåëü
    lstrcat(sendbuf,'__text_oll__'#13#10);//òåêñò ïèñüìà
    lstrcat(sendbuf,'------------E9F73DF8FFBD3'#13#10);//ðàçäåëèòåëü è çà íèì íà÷àëî ôàéëà
    lstrcat(sendbuf,'Content-Type: application/octet-stream;'#13#10);
    lstrcat(sendbuf,' name="all_com.cpp"'#13#10);//èìÿ
    lstrcat(sendbuf,'Content-transfer-encoding: base64'#13#10);//êîäèðîâàíèå
    lstrcat(sendbuf,'Content-Disposition: attachment;'#13#10);
    lstrcat(sendbuf,' filename="all_com.cpp"'#13#10);//åùå ðàç èìÿ
    send(s,sendbuf[0],lstrlen(sendbuf),0);
    memo1.Lines.Add(sendbuf);
    {äàëüøå èäåò çàêîäåíûé â base64 ôàéë}
    encode_f('all_com.cpp');
    memo2.Lines.LoadFromFile('all_com.cpp.b64');
    memo1.Text:=memo1.Text+memo2.Text;
    buf:=memo2.text;
    send(s,buf[1],length(buf),0);
    fillchar(sendbuf,4096,0);
    lstrcpy(sendbuf,'------------E9F73DF8FFBD3'#13#10'.'#13#10);//çàêàí÷èâàåì
    send(s,sendbuf,lstrlen(sendbuf),0);
    memo1.Lines.Add(sendbuf);
    fillchar(recvbuf,4096,0);
    recv(s,recvbuf[0],4096,0);  //ïîëó÷àåì îòâåò
    memo1.Lines.Add(recvbuf);
    
    
    fillchar(sendbuf,4096,0);
    lstrcpy(sendbuf,'RSET'#13#10);//ñáðàñûâàåì (âîçâðàùàåìñÿ ê ïåðâîìó ýòàïó)
    send(s,sendbuf[0],lstrlen(sendbuf),0);
    memo1.Lines.Add(sendbuf);
    
    
    fillchar(recvbuf,4096,0);
    recv(s,recvbuf[0],4096,0);  //ïîëó÷àåì îòâåò
    memo1.Lines.Add(recvbuf);
    
    fillchar(sendbuf,4096,0);
    lstrcpy(sendbuf,'QUIT'#13#10);//Âûõîäèì
    send(s,sendbuf[0],lstrlen(sendbuf),0);
    memo1.Lines.Add(sendbuf);
    
    
    fillchar(recvbuf,4096,0);
    recv(s,recvbuf[0],4096,0);  //ïîëó÷àåì îòâåò
    memo1.Lines.Add(recvbuf);
    
    closesocket(s);
    
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    var w:wsadata;
    begin
    wsastartup(makeword(2,2),w);//èíèò âèíñîêà
    end;
    
    
    end.
    
    к письму прикладываю файл исходника на си++.
    письмо приходит и видиться как бы с вложением, но размер вложения == -1 и при сохранении на диск==0.
    вот лог отправки
    Code:
    EHLO DNAPC
    
    220 smtp11.mail.ru ESMTP ready
    
    250-smtp11.mail.ru
    250-SIZE 31457280
    250-8BITMIME
    250-AUTH PLAIN LOGIN
    250 STARTTLS
    
    AUTH PLAIN
    
    334 
    
    AHYudm92YTE1******2piYzl=
    
    235 Authentication succeeded
    
    MAIL FROM:<*****@mail.ru>
    
    250 OK
    
    RCPT TO:<*****@mail.ru>
    
    250 Accepted
    
    DATA
    
    354 Enter message, ending with "." on a line by itself
    
    To: ******@mail.ru
    From: vova <v******@mail.ru>
    Subject: lol
    MIME-Version: 1.0
    Content-Type: multipart/mixed;
     boundary="----------E9F73DF8FFBD3"
    
    __text_oll__
    ------------E9F73DF8FFBD3
    Content-Type: application/octet-stream;
     name="all_com.cpp"
    Content-transfer-encoding: base64
    Content-Disposition: attachment;
     filename="all_com.cpp"
    
    I2luY2x1ZGUgPGlvc3RyZWFtPg0KI2luY2x1ZGUgPGlvbW
    FuaXA+DQojaW5jbHVkZSA8ZnN0cmVhbT4NCnVzaW5nIG5hbWVzcGFjZSBzdGQ7DQoNCi8vz/Du4u
    Xw/+XyIO/l8OXk5e3t7uUg4iD08+3q9uj+IPfo8evuIP3r5ezl7fLu4iBtDQovL+Xx6+ggbSDt5e
    ru8PDl6vLt7iDo6+gg5uUg7+Ds//L8IOL75OXr6PL8IO3lIPPg6+7x/A0KLy/08+3q9uj/IOjn4u
    X54OXyIO7hIP3y7uwNCi8v5fHoIOLxuCDu6iDv7uQg8fLw7uroIGFyciDi++Tl6//l8vH/IO/g7P
    /y/CDoIOIgbiD36PHr7iDx8vDu6iANCmludCAqKiBhbGxvY01lbW9yeUZvck1hdHJpeChkb3VibG
    UgbSwgaW50ICoqIGFyciwgaW50ICZuKQ0KeyANCglpZiAobSA8IDEgfHwgbSAhPSAoaW50KW0gfH
    wgSU5UX01BWCA8IG0pLy/v8O7i5fDq4CDq7vDw5ery7e7x8ugg7+Dw4Ozl8vDu4iANCgkJY291dD
    w8Ik5ldmVybmF5YSB2ZWxpY2hpbmEgblxuIjsvL+Xx6+gg7+Dw4Ozl8vD7IO3l6u7w8OXq8u375S
    CXIOLi7uTo7CDx7u7y4uXy8fLi8/755eUg8e7u4fnl7ejlDQoJZWxzZS8v5fHr6CDv4PDg7OXy8P
    sg7e7w7ODr/O375S4uLg0KCXsNCgkJdHJ5Ly/v8O7h8+XsIOL75OXr6PL8IO/g7P/y/A0KCQl7DQ
    oJCQlpZighKGFycj1uZXcgaW50ICpbKG4gPSBpbnQobSkpXSkpLy/l8evoIO3lIPPk4Ovu8fwg4v
    vk5evo8vwg7+Ds//L8DQoJCQkJY291dDw8Ik5ldmVybmF5YSB2ZWxpY2hpbmEgblxuIjsvL+L74u
    7k6Owg8e7u4fnl7ejlDQoJCQllbHNlDQoJCQkJbiA9IGludChtKTsvL+/w6PHi4Oji4OXsIO/l8O
    Xs5e3t7ukgbiwg7+Xw5eTg7e3u6SDv7iDx8fvr6uUsIOru6+j35fHy4u4g8fLw7uoNCgkJfQ0KCQ
    ljYXRjaCAoYmFkX2FsbG9jICYpIC8v4iDx6/P34OUg6PHq6/736PLl6/zt7ukg8ejy8+D26OggDQ
    oJCXsNCgkJCWFyciA9IE5VTEw7Ly/v8Ojx4uDo4uDl7CDv5fDl7OXt7e7pIGFyciDn7eD35e3o5S
    BudWxsDQoJCX0NCgkJaWYoYXJyID09IE5VTEwpLy/l8evoIGFycj09bnVsbCjv4Oz/8vwg7eUg4v
    vk5evo6+Dx/CkNCgkgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjb3V0PDwiTmV2ZXJuYXlhIH
    ZlbGljaGluYSBuXG4iOy8v4vvi5eTl7CDx7u7y4uXy8fLi8/756OUg8e7u4fnl7ejlDQogICAgIC
    AgICAgICB9DQoJfQ0KCXJldHVybiBhcnI7Ly/i5fDt5ewg8+rg5+Dy5ev8IO3gIOzg8vDo9vMNCn
    0NCi8vwiDn4OLo8ejs7vHy6CDu8iDv4PDg7OXy8OAgYkhhbmRJbnB1dCDr6OHuIOLi7uTo7CD96+
    Xs5e3y+yDs4PLw6Pb7IOLw8/ft8/4gYkhhbmRJbnB1dCA9PSB0cnVlDQovL+vo4e4g9+jy4OXsIO
    j1IOjnIPTg6evgDQppbnQgKiogc2V0TWF0cml4RWxlbWVudHMoYm9vbCBiSGFuZElucHV0LCBpZn
    N0cmVhbSAmaWZzLCBpbnQgKiogYXJyLCBpbnQgbiwgYm9vbCAmYkNvcnJlY3QpDQp7DQoJaW50IG
    ksIGo7Ly/k6/8g9ujq6+7iDQoJZm9yKGkgPSAwOyBpIDwgbiAmJiBiQ29ycmVjdDsgaSsrKfHy8O
    7q6A0KCXsNCgkJYXJyW2ldID0gbmV3IGludFtuXTsvL+L75OXr/+XsIO/g7P/y/CDv7uQg8uXq8/
    nz/iDx8vDu6vMNCgkJZm9yKGogPSAwOyBqIDwgbiAmJiBiQ29ycmVjdDsgaisrKS8v9+jy4OXsIP
    Hy8O7q8w0KCQl7DQoJCQlpZihiSGFuZElucHV0KS8v5fHr6CDi4u7k6Owg4vDz9+3z/iCXIPHv8O
    D46OLg5ewg8yDv7uv85+7i4PLl6/8NCgkJCXsNCgkJCQljb3V0PDwibWF0clsiPDxpICsgMTw8Il
    1bIjw8aiArIDE8PCJdID0gIjsNCgkJCQljaW4+PmFycltpXVtqXTsNCgkJCX0NCgkJCWVsc2UvL+
    Ig7/Du8uji7e7sIPHr8/fg5SCXIPfo8uDl7CDo5yD04Onr4A0KCQkJew0KCQkJCWlmKCFpZnMuZW
    9mKCkpLy/l8evoIOrz8PHu8CDiIPTg6evlIO3lIOTu8fLo4yDq7u324A0KCQkJCQlpZnM+PmFycl
    tpXVtqXTsvL/fo8uDl7CDo5yD04Onr4A0KCQkJCWVsc2UvL+jt4PflDQoJCQkJCWJDb3JyZWN0ID
    0gZmFsc2U7Ly/o5+Ll8fLo7CDu4SDu+Ojh6uUsIOfg7+jx4Owg4iDx7u7y4uXy8fLi8/758/4g7+
    Xw5ezl7e3z/iDn7eD35e3o5Q0KCQkJfQ0KCQl9DQoJfQ0KCXJldHVybiBhcnI7Ly/i5fDt5ewg8+
    rg5+Dy5ev8IO3gIOfg7+7r7eXt7fvpIOzg8fHo4g0KfQ0KDQovL8Lu5+Lw4Png5fIg8fPs7PMg/e
    vl7OXt8u7iIO/u4e737e7pIOTo4OPu7eDr6CDxIO3g9+Dr7uwg4iBhcnJbcm93XVtjb2xdDQppbn
    QgZ2V0U3VtT2ZEaWFnb25hbChpbnQgcm93LCBpbnQgY29sLCBpbnQgbiwgaW50ICoqIGFycikNCn
    sNCglpbnQgaSxqLHN1bSA9IDA7DQoJaWYoY29sID09IDApLy/l8evoIPHy7uvh5fYg7fPr5eLu6Q
    0KCXsNCgkJZm9yKGkgPSByb3c7IGkgPCBuOyBpKyspLy/v8O7n7uTo7CDu8iDz4+vgIOTuIPPj6+
    Ag8err4OT74uD/IP3r5ezl7fL7DQoJCQlzdW0gKz0gYXJyW2ldW2kgLSAxXTsNCgl9DQoJZWxzZS
    8v5fHr6CDt5fINCgl7DQoJCWZvcihqID0gY29sOyBqIDwgbjsgaisrKS8v7/Du9e7k6Owg7+4g5O
    jg4+7t4OvoKPHr5eTz/vno6SD96+Xs5e3yIOHz5OXyIO3o5uUg7eAgMSDoIO/w4OLl5SDt4CAxKQ
    0KCQkJc3VtICs9IGFycltqIJcgMV1bal07Ly/x6uvg5Pvi4OXsIP3r5ezl7fL7DQoJfQ0KCXJldH
    VybiBzdW07Ly/i5fDt5ewg5+3g9+Xt6OUNCn0NCg0KaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKi
    Bhcmd2W10pDQp7DQoJaW50ICoqIG1hdHIgPSBOVUxMOy8v0+rg5+Dy5ev8IO3gIOzg8fHo4g0KCW
    ludCBpLGosbixtYXhfdmFsLGN1cl92YWw7DQoJZG91YmxlIG07DQoJYm9vbCBiQ29ycmVjdCA9IH
    RydWU7Ly/U6+DjIO7y4uX34P756Okg5+Ag6u7w8OXq8u3u8fL8IOLi7uTgDQoJaWZzdHJlYW0gaW
    ZzOy8vz+7y7uog5Ov/IPfy5e3o/w0KCS8vYXJndlswXSDi8eXj5OAg8e7k5fDm6PIg7/Py/CDqIP
    Hg7O7pIO/w7uPw4Ozs5Q0KCWlmKDEgPCBhcmdjKQ0KCXsNCgkJLy/P8O7h8+XsIO7y6vD78vwg5O
    v/IPfy5e3o/yDv5fDl5ODt7fvpIO/z8vwNCgkJaWZzLm9wZW4oYXJndlsxXSk7Ly/u8urw++Lg5e
    wg9ODp6w0KCQlpZighaWZzKS8v5fHr6CD04Onr4CDt5SDx8/nl4vHy4vPl8g0KCQl7DQoJCQljb3
    V0PDwiT3NoaWJrYSBvdGtyaXRpYSA6ICI8PGFyZ3ZbMV08PCJcbiI7DQoJCQliQ29ycmVjdCA9IG
    ZhbHNlOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJY291dDw8Ilx0Q2h0ZW5pZSBkYW5uaWggaXMgZm
    FpbGFcbiI7aWZzPj5tOw0KCQkJaWYoaWZzLmVvZigpKS8v5fHr6CDq8/Dx7vAg4iD04Onr5SDt5S
    Dk7vHy6OMg6u7t9uANCgkJCQljb3V0PDwiRmlsZSBuZSBzb2RlcnpoaXQgZWxlbWVudG92IG1hdH
    JpY2kgaWxpIHB1c3RcbiI7DQoJCQllbHNlDQoJCQl7DQoJCQkJaWYobWF0ciA9IGFsbG9jTWVtb3
    J5Rm9yTWF0cml4KG0sIG1hdHIsIG4pKS8v4vvk5ev/5ewg7+Ds//L8DQoJCQkJCW1hdHIgPSBzZX
    RNYXRyaXhFbGVtZW50cyhmYWxzZSwgaWZzLCBtYXRyLCBuLCBiQ29ycmVjdCk7DQoJCQkJaWYoIW
    JDb3JyZWN0KS8v5fHr6CDt5SD14uDy4OXyIP3r5ezl7fLu4g0KCQkJCQljb3V0PDwiRmlsZSBkYW
    5uaWggc29kZXJ6aGl0IG5lIHZzZSBlbGVtZW50aSBtYXRyaWNpXG4iOw0KCQkJCWVsc2UNCgkJCQ
    kJY291dDw8IkNodGVuaWUgb2tvbmNoZW5vLi4uXG4iOw0KCQkJfQ0KCQkJaWZzLmNsb3NlKCk7Ly
    /n4Orw+/Lo5SD04Onr4A0KCQl9DQoJfQ0KCWVsc2UNCgl7DQoJCWNvdXQ8PCJcdFJ5Y2hub2kgdn
    ZvZFxuIjsNCgkJd2hpbGUoIW1hdHIpLy8NCgkJew0KCQkJY291dDw8IkVudGVyIG4gOiAiO2Npbj
    4+bTsNCgkJCW1hdHIgPSBhbGxvY01lbW9yeUZvck1hdHJpeChtLCBtYXRyLCBuKTsvL+L75OXr/+
    XsIO/g7P/y/A0KCQl9DQoJCW1hdHIgPSBzZXRNYXRyaXhFbGVtZW50cyh0cnVlLCBpZnMsIG1hdH
    IsIG4sIGJDb3JyZWN0KTsNCgl9DQoJaWYoYkNvcnJlY3QpDQoJew0KCQljb3V0PDwiXHRWdm9kIG
    1hdHJpY2kga29ycmVrdGVuIU90b2JyYXpoZW5pZSBtYXRyaWNpXG4iOw0KCQlmb3IoaSA9IDA7IG
    kgPCBuOyBpKyspDQoJCXsNCgkJCWZvcihqID0gMDsgaiA8IG47IGorKykNCgkJCQljb3V0PDxzZX
    R3KDMpPDxtYXRyW2ldW2pdPDwiICI7Ly/s6O3o7PPsIPLw6CDx6Ozi7uvgDQoJCQljb3V0PDwiXG
    4iOw0KCQl9DQoJCWlmKG4gPT0gMSkvLyDl8evoIPDg5+zl8O3u8fL8IDENCgkJCW1heF92YWwgPS
    BtYXRyWzBdWzBdOy8v8u4g7ODq8SD98u4g4uLl5O3l++kg5evl7OXt8g0KCQllbHNlDQoJCS8v7+
    7r4OPg5ewgbWF4X3ZhbCDw4OLt7ukg8fPs7OUg/evl7OXt8u7iIDEt6Q0KCQkvL+/u4e737e7pIO
    To4OPu7eDr6CDv7uQg4+vg4u3u6Q0KCQltYXhfdmFsID0gZ2V0U3VtT2ZEaWFnb25hbCgxLCAwLC
    BuLCBtYXRyKTsNCgkJLy/F8evoIG4gPT0gMSDt6CDiIO7k6O0g6Ocg9ujq6+7iIO3lIOfg6eS47A
    0KCQlmb3IoaSA9IDI7IGkgPCBuOyBpKyspDQoJCXsNCgkJCWlmKG1heF92YWwgPCAoY3VyX3ZhbC
    A9IGdldFN1bU9mRGlhZ29uYWwoaSwgMCwgbiwgbWF0cikpKQ0KCQkJCW1heF92YWwgPSBjdXJfdm
    FsOw0KCQl9DQoJCS8v8uXv5fD8IO/w7uHo8ODl7CDk6ODj7u3g6+gg4vv45SDj6+Di7e7pDQoJCW
    ZvcihqID0gMTsgaiA8IG47IGorKykNCgkJew0KCQkJaWYobWF4X3ZhbCA8IChjdXJfdmFsID0gZ2
    V0U3VtT2ZEaWFnb25hbCgwLCBqLCBuLCBtYXRyKSkpDQoJCQkJbWF4X3ZhbCA9IGN1cl92YWw7DQ
    oJCX0NCgkJY291dDw8IlJlc3VsdCA6ICI8PG1heF92YWw8PCJcbiI7DQoJfQ0KCXN5c3RlbSgicG
    F1c2UiKTsNCglyZXR1cm4gMDsNCn0NCg==
    ------------E9F73DF8FFBD3
    .
    250 OK id=1RPZPx-0003MN-00
    
    RSET
    
    250 Reset OK
    
    QUIT
    
    221 smtp11.mail.ru closing connection
    
    
    
    [/cut]
    текст в базе64 расшифровывается обратно как надо. подскажите почему не отправляется письмо? мож \r\n(#(13#10) где не доставил или лишних поставил?
     
    #1 realcoder, 13 Nov 2011
    Last edited by a moderator: 14 Nov 2011
  2. realcoder

    realcoder Member

    Joined:
    9 Dec 2010
    Messages:
    226
    Likes Received:
    11
    Reputations:
    4
    мля, сообщение не отображается((