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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/2689177/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-29 22:22:05  来源:igfitidea点击:

Verify mail server connection programmatically in ColdFusion

javacoldfusionsmtprailocfml

提问by Sergii

I'm using custom SMTP servers and would like to verify the connection when user enters his own server credentials.

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

Exactly the same type of check as Adobe CF and Railo allow to do when adding mail server.

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

Sure, this does not guarantee that deliverywill be working, but at least to check that entered server/username/pass are valid.

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

I can see one tricky way: try to send the email with cfmailand check the mail log. But I believe that it can be done with more elegant.

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

Is there any Java library available with standard ACF/Railo distro to help me? How would I use them? Examples are highly appreciated.

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

Thanks in advance.

提前致谢。

EDIT:

编辑:

Please don't be confused with Java tag present. Solution needed in CFML. Though it can use some Java libraries, if applicable.

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

回答by Leigh

I think sfussenegger has the right idea. But instead of using a custom authenticator, what about authenticating via connect(..)? Only tested with gmail. But it seems to work.

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

EDIT:I tested this with CF9 & OBD successfully. Unfortunately, I had no luck with Railo ... bummer.

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

EDIT:Updated to add the missing "mail.smtp.auth" property. It should now work correctly with Railo as well.

编辑:更新以添加缺少的“mail.smtp.auth”属性。它现在也应该与 Railo 一起正常工作。

    //Java Version
    int port = 587;
    String host = "smtp.gmail.com";
    String user = "[email protected]";
    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 = "[email protected]";
    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>

回答by folone

Using Apache Commons Net, you can do something like this:

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

Where clientis an instance of org.apache.commons.net.smtp.SMTPClientclass. Code above was taken from the SMTPClient API Docs.

org.apache.commons.net.smtp.SMTPClientclient的实例在哪里。上面的代码取自 SMTPClient API Docs。

回答by sfussenegger

That's not pretty, but could do: simply use try to send an email to an illegal address and see what error message you get. If the error message complains about failed authentication, you know what to do.

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

EDIT some working code:

编辑一些工作代码:

here's some working code to validate Gmail credentials. Gmail doesn't complain about the illegal@localhost though. Now you could either try to search for a recipient that causes an exception or really send mail to an address and discard it immediately.. Edit: It's not even necessary to send something. Simply connect and handle a possible AuthenticationFailedException.

这是一些用于验证 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]));
    }

}