繁体   English   中英

在 ColdFusion 中以编程方式验证邮件服务器连接

[英]Verify mail server connection programmatically in ColdFusion

我正在使用自定义 SMTP 服务器,并希望在用户输入他自己的服务器凭据时验证连接。

与 Adob​​e CF 和 Railo 在添加邮件服务器时允许进行的检查类型完全相同。

当然,这并不能保证交付会正常工作,但至少要检查输入的服务器/用户名/密码是否有效。

我可以看到一种棘手的方法:尝试使用cfmail发送电子邮件并检查邮件日志。 但我相信它可以做得更优雅。

标准 ACF/Railo 发行版是否有任何可用的 Java 库来帮助我? 我将如何使用它们? 示例受到高度赞赏。

提前致谢。

编辑:

请不要与存在的 Java 标签混淆。 CFML 中需要的解决方案。 虽然它可以使用一些 Java 库(如果适用)。

我认为 sfussenegger 的想法是正确的。 但是不是使用自定义身份验证器,而是通过 connect(..) 进行身份验证呢? 只用 gmail 测试过。 但它似乎有效。

编辑:我用 CF9 和 OBD 成功测试了这个。 不幸的是,我对 Railo 不走运......无赖。

编辑:更新以添加缺少的“mail.smtp.auth”属性。 它现在也应该与 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>

使用Apache Commons Net ,您可以执行以下操作:

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

其中clientorg.apache.commons.net.smtp.SMTPClient类的一个实例。 上面的代码取自 SMTPClient API Docs。

这不是很好,但可以这样做:只需使用尝试向非法地址发送电子邮件,然后查看您收到的错误消息。 如果错误消息抱怨身份验证失败,您知道该怎么做。

编辑一些工作代码:

这是一些用于验证 Gmail 凭据的有效代码。 不过,Gmail 不会抱怨非法@localhost。 现在,您可以尝试搜索导致异常的收件人,也可以将邮件真正发送到某个地址并立即将其丢弃。 . 编辑:甚至没有必要发送一些东西。 只需连接并处理可能的 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]));
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM