Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отправка почты с помощью 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]

Вопрос вот в чем: что ты такое пишешь, с таким маленьким размером да еще с поддержкой отправки почты?!


Наверх

Титульная страница Поиск, карта сайта Написать письмо