![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отправка почты с помощью winsock [D6, D7, WinME, WinXP]
LanCoder © (2004-04-07 02:49:00)Уважаемые форумчане, столкнулся с проблемой, при добавлении в свой проект IdSMTP и IDMessages, размер откомпилированного файла увеличивается с 47 Кб до 235Кб, что очень не желательно в моём случае. Именно поэтому я решил попробовать отправлять почту с помощью сокетов, но все мои старания заканчивались неудачами и вот теперь приходится просить о помощи у вас. Возможно у когото завалялся фрагментик программы реализующий отправку почты на 1 адрес, через smtp, а также с несколькими аттачментами. Буду очень признателен за оказанную вами помощь.
Klev (2004-05-07 22:04:00) [1]>Rouse_ © (07.04.04 09:31) [1]
Маленький размер - это 8-20 кб, а 47 - это уже много.
0gnev.sky (2004-05-06 08:49:00) [2]LanCoder: если ты пишешь с использованием TServer/ClientSocket'a -- у тебя, имхо, размерчик должен и так подскочить :)) только API может реализовать маленький размер, а ты маленький, что б на нем программить ...
Polevi (2004-04-24 09:31:00) [3]var
Msg:TMsg;
begin
Main:=TMain.Create(nil);
Main.sendmail('my@mail.ru', 'my@mail.ru','smtp.mymail.ru',z);
while GetMessage(msg,0,0,0) do
DispatchMessage(msg);
Main.Free;
end;
LanCoder (2004-04-24 07:05:00) [4]Polevi ©, объясни пожалуйста поподробнее, а то чё не делаю не помогает.
Polevi (2004-04-23 18:37:00) [5]потомучто ты не выбираешь сообщения из очереди потока
LanCoder (2004-04-23 17:13:00) [6]И главная проблема не в этом, это всё просто напросто не работает в консольном приложении, почему может ктото знает ответ?
LanCoder (2004-04-23 16:00:00) [7]Я не сильно разбираюсь в этом, объясни если не трудно или дай ссылку на доку
Polevi (2004-04-23 08:05:00) [8]cl:=TClientSocket.Create(Main);
cl.OnRead:=clRead;
cl.OnConnect:=clConnect;
if cl.Active then begin //вот это зачем ?????
cl.Close;
Exit;
end;
cl.active:=true; //это тоже зачем ?
cl.Open;
неправыильно отслыать чтото в OnConnect
это нужно делать в OnWrite и без всяких sleep(500)
и вообще, зачем использовать асинхронный режим елси не понимаешь его сути ? это не самый простой способ, используй блокирующий
LanCoder (2004-04-23 07:56:00) [9]Спасибо за внимание!!!
Если не секрет, почему не работает ниже приведённый пример, ведь по идее всё правильно, единственное, что я не когда не создавал сам это классы и объекты, я поглядел в Дэлфовый Хэлп там вроде так, как у меня? И ещё вопрос может можно обойтись без всей этой лабуды, а то я создавал класс TMain только для того чтобы работали события TClientSocketa. Кстати визуальный аналог, отлично работает, присылая мне при этом письмо с аттачментом, а этот даже не коннектится к серверу.
==========================================
program Project3;
uses
Classes, Dialogs,ScktComp,sysutils;
type
TMain = class(TComponent)
cl:TClientSocket;
Procedure SendMail(CFrom,CTo,Csmtp,Ctext:string);
Procedure clRead(Sender: TObject; Socket: TCustomWinSocket);
Procedure clConnect(Sender: TObject; Socket: TCustomWinSocket);
end;
{==================CONSTANTS==========================}
const z = 'Content-Type: text/html;'+
'charset="koi8-r"'+
'Content-Transfer-Encoding: quoted-printable'+
''+
''+
''+
''+
''+
''+
''+
''+
''+
''+
'>>from Kasper with=20'+
'Love...
>>Watch my WebCam online @ http://www.fromUA.net/web/='+
''+
' '+
'Legal Restrictions
Copyright =BF 2001-2003 ='+
'kasperUA™. All=20'+#10+
'rights reserved.
Except as otherwise indicated elsewhere in this ='+
'publication,=20'+#10+
'with respect to a particular portion, file, or document, any person is ='+
'hereby=20'+#10+
'authorized to view, copy, print, and distribute this document subject to ='+
'the=20'+#10+
'following conditions:
The document may be used for informational,=20'+
'non-commercial purposes only.';
{=======================CONSTANTS========================}
var SFrom,STo,smtp,text,k:string;
Main:TMain;
Procedure TMain.clRead(Sender: TObject; Socket: TCustomWinSocket);
begin
k:=socket.ReceiveText;
showmessage(k);
end;
Procedure TMain.clConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
socket.SendText('HELO '+Smtp+#10);
sleep(500);
socket.SendText('MAIL FROM:'+SFrom+#10);
sleep(500);
socket.SendText('RCPT TO:'+STo+#10);
sleep(500);
socket.SendText('DATA'+#10);
sleep(500);
socket.SendText(Text+#10);
sleep(500);
socket.SendText('.'+#10);
end;
Procedure TMain.SendMail(CFrom,CTo,Csmtp,Ctext:string);
begin
SFrom:=CFrom;
STo:=CTo;
Smtp:=CSmtp;
text:=CText;
try
cl:=TClientSocket.Create(Main);
cl.OnRead:=clRead;
cl.OnConnect:=clConnect;
if cl.Active then begin
cl.Close;
Exit;
end;
cl.Host:=Smtp;
cl.Port:=25;
cl.active:=true;
cl.Open;
except
cl.Close;
cl.Active:=false;
cl.Destroy;
end;
end;
begin
Main:=TMain.Create(nil);
Main.sendmail('my@mail.ru', 'my@mail.ru','smtp.mymail.ru',z);
repeat
until k '';
Main.cl.Close;
Main.cl.Active:=false;
Main.cl.Destroy;
end.
==========================================
AndersoNRules (2004-04-14 15:51:00) [10]Unit ya potom sluchayno nazval Mapi.
Rouse_ (2004-04-13 22:50:00) [11]
unit Mapi;
...
uses Mapi;
верх гениальности...
Res :! RASEnumConnectionsA(@RASConns, @dwSize, @dwCount);
Это тоже юмор...
AndersoNRules (2004-04-13 22:33:00) [12]Shas naydu :
vot,derji:
unit Mapi;
interface
uses Windows,Sysutils,Classes;
function SendMail(RecName,Address,Subject,Attachment:String):boolean;
function IsOnline:boolean;
implementation
uses Mapi;
function SendMail(RecName,Address,Subject,Attachment:string):boolean;
var MapiMessage:TMapiMessage;
MapiFileDesc:TMapiFileDesc;
MapiRecipDesc:TMapiRecipDesc;
i:integer; s:string;
begin
MapiRecipDesc.ulReserved:=0;
MapiRecipDesc.ulRecipClass:=MAPI_TO;
MapiRecipDesc.lpszName:=PChar(RecName);
MapiRecipDesc.lpszAddress:=PChar(Address);
MapiRecipDesc.ulEIDSize:=0;
MapiRecipDesc.lpEntryID:=nil;
MapiFileDesc.ulReserved:=0;
MapiFileDesc.flFlags:=0;
MapiFileDesc.nPosition:=0;
MapiFileDesc.nPosition:=PChar(Attachment);
MapiFileDesc.lpszFileName:=nil;
MapiFileDesc.lpFileType:=nil;
MapiMessage.ulReserved:=0;
MapiMessage.lpszSubject:=nil;
MapiMessage.lpszNoteText:=Pchar(Subject);
MapiMessage.lpszMessageType:=nil;
MapiMessage.lpszDateReceived:=nil;
MapiMessage.lpszConversationID:=nil;
MapiMessage.flFlags:=0;
MapiMessage.lpOriginator:=nil;
MapiMessage.nRecipCount:=1;
MapiMessage.lpRecips:=@MapiRecipDesc;
if Length(Attachment)>0 then
begin
MapiMessage.nFileCount:1;
MapiMessage.lpFiles:=@MapiFileDesc;
end
else
begin
MapiMessage.nFileCount:=0;
MapiMessage.lpFiles:=nil;
end;
Result:=MapiSendMail(0,0,MapiMessage,MAPI_DIALOG or MAPI_LOGON_UI or MAPI_NEWSESSION,0)=SUCCESS_SUCCESS;
end;
function IsOnline:boolean;
var RASConn: TRASConn; dwSize,dwCount: DWORD;
begin
RASConns.dwSize:= SizeOf(TRASConn);
dwSize:= SizeOf(RASConns);
Res:!RASEnumConnectionsA(@RASConns, @dwSize, @dwCount);
Result:= (Res = 0) and (dwCount > 0);
end;
end.
esli budet rabotati,s tebya pivo :) joke
Alexis (2004-04-13 13:54:00) [13]2 Rouse-судя по мейлу автора, троян :)
LanCoder (2004-04-13 02:41:00) [14]Удалено модератором
Примечание: Создание пустых сообщений...
Digitman (2004-04-07 09:44:00) [15]
> решил попробовать отправлять почту с помощью сокетов
а IdSMTP, по-твоему, это не "сокет" ? это "шмокет" ?
> все мои старания заканчивались неудачами
ну показывай ... свои "старания" ..
Rouse_ (2004-04-07 09:31:00) [16]Вопрос вот в чем: что ты такое пишешь, с таким маленьким размером да еще с поддержкой отправки почты?!