我想在web应用程序(java 1.8/tomcat8)中使用最新的javamail 1.6.0 api代表客户端用户的应用程序发送电子邮件。有些客户使用Gmail。 我不想让他们按照javamail FAQ的建议在他们的谷歌账户中访问不安全的应用程序,并且我愿意实现oauth2,如果这是需要的。Javamail gmail和OAuth2
为了做到这一点,我做了google developer console如下:
- 创建的oauth2凭证自动创建一个应用程序
- 为
- 授予Gmail的API 应用程序访问的应用程序(客户端ID, clientsecret)
然后,我在我的应用程序中使用google oauth client
实现了oauth2流授权重定向构造:
String url =
new GoogleAuthorizationCodeRequestUrl(clientId,
redirectUrl,
Collections.singleton(GmailScopes.GMAIL_SEND)
).setAccessType("offline").build();
,成功地重定向到谷歌网站,我可以验证和授权我的应用程序,以我的名义发送邮件。它成功地重定向到我的应用程序本人授权后,和应用程序处理的授权码:
GoogleTokenResponse response =
new GoogleAuthorizationCodeTokenRequest(
new NetHttpTransport(),
new JacksonFactory(),
clientId,
clientSecret,
code,
redirectUrl)
.execute();
(其中的代码是返回的授权代码) 这似乎是工作,并返回一个访问令牌和刷新令牌。 (我也可以回到我的谷歌帐户设置,并看到我已授权应用程序发送电子邮件
所以现在我想尝试使用访问令牌通过使用我的gmail用户名的javamail api发送邮件(我登录的授权应用程序中的一个),访问令牌,并进行如下设置:
host = "smtp.gmail.com";
port = 587;
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.auth.mechanisms", "XOAUTH2");
JavaMail的代码工作正常,其他SMTP服务器 我也打开调试跟踪的SMTP流量
DEBUG: JavaMail version 1.6.0
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.SMTPSSLTransport,Oracle], com.sun.mail.smtp.SMTPTransport=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle], com.sun.mail.imap.IMAPSSLStore=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle], com.sun.mail.pop3.POP3SSLStore=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Oracle], com.sun.mail.imap.IMAPStore=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle], com.sun.mail.pop3.POP3Store=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Oracle]}
DEBUG: Providers Listed By Protocol: {imaps=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle], imap=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle], smtps=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle], pop3=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Oracle], pop3s=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Oracle], smtp=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]}
DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 587, isSSL false
220 smtp.gmail.com ESMTP c7sm3632131pfg.29 - gsmtp
DEBUG SMTP: connected to host "smtp.gmail.com", port: 587
EHLO 10.0.0.5
250-smtp.gmail.com at your service, [216.165.225.194]
250-SIZE 35882577
250-8BITMIME
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8
DEBUG SMTP: Found extension "SIZE", arg "35882577"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "CHUNKING", arg ""
DEBUG SMTP: Found extension "SMTPUTF8", arg ""
STARTTLS
220 2.0.0 Ready to start TLS
EHLO 10.0.0.5
250-smtp.gmail.com at your service, [216.165.225.194]
250-SIZE 35882577
250-8BITMIME
250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8
DEBUG SMTP: Found extension "SIZE", arg "35882577"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH"
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "CHUNKING", arg ""
DEBUG SMTP: Found extension "SMTPUTF8", arg ""
DEBUG SMTP: protocolConnect login, host=smtp.gmail.com, user=<[email protected]>, password=<non-null>
DEBUG SMTP: Attempt to authenticate using mechanisms: XOAUTH2
DEBUG SMTP: Using mechanism XOAUTH2
DEBUG SMTP: AUTH XOAUTH2 command trace suppressed
DEBUG SMTP: AUTH XOAUTH2 failed, THROW:
javax.mail.AuthenticationFailedException: OAUTH2 asked for more
...
DEBUG SMTP: AUTH XOAUTH2 failed
ERROR 2017-08-06 18:39:57,443 - send: 334 eyJzdGF0dXMiOiI0MDAiLCJzY2hlbWVzIjoiQmVhcmVyIiwic2NvcGUiOiJodHRwczovL21haWwuZ29vZ2xlLmNvbS8ifQ==
解码最后一行我发现错误是400状态,我解释为表示该标记无效。
我也验证令牌是好的使用谷歌REST API:
https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=<token>
我也使用启用SSL端口465尝试过,但得到了同样的错误。
我在做什么错在这里?
你尝试重新生成令牌? – Oleg
您将访问令牌(而不是刷新令牌)作为密码传递给JavaMail API,对吧?而且,在传递它之前,您没有以任何方式对令牌进行编码,对吧?该标记应该少于80个字符,并且看起来像“ya29.3QEMCT ...”。您可能希望将mail.debug.auth属性设置为true,以便您可以在调试输出中查看身份验证交换的详细信息,以防服务器提供更多正常调试中所禁止的错误细节输出。你能配置Thunderbird在你的账户中使用OAUTH2吗? –
是的,尝试使用最初生成的身份验证令牌,并尝试刷新它。我确实启用了mail.debug.auth。没有看到更多的输出。 – user2000974