Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   enviar email a gmail /hotmail /... (https://www.clubdelphi.com/foros/showthread.php?t=93210)

usuario1000 17-06-2018 18:20:14

enviar email a gmail /hotmail /...
 
Buenas a todos.


Ya sé que hay hilos por el foro de enviar email, pero creanme, he leido y probado de todo y ya me doy por vencido y he llegado al punto de tener que solicitar ayuda.


La idea es que desde un email de una empresa pequeñita "xxxxxxxx@servidorempresa.es" enviar unos correos a unos clientes ya seán de hotmail, gmail, icloud, u otros.


Con el código que pongo a continuación logro que los envíe a icloud y otros que no sean ni gmail ni hotmail. Pero no soy capaz de mandar un email a gmail o hotmail.


Alguien caritativo me puede aclarar el codigo a ver en que falla. Gracias a todos. (Delphi 10 Seattle en Windows 10).

Código Delphi [-]
procedure TFPrincipal.ejecutarEmailCliente( sUsuario, sClave, sHost, sAdjunto, sAsunto, sDestino, sMensaje: string );
var
   SMTP: TIdSMTP;
   Mensaje: TIdMessage;
   tipoCorreo:string;
  // Adjunto: TIdAttachment;
begin
  // Creamos el componente de conexión con el servidor

  tipoCorreo:= averiguarTipoCorreo(sDestino);


  if tipoCorreo = 'hotmail' then  // no funciona
  begin
          SMTP := TIdSMTP.Create( nil );
          SMTP.Username := 'correo@corporativo.es';
          SMTP.Password := 'contraseña';
          SMTP.Host := 'smtp.live.com';
          SMTP.Port := 25;

  end;
  if tipoCorreo = 'gmail' then  // no funciona
  begin
          SMTP := TIdSMTP.Create( nil );
          SMTP.Username := 'correo@corporativo.es';
          SMTP.Password := 'contraseña';
          SMTP.Host := 'smtp.gmail.com';
          SMTP.Port := 587;

  end;
  if (tipoCorreo <> 'hotmail') and (tipoCorreo<>'gmail') then  // este sí que funciona
  begin
          SMTP := TIdSMTP.Create( nil );
          SMTP.Username := sUsuario;
          SMTP.Password := sClave;
          SMTP.Host := sHost;
          SMTP.Port := 587;
  end;


  // Creamos el contenido del mensaje
  Mensaje := TIdMessage.Create( nil );
  Mensaje.Clear;
  mensaje.ContentType := 'text/html';
  mensaje.CharSet := 'UTF-8';
  Mensaje.From.Name := sUsuario;   // sDestino
  Mensaje.From.Address := sDestino;
  Mensaje.Subject := sAsunto;
  Mensaje.Body.Text := sMensaje;
  Mensaje.Recipients.Add;
  Mensaje.Recipients.Items[0].Address := sDestino;

  // Si hay que meter un archivo adjunto lo creamos y lo asignamos al mensaje
 { if sAdjunto <> '' then
  begin
    if FileExists( sAdjunto ) then
    //  Adjunto := TIdAttachment.Create( Mensaje.MessageParts, sAdjunto );
  end
  else
    Adjunto := nil;      }

  // Conectamos con el servidor SMTP


  try
    SMTP.Connect;

  except
//  errores

  end;

  // Si ha conectado enviamos el mensaje y desconectamos
  if SMTP.Connected then
  begin
    try
      SMTP.Send( Mensaje );
   
    except
  // control errores
      
    end;

    try
      SMTP.Disconnect;
    except
      //raise Exception.Create( 'Error al desconectar del servidor.' );
    end;


  end;

end;

Casimiro Notevi 17-06-2018 19:00:22

Bien, pero por qué no puedes enviar a esos emails, qué mensaje de error sale, en qué línea, etc.

usuario1000 17-06-2018 20:02:53

Buenas,

Cuando intento mandar un email a GMail, da error en la linea :

Código Delphi [-]

SMTP.Send( Mensaje );

El error es el siguiente (vaya no sé insertar imagen):

Project Email.exe raised exception class EidSMTPReplyError with message 'Must issue a STARTTLS comand first. w3-v6sm12181124wrr.88 - gsmtp'.


Cuando intento enviar un email a Hotmail el error lo dá en la misma linea
Código Delphi [-]

SMTP.Send( Mensaje );
El error es el siguiente:
Project Email.exe raised exception class EIdSMTPReplyError with message 'SMTP;Client was not authenticated to send anonymous mail during MAIL FROM [CWLP265CA0154.FBRP265.PROD.OUTLOOK.COM].

(no sé insertar foto);

Gracias.

Casimiro Notevi 17-06-2018 21:51:25

Echa un vistazo a este hilo.

luisgutierrezb 18-06-2018 04:25:22

Creo que hay un problema de concepto, dices que desde la cuenta de una empresa quieres mandar correos a gmail, hotmail etc, no tienes porqué conectarte al smtp de hotmail o Gmail, tienes que conectarte al smtp de la empresa y decir que el correo es para Gmail y de ahí lo mandara no conectarte a cada smtp de donde lo quieras enviar

Neftali [Germán.Estévez] 18-06-2018 09:24:11

Como te ha dicho [Casimiro] para usar este tipo de cuenta, hare tiempo que es necesario utilizar SSL. Ya hace años que estos servidores (GMail, Hotmail, Yahoo,...) obligan a conectarse utilizando protocolos seguros.
Para ello es necesario utilizar el componente TIdSSLIOHandlerSocket (y librerías OpenSSL).


Si busca en los foros por este componente (TIdSSLIOHandlerSocket) encontrarás más hilos al respoecto.


Algunas configuraciones que te pueden ser utiles:

Código Delphi [-]
[GMail]
MailServer=smtp.gmail.com
PortServer=465
FromAdress=_CORREO_
FromText=Test correo
////// Valores posibles:  SSLMethod = (sslvSSLv2, sslvSSLv23, sslvSSLv3, sslvTLSv1)
SSLMethod=sslvTLSv1
Password=_PASSWORD_

[Hotmail]
MailServer=smtp-mail.outlook.com
PortServer=587
FromAdress=_CORREO_
////// Valores posibles:  UseTSL = (utNoTLSSupport, utUseImplicitTLS, utUseRequireTLS, utUseExplicitTLS);
UseTSL=utUseExplicitTLS
////// Valores posibles:  SSLMethod = (sslvSSLv2, sslvSSLv23, sslvSSLv3, sslvTLSv1)
SSLMethod=sslvTLSv1
Password=_PASSWORD_

[Yahoo-JL]
MailServer=smtp.correo.yahoo.es
PortServer=465
FromAdress=_CORREO_
FromText=_CORREO_
Password=_PASSWORD_

emeritos 07-11-2018 10:21:15

yo lo tengo asi:
Código Delphi [-]
    DLLHandlelib := LoadLibrary('libeay32.dll');
    DLLHandlessl := LoadLibrary('ssleay32.dll');
    cArchivo := 'C:\carpeta\pdf\Incidencias.pdf';
    mailMensaje.Clear;
    mailMensaje.From.Address := 'xxx@gmail.com';

    mailMensaje.Subject := Etexto.Text;
    Etexto.Text := 'texto a poner';
    mailMensaje.Body.SetText(Etexto.Lines.GetText);
    mailMensaje.From.Name := 'Incidencias';
    mailMensaje.Recipients.EMailAddresses := email.Text;
    indySMTP.Host := 'smtp.gmail.com';
    indySMTP.Username := 'xxx@gmail.com';
    indySMTP.Password := 'clave';
    indySMTP.Port := 465;

    TIdAttachment.Create(mailMensaje.MessageParts, cArchivo);
    indySMTP.AuthenticationType := atLogin;
    indySMTP.IOHandler := IdSSLIOHandlerSocket1;
    IdSSLIOHandlerSocket1.SSLOptions.Method := sslvSSLv23;
    IdSSLIOHandlerSocket1.SSLOptions.Mode := sslmUnassigned;


    indySMTP.Connect;

    If indySMTP.Connected
       Then
          Begin
              indySMTP.Send(mailMensaje);
              indySMTP.Disconnect;
              showmessage('El mensaje se envió correctamente');
          End
       Else showmessage('Se produjo un fallo durante el envío del mensaje');

Sea al correo que sea, me da error en la lineas "indySMTP.Connect;" que es este "Proyect programa.exe raised exception class EIdOSSL ConnectError with mensage "Error connecting SSL" ........



Como lo puedo solucionar. Gracias

Casimiro Notevi 07-11-2018 10:37:42

Puede que espere otra versión de la SSL, en lugar de la sslvSSLv23

emeritos 07-11-2018 12:39:01

Como puedo averiguar la version correcta. Por que creo que en otro programa ya me funciono.

Gracias.

emeritos 07-11-2018 13:20:46

He probado con todas estas que vienen y todas dan el mismo fallo
Código Delphi [-]
//    IdSSLIOHandlerSocket1.SSLOptions.Method := sslvSSLv23;
//    IdSSLIOHandlerSocket1.SSLOptions.Method := sslvSSLv2;
//    IdSSLIOHandlerSocket1.SSLOptions.Method := sslvSSLv3;
//    IdSSLIOHandlerSocket1.SSLOptions.Method := sslvTLSv1;

usuario1000 13-07-2019 19:41:04

Tarda Mucho.
 
Buenas tardes a todos,


Tengo el siguiente proceso que ha estado funcionando perfectamente, pero ha pasado algo que me tiene desconcertado.


En el trabajo envío emails desde el usuario al administrador, a través de una aplicación de Delphi 2010 Seatle en windows 10, al usuario le presento un mensaje de que se ha enviado un email pero este tarda hasta 50 segundos o más en enviarse y se queda la aplicación paralizada, sin embargo, en casa cuando lo pruebo, se envían sin esperar apenas 2 segundos. ¿que puede estar pasando?. ¿Cómo hago para reducir ese tiempo, por qué en casa va bien, siendo el mismo programa?. En el trabajo iba bien y ahora va muy lento. He cambiado los puertos de 465 a 587 que són los que admite mi proveedor de email.


Este es el procedimiento que utilizo y que hasta ahora iba bien, pero ahora tarda casi un minuto, aunque los emails sí llegan perfectamente.





Código Delphi [-]
procedure TServerMethods1.enviarEmail(destinatario, asunto, cuerpo: string);
var
  DATA: TIDMessage;
  SMTP: TIDsmtp;
  SSL: TIdSSLIOhandlerSocketOpenSSL;
begin

  SMTP := TIDsmtp.Create(nil);
  DATA := TIDMessage.Create(nil);
  SSL  := TIdSSLIOhandlerSocketOpenSSL.Create(nil);

  SSL.SSLOptions.Method := SSLVtlsv1;
  SSL.SSLOptions.Mode := sslmUNassigned;
  SSL.SSLOptions.VerifyMode := [];
  SSL.SSLOptions.VerifyDepth:= 0;

  DATA.ContentType := 'text/plain';
  DATA.CharSet :=  'UTF-8';
  DATA.From.Address := 'correo@inventado.es';
  DATA.Recipients.EMailAddresses := destinatario;
  DATA.Subject := asunto;
  DATA.Body.Text := cuerpo;

  SMTP.IOHandler := SSL;
  SMTP.Host := 'smtp.servidorinventado.com'; // servidor de correo
  SMTP.Port := 465;
  SMTP.Username := 'correo@inventado.es';
  SMTP.Password := 'contraseñaficticia';
  SMTP.UseTLS := utUseExplicitTLS;

  try
      try
        SMTP.Connect;
        SMTP.Send(DATA);  //aquí es donde se para hasta 1 minuto
        SMTP.Disconnect;
      except
     SMTP.Disconnect;
          // error
      end;
  finally
      SMTP.Free;
      DATA.Free;
      SSL.Free;
  end;

end;


Gracias por vuestra ayuda.

Casimiro Notevi 13-07-2019 20:46:34

Si va bien en algunos equipos y mal en uno de ellos, está claro que el problema es el equipo ese :)

