Nhận thư từ GMail vào ứng dụng Java bằng IMAP


76

Tôi muốn truy cập thư trong Gmail từ một ứng dụng Java bằng JavaMailIMAP . Tại sao tôi nhận được SocketTimeoutException ?

Đây là mã của tôi:

Properties props = System.getProperties();
props.setProperty("mail.imap.host", "imap.gmail.com");
props.setProperty("mail.imap.port", "993");
props.setProperty("mail.imap.connectiontimeout", "5000");
props.setProperty("mail.imap.timeout", "5000");

try {
    Session session = Session.getDefaultInstance(props, new MyAuthenticator());
    URLName urlName = new URLName("imap://MYUSERNAME@gmail.com:MYPASSWORD@imap.gmail.com");
    Store store = session.getStore(urlName);
    if (!store.isConnected()) {
        store.connect();
    }
} catch (NoSuchProviderException e) {
    e.printStackTrace();
    System.exit(1);
} catch (MessagingException e) {
    e.printStackTrace();
    System.exit(2);
}

Tôi đã đặt các giá trị thời gian chờ để không mất thời gian chờ "mãi mãi". Ngoài ra, MyAuthenticator cũng có tên người dùng và mật khẩu, có vẻ như thừa với URL. Có cách nào khác để chỉ định giao thức không? (Tôi không thấy nó trong JavaDoc cho IMAP .)


1
Nếu bạn muốn truy cập GMail đề sử dụng JavaMail bạn có thể quan tâm đến code.google.com/p/java-gmail-imap
Đánh dấu McLaren

2
Có bất kỳ giải pháp nào dựa trên IMAP này hoạt động nữa mà không cần phải "Cho phép ứng dụng kém an toàn hơn" không?
jordanpg

Câu trả lời:


70

Sử dụng imaps là một gợi ý tuyệt vời. Cả hai câu trả lời được cung cấp đều không phù hợp với tôi, vì vậy tôi đã tìm kiếm thêm một số câu trả lời và tìm thấy một số câu trả lời phù hợp. Đây là cách mã của tôi trông bây giờ.

Properties props = System.getProperties();
props.setProperty("mail.store.protocol", "imaps");
try {
  Session session = Session.getDefaultInstance(props, null);
  Store store = session.getStore("imaps");
  store.connect("imap.gmail.com", "<username>@gmail.com", "<password>");
  ...
} catch (NoSuchProviderException e) {
  e.printStackTrace();
  System.exit(1);
} catch (MessagingException e) {
  e.printStackTrace();
  System.exit(2);
}

Điều này rất hay vì nó loại bỏ Authenticator thừa ra khỏi hình ảnh. Tôi rất vui vì điều này đã hiệu quả vì SSLNOTES.txt khiến tôi quay cuồng.


8

Bạn cần sử dụng các thuộc tính sau cho imap:

props.setProperty("mail.imaps.host", "imap.gmail.com");
props.setProperty("mail.imaps.port", "993");
props.setProperty("mail.imaps.connectiontimeout", "5000");
props.setProperty("mail.imaps.timeout", "5000");

Thông báo đó là "imap", không phải "imap", vì giao thức bạn đang sử dụng là imap (IMAP + SSL)


6

Trong JavaMail, bạn có thể sử dụng imapslàm lược đồ URL để sử dụng IMAP qua SSL. (Xem SSLNOTES.txttrong phân phối JavaMail bạn để biết thêm chi tiết.) Ví dụ imaps://username%40gmail.com@imap.gmail.com/INBOX.

Tương tự, sử dụng smtpsđể gửi email qua Gmail. vd smtps://username%40gmail.com@smtp.gmail.com/. Một lần nữa, hãy đọc SSLNOTES.txtđể biết thêm chi tiết. Hy vọng nó giúp!


3

Bạn chỉ phải kết nối với GMail bằng SSL. Đặt các thuộc tính sau đây sẽ buộc bạn phải làm như vậy.

props.setProperty ("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.setProperty ("mail.imap.socketFactory.fallback", "false");

Tôi không khuyến khích cách tiếp cận này nói chung, bởi vì nó ghi đè tất cả các kết nối imap thành imap. Đôi khi sự lựa chọn là một điều tốt, đặc biệt nếu chương trình được sử dụng để kết nối với Gmail. Tuy nhiên, nếu bạn nghĩ IMAP đơn giản là hoàn toàn sai, thì cách tiếp cận này có thể chấp nhận được. :-)
Chris Jester-Young

Ý tôi là ... được sử dụng để kết nối với không chỉ Gmail. :-P
Chris Jester-Young

2

Nếu bạn muốn có thêm mã mẫu về cách sử dụng JavaMail với Gmail (ví dụ: chuyển đổi nhãn Gmail thành tên thư mục IMAP hoặc sử dụng IMAP IDLE), hãy xem chương trình GmailAssistant của tôi trên SourceForge .


2

Đây là những gì đã làm việc cho nhóm của tôi và tôi, được đặt biệt hiệu tài khoản cổ điển@gmail.com và tài khoản doanh nghiệp worker@business.com:

            final Properties properties = new Properties();
            properties.put("mail.imap.ssl.enable", "true");

            imapSession = Session.getInstance(properties, null);
            imapSession.setDebug(false);
            imapStore = imapSession.getStore("imap");

            imapStore.connect("imap.gmail.com", USERNAME, "password");

với USERNAME = "biệt hiệu" trong trường hợp cổ điển và USERNAME = "worker@business.com" trong trường hợp tài khoản doanh nghiệp.

Trong trường hợp cổ điển và nếu bạn sử dụng phụ thuộc JavaMail cũ, đừng quên hạ thấp bảo mật tài khoản tại đây: https://www.google.com/settings/security/lesssecureapps

Trong cả hai trường hợp, hãy kiểm tra trong Cài đặt GMail => Chuyển tiếp POP / IMAP nếu IMAP được bật cho tài khoản.

Hy vọng nó giúp!

Để đi xa hơn :


Bạn hiểu "phụ thuộc JavaMail cũ" là gì? Tôi không nghĩ điều này có liên quan gì đến phiên bản JavaMail, đó là bạn đang kết nối với IMAPS thay vì OAUTH2.
jordanpg


1

Tôi đã sử dụng các thuộc tính sau để có được cửa hàng và Nó hoạt động tốt.

"mail.imaps.host" : "imap.gmail.com"
"mail.store.protocol" : "imaps"
"mail.imaps.port" : "993"


0

Bạn cần cài đặt JSSE để sử dụng SSL với Java


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.