我有以下配置来使用Google的服务帐户获取访问令牌,使用访问令牌进行OAUTH2身份验证并通过SMTPTransport连接。
以下是邮件会话属性:
<mailSession description="SMTP javax.mail.session" from="someone.iam.gserviceaccount.com">
<property name="mail.smtp.host" value="smtp.gmail.com"/>
<property name="mail.smtp.auth" value="true"/>
<property name="mail.smtp.port" value="587"/>
<property name="mail.smtp.ssl.enable" value="false"/>
<property name="mail.smtp.sasl.enable" value="true"/>
<property name="mail.smtp.ehlo" value="false"/>
<property name="mail.smtp.sasl.mechanisms" value="XOAUTH2"/>
<property name="mail.smtp.auth.plain.disable" value="true"/>
<property name="mail.smtp.auth.login.disable" value="true"/>
<property name="mail.smtp.starttls.required" value="true"/>
<property name="mail.smtp.ssl.protocols" value="TLSv1.2"/>
<property name="mail.smtp.connectiontimeout" value="10000"/>
</mailSession>
使用Google服务帐户凭据获取访问令牌:
try (FileInputStream serviceAccountStream = new FileInputStream(credentialsPath)) {
credentials = ServiceAccountCredentials.fromStream(serviceAccountStream).createScoped(Collections.singleton("https://mail.google.com/"));
credentials.refresh();
accessToken = credentials.getAccessToken();
System.out.println("Access token2: " + accessToken.getTokenValue());
}
accessToken保存访问令牌对象。我已经观察了令牌,并确认结构似乎有效。即yaxx.c.dxVaekmxICgknK
根据JavaMail 1上的文档,这就是发生错误的地方。5.5+,认证如下:
SMTPTransport transport = new SMTPTransport(session, null);
transport.connect("smtp.gmail.com", 587, "sender@example.com", accessToken);
以上操作失败,并出现以下错误(私有值已被编辑):
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=sample-service@gmail.iam.gserviceaccount.com, password=<non-null>
DEBUG SMTP: Authenticate with SASL
DEBUG SMTP: SASL mechanisms allowed: XOAUTH2
DEBUG SMTP: SASL Mechanisms:
DEBUG SMTP: XOAUTH2
DEBUG SMTP:
DEBUG SMTP: SASL client XOAUTH2
DEBUG SMTP: SASL callback length: 2
DEBUG SMTP: SASL callback 0: javax.security.auth.callback.NameCallback@66fdec9
DEBUG SMTP: SASL callback 1: javax.security.auth.callback.PasswordCallback@57abad67
AUTH XOAUTH2 dXNlcj1zYW1wbGUtc2VydmljZUBnbWFpbC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbWF1dGg9QmVhcmVyIHlhMjkuYy5iMFZoZHNTVUhBanNvSldTT0lXU3VkbHNqc25zaXVoc2xpdW5hdVNVSDEzOHJsczgzbGFqYXFhaGhzOHVzaWRmamhza3VkYWRESAo=
555 5.5.2 Syntax error, goodbye. f17-40040a170904ab9100b001922d98cb4esm19571022plr.288 - gsmtp
DEBUG SMTP: SASL authentication failed
javax.mail.AuthenticationFailedException: failed to connect
at javax.mail.Service.connect(Service.java:403)
发送方和接收方的格式为:“ www.example.com ”
我能够进行身份验证,从而连接时,使用谷歌应用程序密码(与适当的属性),但不是这个。我也试过委托用户,但这不是问题所在。为什么我们得到这个
我尝试了不同格式的邮件(e。g using〈〉)我曾尝试购买一个G-suite以便委派用户
我希望能够运输。连接和运输。sendMessage使用OAuth2。0,即我的服务帐户和令牌作为密码传递
1条答案
按热度按时间g2ieeal71#
我只是不知道你为什么要使用smtp服务器的服务帐户。gmail API和smtp服务器都使用服务帐户来访问google workspace域上用户的邮件帐户。如果你这样做,那么你应该使用gmail API而不是smtp服务器,因为它更容易使用。
如果你只访问一个用户的Gmail帐户,那么你可以使用该用户的应用程序密码来轻松地完成这一点,然后你可以在需要的时候登录。或者,您可以使用Oauth2,然后存储刷新令牌,并在需要运行脚本时使用它。
但是,要回答您的问题,使用服务帐户,您将不得不指出您想模拟您的Google工作空间域中的哪个用户,这是通过设置
setServiceAccountUser
来完成的