2012-05-04 48 views
22

Tôi đang cố triển khai servlet Java Mail, bước đầu tiên là kết nối với máy chủ IMAP.Java Mail tới Exchange Server "không có phương thức đăng nhập nào được hỗ trợ"

Tôi có thể telnet đến server trên cổng 143 (cổng IMAP mặc định), telnet nói: OK The Microsoft Exchange IMAP4 service is ready.

Bây giờ tôi đang cố gắng để kết nối đến máy chủ bằng cách sử dụng API Java Mail như thế này:

Properties props = new Properties(); 
session = Session.getDefaultInstance(props, null); 
store = session.getStore("imap"); 
store.connect("host","user","password"); 

Và tôi có thể kết nối với cùng một máy chủ này bằng cách sử dụng Outlook Webapp hiện có với thông tin đăng nhập tương tự mà tôi đang cố gắng chuyển sang trong java.

Nhưng chạy này với session.setDebug(true) xuất ra như sau:

DEBUG: setDebug: JavaMail version 1.4.5 
DEBUG: getProvider() returning javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc] 
DEBUG: mail.imap.fetchsize: 16384 
DEBUG: mail.imap.statuscachetimeout: 1000 
DEBUG: mail.imap.appendbuffersize: -1 
DEBUG: mail.imap.minidletime: 10 
DEBUG: trying to connect to host "myHost", port 143, isSSL false 
* OK The Microsoft Exchange IMAP4 service is ready. 
A0 CAPABILITY 
* CAPABILITY IMAP4 IMAP4rev1 LOGINDISABLED STARTTLS UIDPLUS CHILDREN IDLE NAMESPACE LITERAL+ 
A0 OK CAPABILITY completed. 
DEBUG: protocolConnect login, host=myHost, user=myUser, password=<non-null> 
javax.mail.MessagingException: No login methods supported!; 

EDIT:

tôi thêm prop.setProperty("mail.imap.starttls.enable", "true") như đề xuất.

Tuy nhiên, tôi bắt đầu nhận được debug đầu ra này:

DEBUG: setDebug: JavaMail version 1.4.5 
DEBUG: getProvider() returning javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc] 
DEBUG: mail.imap.fetchsize: 16384 
DEBUG: mail.imap.statuscachetimeout: 1000 
DEBUG: mail.imap.appendbuffersize: -1 
DEBUG: mail.imap.minidletime: 10 
DEBUG: enable STARTTLS 
DEBUG: trying to connect to host "myHost", port 143, isSSL false 
* OK The Microsoft Exchange IMAP4 service is ready. 
A0 CAPABILITY 
* CAPABILITY IMAP4 IMAP4rev1 LOGINDISABLED STARTTLS UIDPLUS CHILDREN IDLE NAMESPACE LITERAL+ 
A0 OK CAPABILITY completed. 
DEBUG: protocolConnect login, host=myHost, user=myUser, password=<non-null> 
A1 STARTTLS 
A1 OK Begin TLS negotiation now. 
DEBUG IMAP: STARTTLS Exception: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 

Giả sử rằng đây là một vấn đề giấy chứng nhận tôi theo these instructions và thêm vào máy chủ mail để tập cacerts tôi. Các chương trình thử nghiệm bao gồm có chạy hoàn toàn tốt đẹp và tôi có thể kết nối bằng cách sử dụng một url SSL nhưng tôi vẫn có ngoại lệ tương tự khi chạy lớp thư java.

Tôi cũng đã thử thay đổi thành "imaps" bằng: session.getStore("imaps") (thay vì "imap") và thậm chí không thể nhận được thông báo "Microsoft Exchange Server hiện đã sẵn sàng". Tôi nghĩ bởi vì nó đang cố gắng kết nối trên cổng 993 bất cứ khi nào "imaps" được chỉ định. Nhưng việc sử dụng telnet đến cổng 993 không hiển thị bất kỳ kết nối nào với máy chủ email.

