java 使用Google服务帐户发送电子邮件时,SMTP XOAUTH 2是否正常工作,它总是返回:555 5.5.2语法错误,再见,iy1-8plb.26 - gsmtp

vjhs03f7  于 2023-04-28  发布在  Java
关注(0)|答案(1)|浏览(247)

我有以下配置来使用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,即我的服务帐户和令牌作为密码传递

g2ieeal7

g2ieeal71#

我只是不知道你为什么要使用smtp服务器的服务帐户。gmail API和smtp服务器都使用服务帐户来访问google workspace域上用户的邮件帐户。如果你这样做,那么你应该使用gmail API而不是smtp服务器,因为它更容易使用。
如果你只访问一个用户的Gmail帐户,那么你可以使用该用户的应用程序密码来轻松地完成这一点,然后你可以在需要的时候登录。或者,您可以使用Oauth2,然后存储刷新令牌,并在需要运行脚本时使用它。
但是,要回答您的问题,使用服务帐户,您将不得不指出您想模拟您的Google工作空间域中的哪个用户,这是通过设置setServiceAccountUser来完成的

GoogleCredential credential = new GoogleCredential.Builder()
  .setTransport(httpTransport)
  .setJsonFactory(jsonFactory)
  .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
  .setServiceAccountScopes(DirectoryScopes.ADMIN_DIRECTORY_USERS)
  .setServiceAccountUser(userEmail)
  .setServiceAccountPrivateKeyFromP12File(
      new java.io.File(SERVICE_ACCOUNT_PKCS12_FILE_PATH))
  .build();

相关问题