Pregunta

Estoy usando servidores SMTP personalizado y me gustaría para verificar la conexión cuando el usuario entra en sus propias credenciales de servidor.

Exactamente el mismo tipo de control como Adobe CF y Railo permiten hacer cuando se agrega el servidor de correo.

Por supuesto, esto no garantiza que Entrega va a trabajar, pero al menos para comprobar pasar ese servidor entrado / nombre de usuario / son válidas.

Veo una manera difícil: tratar de enviar el correo electrónico con el CFMAIL y comprobar el registro electrónico. Pero creo que se puede hacer con más elegante.

¿Hay alguna biblioteca de Java estándar disponible con ACF / Railo distro para que me ayude? ¿Cómo voy a usarlos? Ejemplos son muy apreciados.

Gracias de antemano.

EDIT:

Por favor, no confundir con Java etiqueta presente. Solución necesario en CFML . A pesar de que puede utilizar algunas bibliotecas de Java, en su caso.

¿Fue útil?

Solución

Creo sfussenegger tiene la idea correcta. Pero en lugar de utilizar un autenticador de costumbre, ¿qué pasa con la autenticación a través de conexión (..)? Sólo probado con Gmail. Pero parece que funciona.

EDIT: He probado esto con CF9 y del OBD con éxito. Por desgracia, no tuve suerte con Railo ... fastidio.

EDIT: Actualización para añadir la propiedad "mail.smtp.auth" faltante. Ahora debería funcionar correctamente con Railo también.

    //Java Version
    int port = 587;
    String host = "smtp.gmail.com";
    String user = "username@gmail.com";
    String pwd = "email password";

    try {
        Properties props = new Properties();
        // required for gmail 
        props.put("mail.smtp.starttls.enable","true");
        props.put("mail.smtp.auth", "true");
        // or use getDefaultInstance instance if desired...
        Session session = Session.getInstance(props, null);
        Transport transport = session.getTransport("smtp");
        transport.connect(host, port, user, pwd);
        transport.close();
        System.out.println("success");
     } 
     catch(AuthenticationFailedException e) {
           System.out.println("AuthenticationFailedException - for authentication failures");
           e.printStackTrace();
     }
     catch(MessagingException e) {
           System.out.println("for other failures");
           e.printStackTrace();
     }



<cfscript>
    //CF Version
    port = 587;
    host = "smtp.gmail.com";
    user = "username@gmail.com";
    pwd = "email password";

    try {
        props = createObject("java", "java.util.Properties").init();
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.auth", "true");
        // or use getDefaultInstance instance if desired...
        mailSession = createObject("java", "javax.mail.Session").getInstance(props, javacast("null", ""));
        transport = mailSession.getTransport("smtp");
        transport.connect(host, port, user, pwd);
        transport.close();
        WriteOutput("success");
     } 
     //for authentication failures
     catch(javax.mail.AuthenticationFailedException e) {
           WriteOutput("Error: "& e.type &" ** "& e.message);
     }
     // for other failures
     catch(javax.mail.MessagingException e) {
           WriteOutput("Error: "& e.type &" ** "& e.message);
     }
</cfscript>

Otros consejos

Apache Commons Net , se puede hacer algo como esto:

try {
     int reply;
     client.connect("mail.foobar.com");
     System.out.print(client.getReplyString());
     // After connection attempt, you should check the reply code to verify
     // success.
     reply = client.getReplyCode();
     if(!SMTPReply.isPositiveCompletion(reply)) {
       client.disconnect();
       System.err.println("SMTP server refused connection.");
       System.exit(1);
     }
     // Do useful stuff here.
     ...
   } catch(IOException e) {
     if(client.isConnected()) {
       try {
         client.disconnect();
       } catch(IOException f) {
         // do nothing
       }
     }
     System.err.println("Could not connect to server.");
     e.printStackTrace();
     System.exit(1);
   }

Donde client es una instancia de clase org.apache.commons.net.smtp.SMTPClient . Código anterior fue tomado de la SMTPClient API Docs.

Esto no es bonito, pero no pudo hacer: basta con utilizar trate de enviar un correo electrónico a una dirección ilegal y ver qué mensaje de error que se obtiene. Si el mensaje de error se queja de un error de autenticación, ya sabes qué hacer.

EDITAR algún código de trabajo:

Aquí hay un código de trabajo para validar las credenciales de Gmail. Gmail no se queja de la ilegal @ localhost sin embargo. Ahora usted podría o bien tratar de buscar un destinatario que causa una excepción o correo realmente enviar a una dirección y desechar inmediatamente. . Editar: Ni siquiera es necesario enviar algo. Sólo tiene que conectar y manejar un posible AuthenticationFailedException.

import java.util.Properties;
import javax.mail.AuthenticationFailedException;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;

public class Main {

    private static Session createSmtpSession(final String user, final String password) {
        final Properties props = new Properties();
        props.setProperty("mail.transport.protocol", "smtp");
        props.setProperty("mail.smtp.host", "smtp.gmail.com");
        props.setProperty("mail.smtp.auth", "true");
        props.setProperty("mail.smtp.port", "587");
        props.setProperty("mail.smtp.starttls.enable", "true");

        return Session.getDefaultInstance(props, new javax.mail.Authenticator() {

            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(user, password);
            }
        });
    }

    private static boolean validateCredentials(String user, String password) {
        try {
            Transport transport = createSmtpSession(user, password).getTransport();
            transport.connect();
            transport.close();
        } catch (AuthenticationFailedException e) {
            return false;
        } catch (MessagingException e) {
            throw new RuntimeException("validate failed", e);
        }
        return true;
    }

    public static void main(String[] args) {
        System.out.println(validateCredentials(args[0], args[1]));
    }

}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top