Frage

Ich bin mit benutzerdefinierten SMTP-Server und möchte die Verbindung überprüfen, wenn Benutzer-Credentials seinen eigenen Server eingibt.

Genau die gleiche Art von Kontrolle, wie Adobe CF und Railo erlauben zu tun, wenn E-Mail-Server hinzugefügt wird.

Sicher, dies nicht garantieren, dass Lieferung in Ordnung arbeiten werden, aber zumindest, dass eingegeben zu überprüfen Server / Benutzername / Pass gültig sind.

kann ich eine schwierige Art und Weise sehen: versuchen, die E-Mail mit cfmail zu senden und prüfen Sie das Mail-Protokoll. Aber ich glaube, dass es mit eleganten getan werden kann.

Gibt es eine Java-Bibliothek mit Standard-ACF / Railo distro mir zu helfen? Wie würde ich sie nutzen? Beispiele sind sehr willkommen.

Vielen Dank im Voraus.

EDIT:

Bitte nicht mit Java-Tag vorhanden verwechselt werden. Lösung benötigt in CFML . Obwohl es eine Reihe von Java-Bibliotheken verwenden kann, falls zutreffend.

War es hilfreich?

Lösung

Ich denke, sfussenegger die richtige Idee hat. Aber anstatt eine benutzerdefinierte Authenticator zu verwenden, was über connect Authentifizierung (..)? Nur mit gmail getestet. Aber es scheint zu funktionieren.

EDIT: Getestet habe ich diese mit CF9 & OBD erfolgreich. Leider hatte ich kein Glück mit Railo ... Bummer.

EDIT: Aktualisiert die fehlende "mail.smtp.auth" Eigenschaft hinzufügen. Es soll jetzt auch korrekt mit Railo arbeiten.

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

Andere Tipps

Mit Apache Commons Net , können Sie etwas tun:

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

Wo client ist eine Instanz von org.apache.commons.net.smtp.SMTPClient Klasse. Code oben vom SMTPClient API-Dokumentation entnommen wurde.

Das ist nicht schön, aber tun könnte: einfach nutzen versuchen, eine E-Mail an eine illegale Adresse zu senden und sehen, was Fehlermeldung Sie erhalten. Wenn die Fehlermeldung über gescheiterte Authentifizierung beschwert, wissen Sie, was zu tun ist.

EDIT einige Arbeitscode:

hier einige Arbeitscode zu Google Mail-Anmeldeinformationen zu validieren. Google Mail beschwert sich nicht über die illegale @ localhost though. Nun könnte man entweder versuchen, für einen Empfänger zu suchen, die eine Ausnahme oder wirklich senden Sie eine Mail an eine Adresse verursacht und entsorgen Sie sie sofort. . Edit: Es ist nicht einmal notwendig, etwas zu senden. Verbinden Sie einfach und eine mögliche AuthenticationFailedException zu behandeln.

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

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top