Проверьте соединение почтового сервера программно в ColdFusion

Я использую пользовательские серверы SMTP и хотел бы проверить соединение, когда пользователь вводит свои собственные учетные данные сервера.

Точно тот же тип проверки как Adobe CF и Railo позволяет делать при добавлении почтового сервера.

Несомненно, это не гарантирует, что доставка будет работать, но по крайней мере проверять, что вводимый сервер/имя пользователя/передача допустим.

Я вижу один хитрый путь: попытайтесь послать электронное письмо с cfmail и проверить почтовый журнал. Но я полагаю, что это может быть, покончили более изящные.

Действительно ли там какая-либо библиотека Java доступна со стандартным дистрибутивом ACF/Railo для помощи мне? Как я использовал бы их? Примеры высоко ценятся.

Заранее спасибо.

Править:

Не путайтесь с существующим тегом Java. Решение необходимо в CFML. Хотя это может пользоваться некоторыми библиотеками Java, если применимо.

6
задан Jeromy French 3 March 2013 в 06:04
поделиться

3 ответа

Думаю, у sfussenegger правильная идея. Но как насчет аутентификации через соединение (..) вместо использования специального аутентификатора? Проверено только с gmail. Но вроде работает.

РЕДАКТИРОВАТЬ: Я успешно тестировал это с CF9 и OBD. К сожалению, мне не повезло с Railo ... облом.

РЕДАКТИРОВАТЬ: Обновлено, чтобы добавить отсутствующий "mail.smtp.auth" свойство. Теперь оно должно корректно работать и с Рейло.

    //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>
6
ответ дан 17 December 2019 в 00:06
поделиться

Это некрасиво, но подойдет: просто попробуйте отправить электронное письмо на недопустимый адрес и посмотрите, какое сообщение об ошибке вы получите. Если сообщение об ошибке жалуется на неудачную аутентификацию, вы знаете, что делать.

ИЗМЕНИТЬ рабочий код:

вот рабочий код для проверки учетных данных 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]));
    }

}
0
ответ дан 17 December 2019 в 00:06
поделиться

Используя 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);
   }

Где client - это экземпляр org.apache.commons.net.smtp.SMTPClient класс. Код выше был взят из документации API SMTPClient.

1
ответ дан 17 December 2019 в 00:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: