Question

J'utilise les serveurs SMTP personnalisé et que vous souhaitez vérifier la connexion lorsque l'utilisateur entre ses propres informations d'identification du serveur.

Exactement le même type de contrôle que Adobe CF et Railo permettent de le faire lors de l'ajout serveur de messagerie.

Bien sûr, cela ne garantit pas que livraison va travailler, mais au moins pour vérifier que le serveur est entré / nom d'utilisateur / pass sont valables.

Je peux voir une façon délicate: essayer d'envoyer l'e-mail avec cfmail et vérifiez le journal de courrier. Mais je crois que cela peut être fait avec plus élégante.

Y at-il bibliothèque Java disponible avec ACF standard / Railo distro pour me aider? Comment puis-je les utiliser? Des exemples sont très appréciés.

Merci à l'avance.

EDIT:

S'il vous plaît ne soyez pas confondre avec Java présente étiquette. Solution nécessaire CFML . Bien qu'il peut utiliser certaines bibliothèques Java, le cas échéant.

Était-ce utile?

La solution

Je pense que sfussenegger a la bonne idée. Mais au lieu d'utiliser un authentificateur personnalisé, l'authentification via ce à propos de connexion (..)? Seulement testé avec gmail. Mais il semble fonctionner.

EDIT: J'ai testé cela avec CF9 et OBD avec succès. Malheureusement, je n'avais pas de chance avec Railo ... bummer.

EDIT: Mise à jour pour ajouter des disparus "mail.smtp.auth" propriété. Il devrait maintenant aussi bien fonctionner correctement avec Railo.

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

Autres conseils

Utilisation Apache Commons Net , vous pouvez faire quelque chose comme ceci:

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

client est une instance de la classe de org.apache.commons.net.smtp.SMTPClient. Code ci-dessus a été prise de l'API smtpclient Docs.

Ce n'est pas jolie, mais pourrait le faire: il suffit d'utiliser essayer d'envoyer un e-mail à une adresse illégale et voir ce message d'erreur que vous obtenez. Si le message d'erreur se plaint de l'authentification a échoué, vous savez quoi faire.

EDIT du code de travail:

Voici un code de travail pour valider les informations d'identification Gmail. Gmail ne se plaint pas de l'exploitation illégale @ localhost bien. Maintenant, vous pouvez soit essayer de rechercher un destinataire qui provoque une exception ou par courrier vraiment envoyer à une adresse et le jeter immédiatement. . Edit: Il est même pas nécessaire d'envoyer quelque chose. Il suffit de connecter et de gérer une possible 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]));
    }

}
scroll top