2016-05-03 69 views
0

私はスコープを使用しています:mail.send、mail.readwrite、mail.read、offline_access、openid、email、and profile(私はこれらのすべてを必要としないと確信しています - 目標は受信箱を読んで電子メールを送信し、電子メールと名前があればそれを取得することです)。電子メールを送信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; 

}

さて、私は最も不快な部分に遭遇する可能性があります...私はGmailに接続するために "connectToSMTP"メソッドを使用しており、それは完全に機能しました。

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

最終的に私の質問は「私は間違っていますか?または「Outlookで電子メールを送信できるように更新することはできますか?」 OutlookにはREST APIがありますが、それは計画Bです。OutlookとGmailの違いは何ですか?

私が検討しているいくつかの事柄:

  1. スコープaccess_tokenはをから、それをデコード間違って格納されるか、または何らかの方法でエンコード(試みた
  2. (私はおそらく今あまりにも多くを求めています)十分なアクセスを要求しませんでしたbase_64は何も提供しなかった)。私はrefresh_tokenを使用してaccess_tokenを更新することができます。そうすれば、おそらく正しく格納されているはずです。
  3. パスワードにnullを渡してみました。また、実際のパスワードで渡され、それは働いていますが、私は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 failed: OAuth認証が無効なトークンのために失敗しました。コード-2147184118 "2の補数で16進数に変換されたときの数値は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

SASM XOAUTH2メカニズムのみを使用するようにJavaMailを設定します。 – 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.getInstance(props); ストアストア= session.getStore( "imap"); store.connect( "imap.gmail.com"、username、oauth2_access_token);

+0

ありがとうございます。 SMTPとIMAPを使ってGmailに接続できます。 Outlookには何か別のものがあります。具体的にはSMTPの場合は、メールを送信できるようになったらIMAPを調べます。 –