2010-04-22 7 views
6

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

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

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

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

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

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

EDIT:

Пожалуйста, не следует путать с Java присутствует ярлык. Требуется решение в CFML. Хотя он может использовать некоторые библиотеки Java, если это применимо.

ответ

6

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

EDIT: Я проверил это с CF9 & OBD успешно. К сожалению, мне не повезло с Рейто ... облом.

EDIT: Обновлено, чтобы добавить недостающее свойство "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> 
+0

Спасибо! Именно то, что мне нужно. – Sergii

+0

Добро пожаловать :) (дополнительные символы здесь, потому что SO ненавидят краткость) – Leigh

+0

Кроме того, тестируя это сейчас, я получаю сообщения об успешном выполнении, даже если настройки неправильные. Любая идея почему? (Использование размещенного SMTP с 1and1, а не gmail) – ntgCleaner

0

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

EDIT некоторые рабочий код:

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

Нет, не будут ошибок, если атрибуты электронной почты имеют правильный синтаксис: сообщение будет перенесено в пул. Вот что я упомянул в своем вопросе, когда рассказывал о разборе mail.log. – Sergii

+0

@Sergii вот некоторый рабочий код.Речь идет не о разборе журналов, а только об обработке исключений. – sfussenegger

+0

, если такого исключения не существует, SMTP-сервер, скорее всего, настроен на бесшумный отказ, что было бы довольно странным. Я подозреваю, что cfmail просто глотает исключение. – sfussenegger

1

Использование 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.

+0

Спасибо, по крайней мере, этот класс присутствует в пакете Railo, и я могу проверить соединение сейчас. Хотя я не могу найти метод тестирования пользователя/прохода. – Sergii

Смежные вопросы