2016-05-03 213 views
0

我使用的範圍:mail.send,mail.readwrite,mail.read,offline_access,openid,電子郵件和配置文件(儘管我相當有信心我不需要所有這些 - >目標是閱讀收件箱和發送電子郵件,同時還會收到電子郵件和姓名(如果存在)。發送電子郵件OAUTH2 SMTP Outlook Java

我然後連接到SMTP服務器用下面的代碼:

OAuth2Authenticator.connectToSmtp("smtp-mail.outlook.com", 
      587, 
      user.getOutlookUid(), 
      accessToken, 
      true); 

實際連接到服務器的代碼如下:

public static SMTPTransport connectToSmtp(String host, int port, String userEmail, String oauthToken, boolean debug) 
    throws Exception { 

Properties props = new Properties(); 
props.put("mail.smtp.starttls.enable", "true"); 
props.put("mail.smtp.starttls.required", "true"); 
props.put("mail.smtp.sasl.enable", "true"); 
props.put("mail.smtp.sasl.mechanisms", "XOAUTH2"); 
props.put("mail.smtp.sasl.mechanisms.oauth2.oauthToken", oauthToken); 
Session session = Session.getInstance(props); 
session.setDebug(debug); 


URLName unusedUrlName = null; 
SMTPTransport transport = new SMTPTransport(session, unusedUrlName); 
// If the password is non-null, SMTP tries to do AUTH LOGIN. 
String password = ""; 
transport.connect(host, port, userEmail, password); 

return transport; 

}

好吧,現在我可能會遇到最令人沮喪的部分...我已經使用「connectToSMTP」方法連接到Gmail,並且工作完美。

OAuth2Authenticator.connectToSmtp("smtp.gmail.com", 
      587, 
      user.getGoogleUid(), 
      accessToken, 
      true); 

所以最終我的問題是「我做錯了什麼?」或「我可以通過Outlook更新哪些內容以便發送電子郵件」?我已經看到Outlook有一個REST API,但那是計劃B. Outlook與Gmail有什麼不同嗎?

有些事情我已經考慮:

  1. 範圍沒有要求足夠的訪問(所以我可能我的要求太高了)
  2. 的access_token儲存不當或編碼以某種方式(試圖從對其進行解碼base_64沒有提供任何內容)。我能夠使用我的refresh_token來更新access_token,以便告訴我我可能正確地存儲它們。
  3. 我試着爲密碼傳遞null。也傳遞了實際的密碼和WORKED,但我有access_token和refresh_token,所以我不應該要求他們的顯式密碼。這對於用戶來說也是危險而粗略的。
  4. 我嘗試使用「openssl s_client -crlf -starttls smtp -connect smtp-mail.outlook.com:587」手動連接到smtp服務器,但它似乎認爲我的access_token錯誤「535 5.0.0 OAuth失敗:代碼-2147184118「採用二進制補碼並轉換爲十六進制時的數字是0x8004920a。幫助搜索,但無濟於事。
  5. 我已經做了大量的搜索,現在將繼續發佈到處。它爲Gmail提供了大量資源,但如前所述,我已經在Gmail中使用它。 Outlook有些不同之處。此外,我遇到過很多關於電子郵件客戶端上的電子郵件轉發的帖子......我正在半創建一個電子郵件客戶端,所以通過outlook.com設置不能幫助我。

我的一個好友的另一個問題是我的訪問令牌非常長,對手動smtp服務器聲稱的內容做出了貢獻。它是1188個字符長。這就像'EwB4Aul3BAAUo4xeBIbHjhBxWOFekj4Xy2 ... x9stHxi2K/VFggE ='(顯然我隱藏了大部分角色)。

任何人提供建議或發現我的問題,先發制人感謝您。特別是爲什麼我可以傳遞電子郵件密碼並失敗,但使用oauth access_token失敗。

回答

0

嘗試使用「pop3:// user:password @ host:port/INBOX」。從收件箱中取回電子郵件, 更多信息可以查到https://javamail.java.net/docs/api/com/sun/mail/pop3/package-summary.html

+0

問他們明確的密碼是一個糟糕的用戶體驗。我應該可以發送只有{email,access_token}的電子郵件。您是否知道我可以使用OAuth2.0令牌通過SMTP或其他非REST協議發送電子郵件的方式。 –

+0

將JavaMail配置爲僅使用SASL XOAUTH2機制。 – user2433281

+0

問題是我無法連接。該代碼甚至沒有得到我發送電子郵件的部分。這是一個很好的見解,一旦我建立了一個強大的SMTP連接(對於Outlook),我會進行調查。 –

0

希望這會有所幫助:https://technet.microsoft.com/en-ca/dn44016。屬性props = new Properties(); props.put(「mail.imap.ssl.enable」,「true」); //需要Gmail props.put(「mail.imap.auth.mechanisms」,「XOAUTH2」); Session session = Session.getInstance(props); Store store = session.getStore(「imap」); store.connect(「imap.gmail.com」,用戶名,oauth2_access_token);

+0

謝謝你的迴應。我可以通過SMTP和IMAP連接到Gmail。 Outlook有一些不同之處。現在特別針對SMTP,一旦我可以收到電子郵件發送工作,我會研究IMAP。 –