Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Error enviando correo hotmail con Indy (https://www.clubdelphi.com/foros/showthread.php?t=88202)

newtron 28-04-2015 17:45:15

Error enviando correo hotmail con Indy
 
Hola a tod@s.

Llevo tiempo enviando correos sin problemas con las Indy 10 y SSL desde varios servidores como hotmail, gmail, etc. pero desde hace unos días, algunos clientes que usan hotmail me dicen que no les funciona.

El error que da al enviar es "SSL is not avalaible on this server".

¿Os suena que hayan cambiado algo los de hotmail?

Saludos

newtron 14-05-2015 12:59:16

Bueno....

¿Alguien me puede decir si en la actualidad puede enviar correos con Indy usando hotmail como servidor?

Gracias y un saludo.

Casimiro Notevi 14-05-2015 13:34:28

No uso hotmail, pero de la web de ellos he copiado estos datos.
Cita:

  • POP3 Servidor entrante
    • Dirección de servidor: pop-mail.outlook.com
    • Puerto: 995
    • Conexión cifrada: SSL
  • SMTP Servidor saliente
    • Dirección del servidor: smtp-mail.outlook.com
    • Puerto: 25 (587 si puerto 25 está bloqueado)
    • Autenticación: Sí
    • Conexión segura: TLS
  • Nombre de usuario: dirección de correo electrónico
  • Contraseña: contraseña

A ver si el problema es por algún antivirus o algo similar.

Neftali [Germán.Estévez] 14-05-2015 14:13:47

Cita:

Empezado por newtron (Mensaje 492142)
¿Alguien me puede decir si en la actualidad puede enviar correos con Indy usando hotmail como servidor?

Yo estoy usando en algún programa GMail y creo que hotmail también en alguno, y siguen enviando.
Necesitas SSL y los puertos correctos.

newtron 14-05-2015 17:35:33

Cita:

Empezado por Casimiro Notevi (Mensaje 492143)
No uso hotmail, pero de la web de ellos he copiado estos datos.
A ver si el problema es por algún antivirus o algo similar.

No lo creo, me ha llamado algún cliente que sin cambiar nada ha dejado de funcionar y yo estoy haciendo pruebas aquí y nada, no va. Han cambiado cosas porque antes el servidor de salida era "smtp.live.com" y ahora es "smtp-mail.outlook.com".

Cita:

Empezado por Neftali (Mensaje 492145)
Yo estoy usando en algún programa GMail y creo que hotmail también en alguno, y siguen enviando.
Necesitas SSL y los puertos correctos.

Ok, y ¿serías tan amable de comprobar si sigue funcionando o, en su defecto, pasarte yo los datos de una cuenta y hacer una prueba?

Gracias y un saludo

jeikey 15-05-2015 16:56:21

Cita:

Empezado por newtron (Mensaje 492152)
No lo creo, me ha llamado algún cliente que sin cambiar nada ha dejado de funcionar y yo estoy haciendo pruebas aquí y nada, no va. Han cambiado cosas porque antes el servidor de salida era "smtp.live.com" y ahora es "smtp-mail.outlook.com".



Ok, y ¿serías tan amable de comprobar si sigue funcionando o, en su defecto, pasarte yo los datos de una cuenta y hacer una prueba?

Gracias y un saludo

Hace aproximadamente el mismo tiempo que tú, tuve el mismo problema con outlook, mas no con gmail. La solución fue configurar el control del ssl dentro del codigo:

IdSSLIOHandler.SSLOptions.Method := sslvSSLv23;

Ahi puedes ir jugando con otras asignaciones disponibles. Lo ideal es que tengas esto configurable para cada servidor de correos distintos, como gmail, outlook, entre otros.

Saludos.

newtron 15-05-2015 18:05:18

Cita:

Empezado por jeikey (Mensaje 492193)
Hace aproximadamente el mismo tiempo que tú, tuve el mismo problema con outlook, mas no con gmail. La solución fue configurar el control del ssl dentro del codigo:

IdSSLIOHandler.SSLOptions.Method := sslvSSLv23;

Ahi puedes ir jugando con otras asignaciones disponibles. Lo ideal es que tengas esto configurable para cada servidor de correos distintos, como gmail, outlook, entre otros.

Saludos.

Gracias jeikey por tu respuesta.

Ya había probado a cambiar ese parámetro y me da el error "Connection Closed Gracefully" así que no sé si hay que cambiar algo más. ¿Tú en la actualidad puedes enviar correos con hotmail?

Saludos

jeikey 18-05-2015 19:49:06

Cita:

Empezado por newtron (Mensaje 492195)
Gracias jeikey por tu respuesta.

Ya había probado a cambiar ese parámetro y me da el error "Connection Closed Gracefully" así que no sé si hay que cambiar algo más. ¿Tú en la actualidad puedes enviar correos con hotmail?

Saludos

Así es, estoy enviando correos con hotmail. Actualmente, estoy apuntando a outlook (hotmail) a través del puerto 587 (SMTP). Podrías mostrarnos tu código para ver si necesitas alguna configuración adicional.

newtron 19-05-2015 09:39:27

Claro... el código no tiene nada de particular y creo que ha salido de ejemplos de por aquí (si mal no recuerdo de un ejemplo que adjuntó ROMAN en su día).

He extraido lo básico para no alargar mucho el tema. Los valores que no cambio se supone que coge por defecto los del componente.

Código Delphi [-]
procedure TFormEnviaCorreoSSL.btnEnviarCorreoClick(Sender: TObject);
var
  IdEnviar: TIdMessage;
  N,iPuerto: SmallInt;
  ElDestinatario:      TIdEmailAddressItem;
begin
  iPuerto:=587;  // Con el 25 hace exactamente lo mismo
  IdEnviar := TIdMessage.Create(Self);
  IdEnviar.Body.Text     := MemoTexto.Text; // Cuerpo del mensaje
  IdEnviar.From.Address  := EditCuentaRemitente.Text ; // e-mail del que envía
  IdEnviar.From.Name     := EditNombre.Text ; // Nombre del que envía
  IdEnviar.Subject       := EditAsunto.Text ; // Asunto
  // Destinatario/s
  for N := 0 to MemoDestinatarios.Lines.Count-1 do begin
    if MemoDestinatarios.Lines[N]<>'' then begin
      ElDestinatario         := IdEnviar.Recipients.Add;
      ElDestinatario.Address := MemoDestinatarios.Lines[N];
    end;
  end;
  IdSMTP1.Host       := smtp-mail.outlook.com;
  IdSMTP1.UserName   := xxxxxx;
  IdSMTP1.Password   := xxxxx;
  IdSMTP1.Port       := iPuerto;
  // TLS
  idSMTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL;
  idSMTP1.UseTLS := utUseExplicitTLS;
  Try
    IdSMTP1.Connect;
    IdSMTP1.Send(idEnviar);
  except
    raise;
    ShowMessage('¡ATENCION! Problema de conexion');
    exit;
  end;
  IdSMTP1.Disconnect(true);
  ShowMessage('Correo enviado');
end;

Gracias y un saludo

newtron 18-05-2016 17:31:47

Hola.

Después de tanto tiempo este error con hotmail no se solucionó, lo que hice fue ir migrando los correos a gmail.

El problema es que ahora me está pasando exactamente lo mismo con gmail, cuentas de correo que siempre han funcionado sin problemas ahora no funcionan.

¿Alguien está teniendo problemas con gmail? o dicho de otra forma, ¿os funciona actualmente el envío de correos electrónicos con gmail usando las Indy?

Gracias y un saludo

roman 18-05-2016 17:43:52

Cita:

Empezado por newtron (Mensaje 505303)
¿os funciona actualmente el envío de correos electrónicos con gmail usando las Indy?

No. Al parecer Google ha puesto muchas condiciones para considerar seguro un servicio de correo. Quizá esto aclare algo, o quizá confunda más (como a mi). Sólo permitiendo "acceso a aplicaciones inseguras" desde la cuenta de gmail se puede.

LineComment Saludos

newtron 18-05-2016 19:12:00

Cita:

Empezado por roman (Mensaje 505304)
No. Al parecer Google ha puesto muchas condiciones para considerar seguro un servicio de correo. Quizá esto aclare algo, o quizá confunda más (como a mi). Sólo permitiendo "acceso a aplicaciones inseguras" desde la cuenta de gmail se puede.

LineComment Saludos

Pues yo ya tenía esa opción activada y no me funciona, ¿a ti si?, en caso afirmativo ¿puedes ponerme un ejemplo sencillo a ver si estoy haciendo algo distinto?

Saludos

roman 18-05-2016 21:00:56

Cita:

Empezado por newtron (Mensaje 505307)
¿a ti si?

Sí. El ejemplo que puse en http://clubdelphi.com/foros/showthread.php?t=40611 sigue funcionando activando las aplicaciones inseguras. De lo que alcanzo a ver en tu código noto estas diferencias:

Port: tienes el 587, yo tengo el 465
UseTLS: tú tienes Explicit y yo tengo Implicit

LineComment Saludos

Neftali [Germán.Estévez] 19-05-2016 08:54:27

Con tengo uno que envía utilizando Indy10 y Gmail con los siguientes parámetros y sigue funcionando correctamente.

Código:

[GMail]
MailServer=smtp.gmail.com
PortServer=465
FromAdress=XXXXXX@gmail.com
FromText=NombreXXX
SSLMethod=sslvTLSv1


elguille 19-05-2016 12:12:05

A mi el código me ha dejado de funcionar hace tres dias para clientes diferentes con cuentas diferentes ¿¿??¿
He encontrado este código en internet http://dejensever.com/2013/09/03/del...reos-por-smtp/ que me parece que de momento si funciona aunque no se que pasará día 1 de junio cuando quiten de forma definitiva sslv3.
Código Delphi [-]
function EnviarMensaje(sUsuario, sClave, sServidor, sAdjunto, sAsunto, sDestino, sMensaje: String; iPort: integer): String;
var
  SMTP: TIDSMTP;
  Mensaje: TIdMessage;
  adjunto: TIdAttachmentfile;
  IOHSOSSL: tIdSSLIOHandlerSocketOpenSSL;
begin
  IdSSLOpenSSLHeaders.Load;
  result := 'Mensaje enviado correctamente.';

  IOHSOSSL := tIdSSLIOHandlerSocketOpenSSL.Create;
  IOHSOSSL.Destination := sServidor + ':' + IntToStr(iPort);
  IOHSOSSL.host := sServidor;
  // IOHSOSSL.MaxLineAction := maException;
  IOHSOSSL.port := iPort;
  IOHSOSSL.ssloptions.method := sslvTLSv1;
  IOHSOSSL.ssloptions.VerifyMode := [];
  IOHSOSSL.ssloptions.VerifyDepth := 0;

  SMTP := TIDSMTP.Create(nil);
  SMTP.IOHandler := IOHSOSSL;
  SMTP.UserNAME := sUsuario;
  SMTP.password := sClave;
  SMTP.host := sServidor;
  SMTP.port := iPort;
  SMTP.UseTLS := utUseRequireTLS;

  Mensaje := TIdMessage.Create(nil);
  Mensaje.Clear;
  Mensaje.From.Name := sDestino;
  Mensaje.From.Address := sDestino;
  Mensaje.Subject := sAsunto;
  Mensaje.Body.Text := sMensaje;
  Mensaje.Recipients.Add;
  Mensaje.Recipients.Items[0].Address := sDestino;

  if sAdjunto <> '' then
  begin
    if FileExists(sAdjunto) then
      adjunto := TIdAttachmentfile.Create(Mensaje.MessageParts, sAdjunto);
  end
  else
    adjunto := nil;

  try
    SMTP.Connect;
  except
    result := 'Error al conectar con el servidor.';
  end;

  // Si ha conectado enviamos el mensaje y desconectamos
  if SMTP.Connected then
  begin
    try
      // SMTP.SendCmd('STARTTLS', 220);
      SMTP.Send(Mensaje);
    except
      result := 'Fallo en el envio de email';
    end;

    try
      SMTP.Disconnect;
    except
      result := 'Error al desconectar del servidor.';
    end;
  end;

  // Liberamos los objetos creados
  if adjunto <> nil then
    FreeAndNil(adjunto);

  FreeAndNil(Mensaje);
  FreeAndNil(SMTP);

end;

newtron 19-05-2016 16:47:19

Hola.

Este código si que me funciona, ahora tendré que retocarlo para incluirle varios destinatarios, copias ocultas, etc. pero no creo que haya problemas.

Gracias Guille.

Roman, Neftali, gracias por vuestras sugerencias.

Saludos

Neftali [Germán.Estévez] 20-05-2016 09:59:53

Cita:

Empezado por newtron (Mensaje 505332)
ahora tendré que retocarlo para incluirle varios destinatarios

Puedes hacerlo así, si separas las direcciones con punto y coma.
Código Delphi [-]
  Mensaje.Recipients.EMailAddresses := sDireccionesEnvio;


Cita:

Empezado por newtron (Mensaje 505332)
ahora tendré que retocarlo para incluirle varios destinatarios, copias ocultas, etc. pero no creo que haya problemas.


Para eso puedes utilizar las propiedades:

Código Delphi [-]
    Mensaje.CCList
    Mensaje.BccList

Que son del mismo tipo que Recipients.

Cita:

Empezado por newtron (Mensaje 505332)
etc...

Poca cosa más queda...
Por ejemplo, para texto plano o HTML:

Código Delphi [-]
  if (AFormtatoPlano) then begin
     idText := TIdText.Create(Mensaje.MessageParts, TS);
     idText.ContentType := 'text/plain';
  end
  else begin
    idText := TIdText.Create(Mensaje.MessageParts, TS);
    idText.ContentType := 'text/html';
    idText.ContentTransfer := '7bit';
    Mensaje.ContentTransferEncoding := 'text/html';
  end;

newtron 20-05-2016 10:51:44

Neftali. Gracias, todo correcto.

Ahora me encuentro un problema (no crítico) que es que este código que sirve para gmail no me funciona en el resto de clientes que usan otros servidores de correo por tener páginas web. He probado con todas las opciones de utNoTLSSupport, utUseExplicitTLS, utUseImplicitTLS y utUseRequireTLS y nada. No va.

¿Será el method que estamos poniendo "sslvTLSv1"?

Saludos

Neftali [Germán.Estévez] 20-05-2016 12:24:42

En mi caso, lo que he hecho en generar un fichero de configuración según servidor.

Te adjunto una parte:

Código Delphi [-]
[Yahoo]
MailServer=smtp.correo.yahoo.es
PortServer=465

[GMail]
MailServer=smtp.gmail.com
PortServer=465
////// Valores posibles:  SSLMethod = (sslvSSLv2, sslvSSLv23, sslvSSLv3, sslvTLSv1)
SSLMethod=sslvTLSv1


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

...

Los servidores que no tienen valor en alguna característica, cogen el valor por defecto.
He tenidpo que ir probando con los diferentes servidores para obtener configuraciones.

newtron 20-05-2016 13:39:51

Ok.

Gracias, haré pruebas a ver qué voy viendo.

Saludos


La franja horaria es GMT +2. Ahora son las 22:38:58.

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