2009-08-02 6 views
1

서명 된 전자 메일 메시지를 보내는 멋진 Java 클라이언트가 있습니다. 메시지를 보내려면 사용자 이름/암호 인증을 요구하는 Exchange 서버가 있습니다. 내가 Exchange 서버에 연결할 때Exchange 서버는 javax.mail과 함께 제공되는 사용자 이름/암호를 허용하지 않습니다. API

, 나는이 오류가 : 나는 다른 서버 (유닉스 서버)에 연결할 때

avax.mail.AuthenticationFailedException: failed to connect 
     at javax.mail.Service.connect(Service.java:322) 
     at javax.mail.Service.connect(Service.java:172) 

, 나는 아무 문제가 없습니다.

다음은 전체 디버그 추적입니다. 나는 그것을 이해할 수 없다.

DEBUG: JavaMail version 1.4.2 
DEBUG: successfully loaded resource: /META-INF/javamail.default.providers 
DEBUG: Tables of loaded providers 
DEBUG: Providers Listed By Class Name: {com.sun.mail.smtp.SMTPSSLTransport=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SM} 
DEBUG: Providers Listed By Protocol: {imaps=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Sun Microsystems, Inc], } 
DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map 
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc] 
DEBUG SMTP: useEhlo true, useAuth true 
DEBUG SMTP: trying to connect to host "SERVER", port 25, isSSL false 
220 SERVER ESMTP (deca81216f2ecf4fd6fedb030e3dcfd0) 
DEBUG SMTP: connected to host "SERVER", port: 25 

EHLO CLIENT 
250-SERVER Hello CLIENT [192.1.1.1], pleased to meet you 
250-STARTTLS 
250-PIPELINING 
250-SIZE 100000000 
250-AUTH LOGIN PLAIN 
250-AUTH=LOGIN PLAIN 
250-8BITMIME 
250 HELP 
DEBUG SMTP: Found extension "STARTTLS", arg "" 
DEBUG SMTP: Found extension "PIPELINING", arg "" 
DEBUG SMTP: Found extension "SIZE", arg "100000000" 
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN" 
DEBUG SMTP: Found extension "AUTH=LOGIN", arg "PLAIN" 
DEBUG SMTP: Found extension "8BITMIME", arg "" 
DEBUG SMTP: Found extension "HELP", arg "" 
STARTTLS 
220 Ready to start TLS 
EHLO CLIENT 
250-SERVER Hello CLIENT [192.1.1.1], pleased to meet you 
250-PIPELINING 
250-SIZE 100000000 
250-AUTH LOGIN PLAIN 
250-AUTH=LOGIN PLAIN 
250-8BITMIME 
250 HELP 
DEBUG SMTP: Found extension "PIPELINING", arg "" 
DEBUG SMTP: Found extension "SIZE", arg "100000000" 
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN" 
DEBUG SMTP: Found extension "AUTH=LOGIN", arg "PLAIN" 
DEBUG SMTP: Found extension "8BITMIME", arg "" 
DEBUG SMTP: Found extension "HELP", arg "" 
DEBUG SMTP: Attempt to authenticate 
DEBUG SMTP: check mechanisms: LOGIN PLAIN DIGEST-MD5 
AUTH LOGIN 
334 VXNlcn5hbWU6 
RVJOXHNsK2FyZmlu 
334 UGFzc3dvcmQ6 
UVdFUnF3ZXIxMjM0IUAjJA== 
535 Error: authentication failed 
DEBUG SMTP: useEhlo true, useAuth true 
DEBUG SMTP: trying to connect to host "SERVER", port 25, isSSL false 
220 SERVER ESMTP (deca81216f2ecf4fd6fedb030e3dcfd0) 
DEBUG SMTP: connected to host "SERVER", port: 25 

