我试图在一个web应用程序(Java1.8/Tomcat8)中使用最新的JavaMail1.6.0 api,代表该应用程序的客户机用户发送电子邮件。一些客户使用Gmail。我不想要求他们按照javamail FAQ的建议,在他们的谷歌账户中允许访问不安全的应用程序,如果需要的话,我愿意实现oauth2。
然后,我使用google oauth客户端在我的应用程序中实现了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();
(代码是返回的授权代码)这似乎有效,并返回访问令牌和刷新令牌。(我也可以回到我的谷歌账户设置,看到我已经授权该应用程序发送电子邮件。
因此,现在我想尝试使用访问令牌通过javamail api发送邮件,使用我的gmail用户名(我为授权应用程序而登录的用户名)、访问令牌和以下设置:
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=<myemail@gmail.com>, 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状态,我将其解释为标记无效。
我还使用google rest API验证了该令牌是好的:
https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=<token>
我也尝试使用启用ssl的端口465,但得到了相同的错误。
我在这里做错了什么?
这是对user2000974答案的补充。Google关于使用OAuth对IMAP或SMTP服务器进行身份验证的文档Gmail>IMAP>OAuth2.0机制明确说明了以下内容
本文档定义了与IMAP AUTHENTICATE和SMTP AUTH命令一起使用的SASL XOAUTH2机制。该机制允许使用OAuth2.0访问令牌对用户的Gmail帐户进行身份验证。
IMAP和SMTP访问的范围是https://mail.google.com/。
我希望这将引导人们在将来偶然发现这个问题到正确的文档页面。
问题内容: 我正在尝试阅读我的消息,我可以获取它来打印标题,但发件人和内容显示得很滑稽。这是我用来显示消息的代码: 输出如下: 为什么不打印出from语句的实际电子邮件地址?为什么不打印出实际的身体内容?(我只是在纯文本中很有趣。) 整个代码: 谢谢! 问题答案: 对于纯文本和html消息: 对于分段消息:
我有两个问题,它们非常相关。 null 编辑:我试着把它弄清楚。假设我在给B发邮件。B先给我发邮件,所以它就在我的收件箱里。然后我给你回信。在Gmail的收件箱中,两封邮件在对话中连接在一起(因为发件人和主题是相同的)。然而,使用javamail,我只能在我的收件箱中看到第一封电子邮件(B发送的),而我的回复则在我的发送箱中。我能把这两封邮件作为对话收集起来吗? 我需要我发送的所有电子邮件以及任何
问题内容: 尝试使用JavaMail API发送邮件时收到此错误。我确定用户名和密码是100%正确的。我要连接的Gmail帐户是一个较旧的帐户,因为他们说使用新帐户需要一些时间。 这是我的代码: 问题答案: 给定的代码段可以在我的Gmail帐户上正常运行,因此此问题出在其他地方。您是否遵循错误消息中给出的链接?它包含以下提示: 确保您输入了完整的电子邮件地址(例如,username@gmail.c
我正在尝试通过Gmail SMTP服务器使用JavaMail发送电子邮件。代码如下: 返回此错误: 无法将套接字转换为TLS; 完整的堆栈跟踪: 异常线程"main"javax.mail.RuntimeException:ervice.connectMessagingException:无法将套接字转换为TLS;嵌套异常是:ervice.java:176SSLHandshakeException:
问题内容: 我正在尝试在JavaMail API的帮助下通过IMAP访问来自Gmail帐户的电子邮件。我想知道为什么代码对一个电子邮件帐户有效,而对另一个电子邮件帐户无效。 我可以访问两个电子邮件帐户的文件夹。但是对于其中一个电子邮件帐户,无法访问其他文件夹,例如,它将引发异常。有人可以解释出什么问题了吗? 先感谢您。 这是代码: 问题答案: 是否有一个帐户使用非英语用户界面? Gmail文件夹名
我试图在WebSphere7中创建一个javamail会话来使用GMail,但我的身份验证总是失败。 是的,伙计,我的密码可以... 我正在将会话配置为: 输出邮件属性 提供商:内置邮件提供商 在会话属性中,我有: mail.smtp.auth=true mail.smtp.port=465 mail.smtp.starttls.enable=真 mail.smtp.socketFactory.p