Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-02-2005
n3ck n3ck is offline
Registrado
 
Registrado: ene 2005
Posts: 4
Poder: 0
n3ck Va por buen camino
Lightbulb Enviar EMail ( Sin Componentes )

Me doy cuenta que mucha gente pregunta como enviar un EMail.
Asi que Aqui les dejo la EMail Unit que reduce enviar un email a una sola funcion sin utilizar un solo componente.
Espero les sea util.

--------------------------------------------------------------
Lo se, se puede simplificar mucho mas pero asi requiero la funcion
para mis programas
--------------------------------------------------------------

Código:
  UNIT EMail;
  
  INTERFACE
  
  USES
  Windows,WinSock;
  
  function SendEmail(SMTP, Asunto, Mensaje, Para, De, Archivo : AnsiString) : Boolean;
  
  IMPLEMENTATION
  
  CONST
  CRLF = #13#10;
  cBase64Codec = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
  
  TYPE
  Triple = ARRAY[1..3] OF BYTE;
  Quad = ARRAY[1..4] OF BYTE;
  
  VAR
  SMTPServer : STRING;
  SMTPAcc : STRING;
  Sock : TSocket;
  FileBuf : AnsiString;
  
  FUNCTION NameToIP(HostName:STRING) : STRING;
  LABEL Abort;
  TYPE
  TAPInAddr = ARRAY[0..100] OF PInAddr;
  PAPInAddr =^TAPInAddr;
  VAR
  WSAData : TWSAData;
  HostEntPtr : PHostEnt;
  pptr : PAPInAddr;
  I : Integer;
  BEGIN
  Result:='';
  WSAStartUp($101,WSAData);
  TRY
  HostEntPtr:=GetHostByName(PChar(HostName));
  IF HostEntPtr=NIL THEN GOTO Abort;
  pptr:=PAPInAddr(HostEntPtr^.h_addr_list);
  I:=0;
  WHILE pptr^[i]<>NIL DO BEGIN
  IF HostName='' THEN BEGIN
  IF(Pos('169',inet_ntoa(pptr^[i]^))<>1)AND(Pos('192',inet_ntoa(pptr^[i]^))<>1) THEN BEGIN
  Result:=inet_ntoa(pptr^[i]^);
  GOTO Abort;
  END;
  END ELSE RESULT:=(inet_ntoa(pptr^[i]^));
  Inc(I);
  END;
  Abort:
  EXCEPT
  END;
  WSACleanUp();
  END;
  
  FUNCTION Codeb64(Count:Byte;T:Triple) : STRING;
  VAR
  Q : Quad;
  Strg : STRING;
  BEGIN
  IF Count<3 THEN BEGIN
  T[3]:=0;
  Q[4]:=64;
  END ELSE Q[4]:=(T[3] AND $3F);
  IF Count<2 THEN BEGIN
  T[2]:=0;
  Q[3]:=64;
  END ELSE Q[3]:=Byte(((T[2] SHL 2)OR(T[3] SHR 6)) AND $3F);
  Q[2]:=Byte(((T[1] SHL 4) OR (T[2] SHR 4)) AND $3F);
  Q[1]:=((T[1] SHR 2) AND $3F);
  Strg:='';
  FOR Count:=1 TO 4 DO Strg:=(Strg+cBase64Codec[(Q[Count]+1)]);
  RESULT:=Strg;
  END;
  
  FUNCTION BASE64(DataLength:DWORD) : AnsiString;
  VAR
  Count : WORD;
  I : DWORD;
  Remain : DWORD;
  Trip : Triple;
  B : AnsiString;
  BEGIN
  Count:=0;
  B:='';
  FOR I:=1 TO DataLength DIV 3 DO BEGIN
  INC(Count,4);
  Trip[1]:=Ord(FileBuf[(I-1)*3+1]);
  Trip[2]:=Ord(FileBuf[(I-1)*3+2]);
  Trip[3]:=Ord(FileBuf[(I-1)*3+3]);
  B:=B+CodeB64(3,Trip);
  IF Count=76 THEN BEGIN
  B:=B+CRLF;
  Count:=0;
  END;
  END;
  Remain:=DataLength-(DataLength DIV 3)*3;
  IF Remain>0 THEN BEGIN
  Trip[1]:=Ord(FileBuf[DataLength-1]);
  IF Remain>1 THEN Trip[2]:=Ord(FileBuf[DataLength]);
  IF Remain=1 THEN B:=B+Codeb64(1,Trip) ELSE B:=B+Codeb64(2,Trip);
  END;
  RESULT:=B;
  END;
  
  FUNCTION MySend(STR:STRING) : BOOL;
  BEGIN
  IF Send(Sock,STR[1],Length(STR),0)=SOCKET_ERROR THEN Result:=True ELSE Result:=False;
  END;
  
  FUNCTION ExtractFileName(CONST FileName:ShortString) : ShortString;
  VAR
  I : Integer;
  BEGIN
  I:=Length(FileName);
  WHILE (I>=1)AND NOT(FileName[i] IN ['\', ':']) DO Dec(I);
  Result:=Copy(FileName,I+1,255);
  IF Result[0]>#0 THEN IF Result[Ord(Result[0])]=#0 THEN Dec(Result[0]);
  END;
  
  FUNCTION Mail(Subject,Body,Recip,From,AttachmentPath:AnsiString) : Boolean;
  VAR
  F : FILE;
  AttachmentName : STRING;
  WSAData : TWSAData;
  SockAddrIn : TSockAddrIn;
  Buf : ARRAY[0..255] OF Char;
  BEGIN
  Result:=False;
  AttachmentName:=ExtractFileName(AttachmentPath);
  IF SMTPServer<>'' THEN BEGIN
  WSAStartUp(257,WSAData);
  Sock:=Socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
  SockAddrIn.sin_family:=AF_INET;
  htons(25);
  SockAddrIn.sin_port:=htons(25);
  SockAddrIn.sin_addr.S_addr:=inet_addr(PChar(NameToIP(SMTPServer)));
  Connect(Sock,SockAddrIn,SizeOf(SockAddrIn));
  IF(Recv(Sock,Buf,Sizeof(Buf),0)=SOCKET_ERROR)OR(Copy(Buf,1,3)<>'220') THEN Exit;
  MySend('HELO '+SMTPServer+CRLF);
  IF(Recv(Sock,Buf,SizeOf(Buf),0)=SOCKET_ERROR)OR(Copy(Buf,1,3)<>'250') THEN Exit;
  MySend('MAIL FROM: <'+SMTPAcc+'>'+CRLF);
  IF(Recv(Sock,Buf,SizeOf(Buf),0)=SOCKET_ERROR)OR(Copy(Buf,1,3)<>'250') THEN Exit;
  MySend('RCPT TO: <'+Recip+'>'+CRLF);
  IF(Recv(Sock,Buf,SizeOf(Buf),0)=SOCKET_ERROR)OR(Copy(Buf,1,3)<>'250') THEN Exit;
  MySend('DATA'+CRLF);
  IF(Recv(Sock,Buf,SizeOf(Buf),0)=SOCKET_ERROR)OR(Copy(Buf,1,3)<>'354') THEN Exit;
  MySend('From: '+SMTPAcc+CRLF);
  MySend('Subject: '+Subject+CRLF);
  MySend('To: '+Recip+CRLF);
  MySend('MIME-Version: 1.0'+CRLF);
  MySend('Content-Type: multipart/mixed; boundary="bla"'+CRLF+CRLF);
  MySend('--bla'+CRLF);
  MySend('Content-Type: text/plain; charset:us-ascii'+CRLF+CRLF);
  MySend(Body+CRLF+CRLF);
  MySend('--bla'+CRLF);
  MySend('Content-Type: application/x-shockwave-flash;'+CRLF);
  MySend(' name="'+AttachmentName+'"'+CRLF);
  MySend('Content-Transfer-Encoding: base64'+CRLF+CRLF);
  AssignFile(F,AttachmentPath);
  FileMode:=0;
  {$I-}
  Reset(F,1);
  IF IOResult=0 THEN BEGIN
  SetLength(FileBuf,FileSize(F));
  BlockRead(F,FileBuf[1],FileSize(F));
  MySend(BASE64(FileSize(F)));
  CloseFile(F);
  END;
  {$I+}
  MySend(CRLF+'--bla--'+CRLF+CRLF);
  MySend(CRLF+'.'+CRLF);
  IF(Recv(Sock,Buf,SizeOf(Buf),0)=SOCKET_ERROR)OR(Copy(Buf,1,3)<>'250') THEN Exit;
  MySend('QUIT'+CRLF);
  Result:=True;
  WSACleanup();
  END;
  END;
  
  function SendEmail(SMTP, Asunto, Mensaje, Para, De, Archivo : AnsiString) : Boolean;
  BEGIN
  Result := False;
  SMTPServer:=SMTP;
  SMTPAcc:=De;
  IF Mail(Asunto,Mensaje,Para,De,Archivo) THEN Result := True;;
  END;
  END.
Para llamar a la funcion solo utiliza la funcion SendEmail()
Responder Con Cita
  #2  
Antiguo 23-06-2005
kalisto kalisto is offline
Miembro
 
Registrado: jul 2004
Posts: 62
Poder: 20
kalisto Va por buen camino
solo es valido cuando el servidor de correo no requiere autenticación
Responder Con Cita
  #3  
Antiguo 23-06-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Esto podría ir a debate.

Un código como el expuesto es en mi opinión una forma de dar al traste con toda la claridad de código que se obtiene usando objetos, métodos y propiedades. Seguramente las Indy tienen en su implementación códigos así pero afortunadamente alguien se tomó el trabajo de encapularlos nítidamente en clases.



// Saludos
Responder Con Cita
  #4  
Antiguo 01-07-2005
Rolando Batista Rolando Batista is offline
Registrado
 
Registrado: feb 2005
Posts: 5
Poder: 0
Rolando Batista Va por buen camino
Question Ayuda?

Un saludo a todos:
Amigos necesito hacer un cliente de web2mail. Uso Delphi 3. Si alguien pudiera orientarme les agradecería.
Gracias por adelantado.
Roly
Responder Con Cita
  #5  
Antiguo 04-04-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
He notado que ultimamente están volviendo de las cenizas algunos hilos, pues entonces entrare a la moda con este. , y ojala responda bien la cuestión .

Cita:
Empezado por Rolando Batista
Un saludo a todos:
Amigos necesito hacer un cliente de web2mail. Uso Delphi 3. Si alguien pudiera orientarme les agradecería.
Gracias por adelantado.
Intenta usar el Squirrelmail.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #6  
Antiguo 24-02-2009
lacovera lacovera is offline
Miembro
 
Registrado: dic 2006
Posts: 87
Poder: 18
lacovera Va por buen camino
accessviolation!!

Hola" he intentado enviar un mail con la unit que decis y me da access violation justo cuando llega a
FOR I:=1 TO DataLength DIV 3 DO BEGIN
INC(Count,4);
Trip[1]:=Ord(FileBuf[(I-1)*3+1]);
Trip[2]:=Ord(FileBuf[(I-1)*3+2]);

le envio lo siguiente, porque puede ser?????

SendEmail('ipservidor','asunto','holamundo','hola@hola.com','hola@hola.com','')
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 20:50:51.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi