Socket SMTP

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by s0l_ir0n, 23 Nov 2009.

  1. s0l_ir0n

    s0l_ir0n Active Member

    Joined:
    14 Mar 2009
    Messages:
    399
    Likes Received:
    144
    Reputations:
    18
    Пол дня курил RFC по SMTP, так и не смог правильно составить тело.
    Покажите, где ошибка:
    Code:
    procedure Sends(str : String);
    var
    i: integer;
    begin
    for i:=1 to Length(str) do if send(sock,str[i],1,0)=SOCKET_ERROR then exit;
    end;
    //---------------------
    var
     MailFrom ='[email protected]';
     MailTo = '[email protected]';
     CRLF = #13+#10;
     Body = 'My-Mail-Body';
     MySmtp = '127.0.0.1';
     subject = 'My-Mail-Subj';
    
    procedure SendMail;
    begin
    WSAStartUp($0101, wsadata);
    sock:=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
    
    Addr.sin_family:=PF_Inet;
    Addr.sin_port:=HtoNS(25);
    Addr.sin_addr.S_addr:=Inet_Addr(PChar(MySmtp));
    FillChar(Addr.sin_zero,SizeOf(Addr.sin_zero),0);
    
    Connect(sock,Addr,sizeof(Addr));
    Sends('EHLO s0l.name'+CRLF);
    Sends('AUTH LOGIN'+CRLF);
    Sends('bG9naW4='+CRLF);
    Sends('cGFzc3dvcmQ='+CRLF);
    Sends('MAIL FROM:'+MailFrom+CRLF);
    Sends('RCPT TO:'+MailTo+CRLF);
    Sends('DATA'+CRLF);
    Sends('To:'+MailTo+CRLF);
    Sends('Subject:'+Title+CRLF);
    Sends('From:'+'<'+MailFrom+'>'+CRLF
    Sends(Body+CRLF);
    
    Shutdown(sock, SD_Both);
    CloseSocket(sock);
    WSACleanup;
    
    -
    Такс. Теперь работает, но я непонимаю, почему письма идут без авторизации, т.е. можно убрать
    Code:
    Sends('AUTH LOGIN'+CRLF);
    Sends('bG9naW4='+CRLF);
    Sends('cGFzc3dvcmQ='+CRLF
    и все-равно доходит
     
    #1 s0l_ir0n, 23 Nov 2009
    Last edited: 23 Nov 2009
    1 person likes this.
  2. altblitz

    altblitz Elder - Старейшина

    Joined:
    5 Jun 2009
    Messages:
    3,691
    Likes Received:
    3,145
    Reputations:
    236
    технически - сделано грамотно и без ошибок.

    только зачем цикл - vari: integer; begin for i:=1 to Length(str) do ...
    можно и напрямую мессагу запилить.

    ладно, не столь и важно.

    а вот:
    Sends('bG9naW4='+CRLF);
    Sends('cGFzc3dvcmQ='+CRLF);

    уже другое.
    имхо, это генерируется random и для каждой пост-мессаги должны быть уникальными.
     
  3. s0l_ir0n

    s0l_ir0n Active Member

    Joined:
    14 Mar 2009
    Messages:
    399
    Likes Received:
    144
    Reputations:
    18
    Ты ошибаешься, это всего-навсего данные для авторизации в BASE64, которые нужно передавать после AUTH LOGIN

    Я не понимаю почему письма уходят без авторизации. Эти 2 строки можно не передавать и все-равно все доставляется...
     
  4. altblitz

    altblitz Elder - Старейшина

    Joined:
    5 Jun 2009
    Messages:
    3,691
    Likes Received:
    3,145
    Reputations:
    236
    OK, это диалог ассемблитца с дельфистом ))

    для проверки отправленных/полученных пакетов
    используется GPGrelay - sites.inka.de/tesla/gpgrelay.html

    все комманды и ответы сохраняются в логах,
    и почему же blitz не имеет проблем с авторизацией? )
     
  5. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 altblitz >>>технически - сделано грамотно и без ошибок<<<<<<<

    Извеняюсь за выражение, но тут пздц как криво и через жопу написано )
    Ни единой проверки. (ни сокет не проверен на валидность, ни коннект)
    Оформление кода - ужас. HtoNS - просто порадовало (Delphi дает свободу, но зачем на столько ей пользоваться)

    Но главное: Кто будет считывать ответ сервака и анализировать ответ на предмет кодов ошибок.?

    Вообще возьми любой снифер (тотже CommView ) и посмотри что передается по сети и что отвечает сервак(если лень делать считывание)

    Также после посылки тела письма ставится CRLF[точка]CRLF
    и потом желательно послать команда прощания с серваком.

    Если ты не уверен в чем то, то лучше не пиши этого вообще и не сбивай людей с толку. Потому что выдумывать у тебя получается плоховато. Или пиши это в болталке, там модер по строже и быстрее потрёт это.

    P.S.
    Письма без авторизации уходят - это всеголишь настройки smtp сервака. Ты для теста делай через яндекс или mail.ru или любой другой нормальный сервис и там ты сразу увидиш что без авторизации ничто никуда не уйдет.
    Если юзаеш small http server для smtp то там есть галочка - разрешить/запретить анонимную отправку почты.
    Также и в других может быть подобная опция
     
    #5 slesh, 23 Nov 2009
    Last edited: 23 Nov 2009
  6. s0l_ir0n

    s0l_ir0n Active Member

    Joined:
    14 Mar 2009
    Messages:
    399
    Likes Received:
    144
    Reputations:
    18
    Проверки я специально вырезал, т.к. это лишний код в моем вопросе. В исходнике все проверки ответов и статусов на месте.
    О снифере я как-то не думал...

    Значит я неправильно понял данную команду.

    А вот за это спасибо огромное!
     
  7. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 s0l_ir0n
    Ты правильно понял для чего этот код, а вот он незнал для чего он и решил придумать
     
  8. МongBa†

    МongBa† Member

    Joined:
    12 May 2009
    Messages:
    66
    Likes Received:
    12
    Reputations:
    0
    Вот кстати проверки необходимы, писал многопоточный СМТП брут, зачастую когда сервер чехлил и не успевал выдать подтверждение 334 на то что принял логин - брут сразу пихал пароль и после этого либо чехлеж до таймаута, либо неверные логин и пароль..

    Да и на начальных стадиях удобнее следить за работой каждого другого сервера :)
     
  9. altblitz

    altblitz Elder - Старейшина

    Joined:
    5 Jun 2009
    Messages:
    3,691
    Likes Received:
    3,145
    Reputations:
    236
    еще раз повторю - технически ТС написал прогу без ошибок, прав абсолютно на 100%.

    дело тут в другом, в принимающей стороне - pop3 севреры гугл, майл.ру откидывают мейл с приватных SMTP серверов.
    давно известная шняга ;//
     
  10. Evgentusc

    Evgentusc New Member

    Joined:
    20 Feb 2012
    Messages:
    11
    Likes Received:
    0
    Reputations:
    0
    Может не в тему, помогите пожалуйста настроить Small HTTP Server 3.05.72a для восстановления почты из корзины mail.ru...
    Нашел статейку
    но как воспользоваться ума не приложу...
    Почта там была очень важная....