Ver Mensaje Individual
  #19  
Antiguo 21-11-2013
jcosta jcosta is offline
Registrado
 
Registrado: feb 2008
Posts: 9
Reputación: 0
jcosta Va por buen camino
Al final he conseguido que funcione, he utilizado la versión 0.96m de OpenSSL (también me funciona con la 0.96). Por lo visto el puerto 587 necesita STARTTLS . El código sería algo así:

Código Delphi [-]
 
        // configuramos el envío de correo electrónico
        idSMTP->Host = fmVisual->host_smtp;
        idSMTP->Username = fmVisual->username_smtp;
        idSMTP->Password = fmVisual->password_smtp;
        idSMTP->Port = fmVisual->smtp_puerto;
        idSMTP->IOHandler = NULL;

        if (fmVisual->smtp_SSL != "Ninguno") {
                idSMTP->IOHandler = IdSSL;
        }

        if (fmVisual->smtp_modo_SSL == "sslmUnassigned") {
                IdSSL->SSLOptions->Mode = sslmUnassigned;
        } else {
                if (fmVisual->smtp_modo_SSL == "sslmServer") {
                        IdSSL->SSLOptions->Mode = sslmServer;
                } else {
                        if (fmVisual->smtp_modo_SSL == "sslmClient") {
                                IdSSL->SSLOptions->Mode = sslmClient;
                        } else {
                                if (fmVisual->smtp_modo_SSL == "sslmBoth") {
                                        IdSSL->SSLOptions->Mode = sslmBoth;
                                } else {
                                        IdSSL->SSLOptions->Mode = sslmUnassigned;
                                }
                        }
                }
        }


        // si el puerto requiere STARTTLS como Indy 9 no lo soporta nativamente hay que simularlo
        if (fmVisual->smtp_SSL == "STARTTLS") {
                // primero establecemos el método
                IdSSL->SSLOptions->Method = sslvTLSv1;

                // se coloca PassThrough a true
                IdSSL->PassThrough = true;

                // se llama a Connect
                idSMTP->Connect(IdTimeoutDefault);

                // se envía manualmente un comando STARTTLS
                if (idSMTP->SendCmd("STARTTLS", 220) == 220) {
                        // se coloca PassThrough a false
                        IdSSL->PassThrough = false;

                        // se envía un comando HELO
                        if (idSMTP->SendCmd("HELO " + idSMTP->LocalName, 250) != 250) {
                                idSMTP->Disconnect();
                                MessageDlg("Fallo en envío de comando HELO.", mtError, TMsgDlgButtons() << mbOK, 0);
                        }

                        if (!idSMTP->Authenticate()) {
                                idSMTP->Disconnect();
                                MessageDlg("Autenticación incorrecta.", mtError, TMsgDlgButtons() << mbOK, 0);
                        }
                } else {
                        MessageDlg("Fallo en envío de comando STARTTLS.", mtError, TMsgDlgButtons() << mbOK, 0);
                }
        } else {
                // SSL
                if (fmVisual->smtp_SSL == "sslvTLSv1") {
                        IdSSL->SSLOptions->Method = sslvTLSv1;
                } else {
                        if (fmVisual->smtp_SSL == "sslvSSLv3") {
                                IdSSL->SSLOptions->Method = sslvSSLv3;
                        } else {
                                if (fmVisual->smtp_SSL == "sslvSSLv23") {
                                        IdSSL->SSLOptions->Method = sslvSSLv23;
                                } else {
                                        IdSSL->SSLOptions->Method = sslvSSLv2;
                                }
                        }
                }
        }



        try {
                if (!idSMTP->Connected()) {
                        idSMTP->Connect(IdTimeoutDefault);
                }

                idSMTP->Send(mensaje);
                idSMTP->Disconnect();
                MessageDlg("Envío realizado.", mtInformation, TMsgDlgButtons() << mbOK, 0);

        } catch (Exception &error) {
                MessageDlg("No se pudo realizar el envío:\n\n" + error.Message, mtError, TMsgDlgButtons() << mbOK, 0);
        }
Responder Con Cita