usuario1000 14-07-2019 11:17:56

Cita:

Empezado por Casimiro Notevi (Mensaje 532769)
Si va bien en algunos equipos y mal en uno de ellos, está claro que el problema es el equipo ese :)


El equipo trabaja bien(además funciona a modo de servidor), no sé si desinstalar el paquete de office y volverlo a instalar, o esto que estoy diciendo no tiene nada que ver.



Bueno a ver que se me ocurre...


Gracias.

Casimiro Notevi 14-07-2019 11:42:06

Cita:

Empezado por usuario1000 (Mensaje 532770)
El equipo trabaja bien(además funciona a modo de servidor), no sé si desinstalar el paquete de office y volverlo a instalar, o esto que estoy diciendo no tiene nada que ver.
Bueno a ver que se me ocurre...
Gracias.

Así, sin ver nada :confused: poco podemos hacer.
Yo pondría un log, o un mensaje de aviso en cada paso, para saber cuál es el culpable.

Neftali [Germán.Estévez] 17-07-2019 08:28:40

Cita:

Empezado por usuario1000 (Mensaje 532767)
En el trabajo envío emails desde el usuario al administrador, a través de una aplicación de Delphi 2010 Seatle en windows 10, al usuario le presento un mensaje de que se ha enviado un email pero este tarda hasta 50 segundos o más en enviarse y se queda la aplicación paralizada, sin embargo, en casa cuando lo pruebo, se envían sin esperar apenas 2 segundos. ¿que puede estar pasando?.


Tal y como comentas, si el mismo códio funciona diferente en ambos equipos, lo más lógico es que ese comportamiento sea debido a algo "externo" al programa, por lo tanto no deberías tener que arreglar nada en el programa.
¿Las razones? Pues pueden ser muchas y se trata de hacer pruebas para ir descartando.
  • El propio Sistema Operativo; Versiones diferentes o Builds diferentres
  • Programas Antivirus instalados
  • Políticas de grupo que tengas en la empresa (si las tienes)
  • Infraestructura diferente de la red en ambos lugares (no comentras nada de cómo es la red de la empresa)
  • ...


La franja horaria es GMT +2. Ahora son las 16:59:56.

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