MailSender by me

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Piflit, 18 Jun 2007.

  1. Piflit

    Piflit Banned

    Joined:
    11 Aug 2006
    Messages:
    1,249
    Likes Received:
    585
    Reputations:
    31
    Осваиваю Delphi, решил написать такую тулзу, может кому пригодится :)
    что умеет:
    -отправлять почту :)
    -писать любой адрес в графе "отправитель"
    -аттач (до 10 Мб - я ориентировался на популярные почтовики)
    -можно отсылать сразу списку юзеров (берется из *.txt или *.lst файла)

    отправка производится через аккаунт на стороннем SMTP сервере. для наших целей вполне подходит небезызвестный topmail.kz :) (он стоит в настройках по умолчанию)

    тест проходил на mail.ru ya.ru и rambler.ru. на рамблер в течении часа почта не дошла (там иногда бывают задержки с доставкой), на яндекс и маил все пришло через пару секунд=)

    единственная проблема: это косяк с кодировками при отправке письма кириллицей, с латиницей все нормально. целый день этим занимался. нормальная кодировка все равно меняется на неправильную=( если кто-то с этим разберется, буду очень благодарен. в исходниках есть все необходимое.

    а вот собственно сабж
    http://rapidshare.com/files/37958396/Sender.rar.html
    http://slil.ru/24532500

    жду отзывов и предложений, как еще можно расширить функциональность. :)
     
    1 person likes this.
  2. GlobaL

    GlobaL Banned

    Joined:
    21 Feb 2007
    Messages:
    57
    Likes Received:
    66
    Reputations:
    -18
    ну нужно хотябы доработать пабликовый исходник, а так вполне неплохо, делай встроенный в прогу смтп.
     
  3. Piflit

    Piflit Banned

    Joined:
    11 Aug 2006
    Messages:
    1,249
    Likes Received:
    585
    Reputations:
    31
    что именно?.. я все доработал, кроме кодировок

    сервер?
     
  4. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 Piflit Заюзай сокеты и запросто сможешь слать сообщения напрямую почтовому серверу. удобство втом что письма не теряются. ПОтому что приходят сразу на сервак назначения тем самым достигается наивысшая скорость отправки.
    Если постучишься ко мне в асю, то могу рассказать технологию.
     
    1 person likes this.
  5. Попрошайка

    Joined:
    14 Jun 2007
    Messages:
    25
    Likes Received:
    4
    Reputations:
    0
    Поделись примером, пожалуйста :)
     
  6. Piflit

    Piflit Banned

    Joined:
    11 Aug 2006
    Messages:
    1,249
    Likes Received:
    585
    Reputations:
    31
    Ты о чем?
     
  7. Попрошайка

    Joined:
    14 Jun 2007
    Messages:
    25
    Likes Received:
    4
    Reputations:
    0
    Я о примере работы с сокетом, а именно отправка почты.
     
  8. Piflit

    Piflit Banned

    Joined:
    11 Aug 2006
    Messages:
    1,249
    Likes Received:
    585
    Reputations:
    31
    http://rapidshare.com/files/37958396/Sender.rar.html
    http://slil.ru/24532500

    вот сорцы, если по ним есть какие-то вопросы, пиши
     
  9. Попрошайка

    Joined:
    14 Jun 2007
    Messages:
    25
    Likes Received:
    4
    Reputations:
    0
    Вообщето, я читать умею, и первый твой пост видел.
    Если бы я хотел посмотреть примеры работы с Indy я тогда обратился бы к демки с их сайта :D Я просто наверное не правильно выразился, мне нужен пример отправки почты через Scoket'ы, без использования сторонних компонент. :confused:
     
    #9 Попрошайка, 21 Jun 2007
    Last edited: 21 Jun 2007
  10. Ky3bMu4

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

    Joined:
    3 Feb 2007
    Messages:
    487
    Likes Received:
    284
    Reputations:
    42
    Отправлять надо такие команды серваку(эментарно на 25 порт):
    1) HELO server
    2) MAIL FROM : [mail]
    3) RCPT: [mail]
    4) DATA
    5) [TEXT]
    6) QUIT
     
  11. Попрошайка

    Joined:
    14 Jun 2007
    Messages:
    25
    Likes Received:
    4
    Reputations:
    0
    Спасибо! А вот, что я нарыл на ДельфиВорлд если кому нужно :

    Code:
    function SMTPRecvReply(MailSocket: TSocket): Word;
    var
      Buffer: array[1..1024] of Byte;
      Err: Integer;
      BufStr: string;
    begin
      BufStr := '';
      Recv(MailSocket, Buffer, SizeOf(Buffer), 0);
      for Err := 1 to 3 do
        BufStr := BufStr + Chr(buffer[Err]);
      try
        Result := StrToInt(BufStr);
      except
        Result := 0;
      end;
    end;
    
    function SMTPSendString(MailSocket: TSocket; Str: string): Boolean;
    var
      Buffer: array[1..1024] of Byte;
      Err: Integer;
    begin
      Result := FALSE;
      ZeroMemory(@Buffer, SizeOf(Buffer));
      if Length(Str) > 1000 then
        Exit;
      for Err := 1 to Length(Str) do
        Buffer[Err] := Ord(Str[Err]);
      Buffer[Err] := 13;
      Buffer[Err + 1] := 10;
      Err := WinSock.send(MailSocket, buffer, Err + 1, 0);
      if Err > 0 then
        Result := TRUE;
    end;
    
    function SMTPConnectAndSendMail(Arg: Pointer): DWord; stdcall;
    var
      MailSocket: TSocket;
      MailSent: Boolean;
      MTime: TSystemTime;
      SMTPServer: TSockAddrIn;
      Step: Byte;
      OutOfSend: Boolean;
    begin
      MailSent := FALSE;
      OutOfSend := FALSE;
      MailSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
      ZeroMemory(@SMTPServer, SizeOf(SMTPServer));
      SMTPServer.sin_family := AF_INET;
      SMTPServer.sin_port := htons(25);
      SMTPServer.sin_addr.S_addr := inet_addr(PChar(smtp));
      Step := 0;
      if Connect(MailSocket, SMTPServer, SizeOf(SMTPServer)) = 0 then
        repeat
          case SMTPRecvReply(MailSocket) of
            220: SMTPSendString(MailSocket, 'HELO server.com');
            250: case STEP of
                0:
                  begin
                    SMTPSendString(MailSocket, 'MAIL FROM:' + mail);
                    Inc(Step);
                  end;
                1:
                  begin
                    SMTPSendString(MailSocket, 'RCPT TO:' + mail);
                    Inc(Step);
                  end;
                2:
                  begin
                    SMTPSendString(MailSocket, 'DATA');
                    Inc(Step);
                  end;
                3:
                  begin
                    SMTPSendString(MailSocket, 'QUIT');
                    Inc(Step);
                  end;
              end;
            354:
              begin
                SMTPSendString(MailSocket, 'From:' + ServerID);
                SMTPSendString(MailSocket, 'To:' + UserName);
                SMTPSendString(MailSocket, 'Subject:' + LocalIPS + ' : ' + port +
                  ' At ' + DateTimeToStr(Now));
                SMTPSendString(MailSocket, CRLF);
                for count := 1 to (txt.Count - 1) do
                  SMTPSendString(MailSocket, txt[count]);
                SMTPSendString(MailSocket, CRLF + '.' + CRLF);
              end;
            221:
              begin
                OutOfSend := True;
                MailSent := True
              end;
          else
            OutOfSend := True;
            file: //!Case
          end;
        until OutOfSend;
      CloseSocket(MailSocket);
    end;
    ExitThread(0);
    end;
    
    
     
    1 person likes this.