Domanda

Sto utilizzando server SMTP personalizzato e vorrei verificare la connessione quando l'utente immette le proprie credenziali del server.

Esattamente lo stesso tipo di controllo come Adobe CF e Railo permettono di fare quando si aggiungono server di posta.

Certo, questo non garantisce che consegna dovrà lavorare, ma almeno per controllare quel server / username / entrato passano sono validi.

riesco a vedere un modo ingannevole: provare a inviare l'e-mail con CFMAIL e controllare il registro di posta. Ma io credo che può essere fatto con più elegante.

C'è qualche libreria Java disponibile con ACF Standard / Railo distro per aiutarmi? Come avrei li uso? Esempi sono molto apprezzati.

Grazie in anticipo.

Modifica

Si prega di non essere confuso con Java tag presente. Soluzione necessaria in CFML . Anche se può utilizzare alcune librerie Java, se applicabile.

È stato utile?

Soluzione

Credo sfussenegger ha l'idea giusta. Ma invece di utilizzare un autenticatore personalizzato, per quanto riguarda l'autenticazione tramite connect (..)? Solo provato con gmail. Ma sembra funzionare.

Modifica ho provato questo con CF9 e OBD con successo. Purtroppo, non ho avuto fortuna con Railo ... più scadente.

Modifica Aggiornamento per aggiungere la proprietà "mail.smtp.auth" mancante. Ora dovrebbe funzionare correttamente con Railo pure.

    //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>

Altri suggerimenti

Apache Commons Net , si può fare qualcosa di simile:

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);
   }

Dove client è un'istanza di org.apache.commons.net.smtp.SMTPClient classe. Codice di cui sopra è stata presa dal SMTPClient Documentazione API.

Non è abbastanza, ma potrebbe fare: usare semplicemente provare a inviare una mail a un indirizzo non valido e vedere che cosa il messaggio di errore che si ottiene. Se il messaggio di errore si lamenta di autenticazione non riuscito, si sa che cosa fare.

EDIT po 'di codice di lavoro:

ecco qualche codice di lavoro per convalidare le credenziali di Gmail. Gmail non si lamenta il illegale @ localhost però. Ora si potrebbe o provare a cercare per un destinatario che causa un'eccezione o posta realmente inviare a un indirizzo e scartare immediatamente. . Edit: Non è nemmeno necessario inviare qualcosa. Basta collegare e gestire una possibile 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]));
    }

}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top