Vì vậy, hôm sau tôi đã cố gắng để buộc các chương trình để sử dụng SSL trên cổng 143 như thế này:

// Use SSL 
prop.setProperty("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
prop.setProperty("mail.imap.socketFactory.fallback", "false"); 

// Use port 143 
prop.setProperty("mail.imap.port", "143"); 
prop.setProperty("mail.imap.socketFactory.port", "143"); 

Chỉ nhận ngoại lệ này, vì vậy tôi không nghĩ rằng nó muốn bất cứ điều gì để làm với SSL:

DEBUG: mail.imap.fetchsize: 16384 
DEBUG: mail.imap.statuscachetimeout: 1000 
DEBUG: mail.imap.appendbuffersize: -1 
DEBUG: mail.imap.minidletime: 10 
DEBUG: trying to connect to host "myHost", port 143, isSSL false 
Not able to process the mail reading. 
javax.mail.MessagingException: Unrecognized SSL message, plaintext connection?; 

Có thể ngoại lệ TLS ở trên (DEBUG IMAP: STARTTLS Exception: javax.net.ssl.SSLHandshakeException:) đến từ TLS không được bật trên Exchange Server không?

tôi không có sẵn sàng tiếp cận máy chủ e-mail nhưng tôi có thể có thể có ai đó để cho tôi vào

SOLUTION:.

bình luận HulkingUnicorn của bên dưới câu trả lời của ông chỉ ra this answer đó là xử lý chính xác cần thiết. Rõ ràng MS Exchange Server có vấn đề này. Cùng với việc thêm lớp niêm yết trong đó câu trả lời cho gói của tôi, tôi chỉ đơn giản là thực hiện kết nối mail của tôi như thế này và tất cả là tốt:

Properties prop = new Properties(); 
prop.setProperty("mail.imap.starttls.enable", "true"); 
prop.setProperty("ssl.SocketFactory.provider", "my.package.name.ExchangeSSLSocketFactory"); 
prop.setProperty("mail.imap.socketFactory.class", "my.package.name.ExchangeSSLSocketFactory"); 
session = Session.getDefaultInstance(prop, null); 
session.setDebug(true); 
store = session.getStore("imap"); 
store.connect("myHost","myUser","myPassword"); 

Trả lời

17

phần này, * CAPABILITY IMAP4 IMAP4rev1 LOGINDISABLED đề nghị bạn không thể đăng nhập, trong this thread OP giải quyết nó bằng cách cập nhật Javamail của mình lên 1.4.4 (mặc dù kết quả gỡ lỗi của bạn cho thấy bạn đã có được điều đó).Hãy thử sử dụng 1.4.5.

Thực ra, hãy thử thêm dòng này trước khi bạn tạo phiên; máy chủ email của bạn hỗ trợ nó và nó bị tắt theo mặc định: props.put("mail.imap.starttls.enable", "true");

This answer giải quyết được sự cố.

+0

Tôi đã thử điều này và một số thứ khác nhưng chưa có may mắn. – Geronimo

+1

Nếu bạn sử dụng "imaps", bạn cũng phải thêm 's' vào tất cả các thuộc tính, như 'prop.setProperty (" mail.imaps.port "," 143 ");" Có vẻ như máy chủ sử dụng imaps với số cổng đó mặc dù. – HulkingUnicorn

+0

@Geronimo Bạn đã thử Javamail 1.4.5 chưa? – HulkingUnicorn

5

Bạn có thể sử dụng com.sun.mail.util.MailSSLSocketFactory là một phần của API javamail 1.4.5.

Ví dụ:

MailSSLSocketFactory sf = new MailSSLSocketFactory(); 
sf.setTrustAllHosts(true); 
props.put("mail.imap.starttls.enable", "true"); 
props.put("mail.imap.ssl.socketFactory", sf); 

Không có nhu cầu sử dụng các SSLSocketFactory tùy chỉnh.

+0

Người đàn ông tuyệt vời! bạn đã cứu ngày của tôi –

Các vấn đề liên quan