PDA

Просмотр полной версии : MailSender by me


Piflit
18.06.2007, 20:55
Осваиваю 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
ну нужно хотябы доработать пабликовый исходник

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

делай встроенный в прогу смтп.

сервер?

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
21.06.2007, 16:43
http://rapidshare.com/files/37958396/Sender.rar.html
http://slil.ru/24532500

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

Попрошайка
21.06.2007, 19:54
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
Отправлять надо такие команды серваку(эментарно на 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;