Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   MailSender by me (https://forum.antichat.xyz/showthread.php?t=42533)

Piflit 18.06.2007 20:55

MailSender by me
 
Осваиваю 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

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

GlobaL 18.06.2007 21:03

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

Piflit 18.06.2007 21:11

Цитата:

Сообщение от GlobaL
ну нужно хотябы доработать пабликовый исходник

что именно?.. я все доработал, кроме кодировок

Цитата:

Сообщение от GlobaL
делай встроенный в прогу смтп.

сервер?

slesh 18.06.2007 21:42

2 Piflit Заюзай сокеты и запросто сможешь слать сообщения напрямую почтовому серверу. удобство втом что письма не теряются. ПОтому что приходят сразу на сервак назначения тем самым достигается наивысшая скорость отправки.
Если постучишься ко мне в асю, то могу рассказать технологию.

Попрошайка 21.06.2007 16:12

Поделись примером, пожалуйста :)

Piflit 21.06.2007 16:18

Цитата:

Сообщение от Попрошайка
Поделись примером, пожалуйста :)

Ты о чем?

Попрошайка 21.06.2007 16:37

Цитата:

Сообщение от Piflit
Ты о чем?

Я о примере работы с сокетом, а именно отправка почты.

Piflit 21.06.2007 16:43

http://rapidshare.com/files/37958396/Sender.rar.html
http://slil.ru/24532500

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

Попрошайка 21.06.2007 19:54

Цитата:

Сообщение от Piflit
http://rapidshare.com/files/37958396/Sender.rar.html
http://slil.ru/24532500

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

Вообщето, я читать умею, и первый твой пост видел.
Если бы я хотел посмотреть примеры работы с Indy я тогда обратился бы к демки с их сайта :D Я просто наверное не правильно выразился, мне нужен пример отправки почты через Scoket'ы, без использования сторонних компонент. :confused:

Ky3bMu4 21.06.2007 20:01

Отправлять надо такие команды серваку(эментарно на 25 порт):
1) HELO server
2) MAIL FROM : [mail]
3) RCPT: [mail]
4) DATA
5) [TEXT]
6) QUIT

Попрошайка 21.06.2007 20:14

Цитата:

Сообщение от Ky3bMu4
Отправлять надо такие команды серваку(эментарно на 25 порт):
1) HELO server
2) MAIL FROM : [mail]
3) RCPT: [mail]
4) DATA
5) [TEXT]
6) QUIT

Спасибо! А вот, что я нарыл на ДельфиВорлд если кому нужно :

Код:

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;



Время: 16:29