EHLO CLIENT 
250-SERVER Hello CLIENT [192.1.1.1], pleased to meet you 
250-STARTTLS 
250-PIPELINING 
250-SIZE 100000000 
250-AUTH LOGIN PLAIN 
250-AUTH=LOGIN PLAIN 
250-8BITMIME 
250 HELP 
DEBUG SMTP: Found extension "STARTTLS", arg "" 
DEBUG SMTP: Found extension "PIPELINING", arg "" 
DEBUG SMTP: Found extension "SIZE", arg "100000000" 
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN" 
DEBUG SMTP: Found extension "AUTH=LOGIN", arg "PLAIN" 
DEBUG SMTP: Found extension "8BITMIME", arg "" 
DEBUG SMTP: Found extension "HELP", arg "" 
STARTTLS 
220 Ready to start TLS 
EHLO CLIENT 
250-SERVER Hello CLIENT [192.1.1.1], pleased to meet you 
250-PIPELINING 
250-SIZE 100000000 
250-AUTH LOGIN PLAIN 
250-AUTH=LOGIN PLAIN 
250-8BITMIME 
250 HELP 
DEBUG SMTP: Found extension "PIPELINING", arg "" 
DEBUG SMTP: Found extension "SIZE", arg "100000000" 
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN" 
DEBUG SMTP: Found extension "AUTH=LOGIN", arg "PLAIN" 
DEBUG SMTP: Found extension "8BITMIME", arg "" 
DEBUG SMTP: Found extension "HELP", arg "" 
DEBUG SMTP: Attempt to authenticate 
DEBUG SMTP: check mechanisms: LOGIN PLAIN DIGEST-MD5 
AUTH LOGIN 
334 VXNlcm5hbWU6 
RVJOXHNsZ2FyZmlu 
334 UGFzc3dvcmQ6 
UVdFUnF3ZXIxMjM0IUAjJA== 
535 Error: authentication failed 
Error sending mail: failed to connect 
javax.mail.AuthenticationFailedException: failed to connect 
     at javax.mail.Service.connect(Service.java:322) 
     at javax.mail.Service.connect(Service.java:172) 
     at SignMessage.sendSigned(SignMessage.java:248) 
     at SignMessage.main(SignMessage.java:340 
+0

내가 아닌 자바 관련 고객과 일부 비슷한 일을 기억하고, 사용자 이름은 도메인 \ 사용자 이름의 형태로 가지고와 excahnge 서버 설정 방법에 따라, 당신은 너무 예를 들어, 또한 접미사를해야 할 수도 있습니다 companyname \ bob 또는 companyname.COM \ bob 또는 companyname.local \ bob – nos

+0

그래, 나는 그것을 또한 시도 할 것이다. 사용자 이름 앞에 도메인 정보를 추가하면 도움이됩니다. –

답변

7

분명히 MS Exchange SSL 연결이 Java Mail API에 의해 제대로 설정되지 않았습니다. 그것은 SSLSocketFactory을 사용하지만, 정확히 기억한다면 MS Exchange는 다소 복잡한 접근 방식을 필요로합니다.

어쨌든, 난 내 프로젝트 중 하나에이 코드 조각이 :

  • ssl.SocketFactory.provider
  • :

    import javax.net.SocketFactory; 
    import javax.net.ssl.SSLContext; 
    import javax.net.ssl.SSLSocketFactory; 
    import javax.net.ssl.TrustManager; 
    import javax.net.ssl.*; 
    import java.io.IOException; 
    import java.net.InetAddress; 
    import java.net.Socket; 
    import java.security.cert.CertificateException; 
    import java.security.cert.X509Certificate; 
    
    public class ExchangeSSLSocketFactory extends SSLSocketFactory { 
    
    private SSLSocketFactory sslSocketFactory; 
    private SocketFactory socketFactory; 
    
    public ExchangeSSLSocketFactory() { 
        try { 
         socketFactory = SocketFactory.getDefault(); 
    
         SSLContext context = SSLContext.getInstance("TLS"); 
         context.init(null, new TrustManager[] { new EmptyTrustManager() }, null); 
         sslSocketFactory = (SSLSocketFactory)context.getSocketFactory(); 
        } 
        catch (Exception e) { 
         throw new RuntimeException(e); 
        } 
    } 
    
    private final class EmptyTrustManager implements X509TrustManager { 
        public void checkClientTrusted(X509Certificate[] cert, String authType) throws CertificateException {} 
    
        public void checkServerTrusted(X509Certificate[] cert, String authType) throws CertificateException {} 
    
        public X509Certificate[] getAcceptedIssuers() { 
         return new java.security.cert.X509Certificate[0]; 
        } 
    } 
    
    public static SocketFactory getDefault() { 
        return new ExchangeSSLSocketFactory(); 
    } 
    
    @Override 
    public Socket createSocket(Socket socket, String s, int i, boolean flag) throws IOException { 
        return sslSocketFactory.createSocket(socket, s, i, flag); 
    } 
    
    @Override 
    public Socket createSocket(InetAddress inaddr, int i, InetAddress inaddr1, int j) throws IOException { 
        return socketFactory.createSocket(inaddr, i, inaddr1, j); 
    } 
    
    @Override 
    public Socket createSocket(InetAddress inaddr, int i) throws IOException { 
        return socketFactory.createSocket(inaddr, i); 
    } 
    
    @Override 
    public Socket createSocket(String s, int i, InetAddress inaddr, int j) throws IOException { 
        return socketFactory.createSocket(s, i, inaddr, j); 
    } 
    
    @Override 
    public Socket createSocket(String s, int i) throws IOException { 
        return socketFactory.createSocket(s, i); 
    } 
    
    @Override 
    public Socket createSocket() throws IOException { 
        return socketFactory.createSocket(); 
    } 
    
    @Override 
    public String[] getDefaultCipherSuites() { 
        return sslSocketFactory.getSupportedCipherSuites(); 
    } 
    
    @Override 
    public String[] getSupportedCipherSuites() { 
        return sslSocketFactory.getSupportedCipherSuites(); 
    } 
    
    } 
    

    당신은 다음과 같은 속성을 설정하여이 소켓 팩토리를 사용하기 위해 자바 메일 API를 말해

  • mail.smtp.socketFactory.class

전체 클래스 이름 o 디버그 출력에서 ​​F ExchangeSSLSocketFactory

, 그것은 당신이 이미 가지고있는 것 같습니다 : 장소에있는 모든이와

사실에

  • mail.smtp.starttls.enable 세트를, 문제가 해결되어야한다.

+0

감사합니다. 불행히도 그렇게하지 않았습니다. 두 개의 Exchange 서버를 사용할 수 있으며 둘 다 다르게 구성되어 있으며 두 코드 모두 내 코드와 동일한 방식으로 작동합니다. 두 경우 모두 서버가 GSSAPI NTLM 및 LOGIN을 수행 할 수 있다고 말하면 내 시스템에서 LOGIN PLAIN DIGEST-MD5를 사용하므로 javax.mail 시스템이 AUTH LOGIN을 수행하려고하는데 실패하고 있습니다. 이상합니다. 다른 모든 시스템에서 작동하며 교환하지 않습니다. 사용할 수있는 GSSAPI 구현이 있습니까? – vy32

+0

OP 문제와 관련이 없지만이 대답은 Exchange Server의 "No Logon Method Supported"문제를 완전히 해결했습니다. 문제는 약 하루 동안 고민하고있었습니다. 감사! – Geronimo

+0

나는 이것이 매우 오래된 것을 알고 있지만이 대답을 완성하기 위해 필요한 패키지 가져 오기를 추가하고있다. –

0

동일한 문제가있었습니다. 이제 제대로 작동합니다. 나는 바이러스 백신 (McAfee)을 비활성화하고 사용자 이름을 수정했습니다 (불필요하게 도메인을 제공하지 않았지만 필요하지는 않음). 명시 적으로 일반 로그인을 사용하지

+0

흥미 롭군요,하지만 당신이 방관자 효과를 경험하고 있다고 생각합니다. 즉, 내가 한 변화가 당신이 관찰 한 결과로 귀착했다고 생각하지 않습니다. – vy32

+0

McAfee를 사용 중지 한 것이 원인이라고 생각합니다. 직장에서 McAfee는 방화벽을 구축했으며 (McAfee가 번들되는 방식인지는 모르지만) 방화벽이 일부 응용 프로그램을 차단하고있었습니다. –

0

시도 :

properties.setProperty("mail." + protocol + ".auth.plain.disable", "true"); 

또는

props.put("mail.smtp.auth.plain.disable", true); 

분명히 그 때 항상 실패 사실 일반 인증에 대한 지원을 보급 교환의 일부 버전에서 버그가있다

.