首页 > 解决方案 > 为我自己的 GMail 帐户获取 OAuth 凭据

问题描述

我使用较旧的 JavaMail API 使用基于密码的身份验证从我的 Android 应用程序发送电子邮件。问题是我使用自己的GMail 帐户发送电子邮件(因此将电子邮件/密码存储在代码中 - 我知道这不是一个好主意)

new PasswordAuthentication(_user, _pass)

我现在已经升级到较新版本的 JavaMail,我想使用 OAuth2

implementation 'com.sun.mail:android-mail:1.6.2'
implementation 'com.sun.mail:android-activation:1.6.2'

如何为我自己的 GMail 帐户生成 OAuth 凭据并使用它们发送电子邮件?


编辑:

这是我到目前为止所尝试的:

  1. 在Google Console上创建了一个项目。在凭证屏幕中,创建 OAuth 客户端 ID - 选择“其他”。这给了我客户端 ID 和客户端密码
  2. 使用oauth2.py,使用客户端 ID 和客户端密码生成访问令牌和刷新令牌(在生产应用程序中,我打算硬编码所有 4:客户端 ID、密码、访问权限、刷新令牌并“永远”继续使用它们" 用于生成新的访问令牌)
  3. 使用 oauth2.py 测试了 SMTP 身份验证是否有效
  4. 修改了我用于发送邮件的 Java 代码,如下所示:

    Properties props = new Properties();
    props.put("mail.smtp.host", "smtp.gmail.com");
    props.put("mail.debug", "true");
    props.put("mail.smtp.port", 587);
    props.setProperty("mail.smtp.socketFactory.port", 587);
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.starttls.enable", "true");
    props.put("mail.smtp.auth.mechanisms", "XOAUTH2");
    
    Session session = Session.getInstance(props);
    SMTPTransport transport = new SMTPTransport(session, null);
    transport.connect("smtp.gmail.com", _user, _accessToken);
    transport.sendMessage(msg, msg.getAllRecipients());
    

现在我得到: java.net.UnknownHostException: mail.google.com Unknown SMTP host: smtp.gmail.com

我无法找到如何在请求上设置访问令牌。代替

transport.connect("smtp.gmail.com", _user, _accessToken);

我也试过

String auth = new String(BASE64EncoderStream.encode(String.format("user=%s\1auth=Bearer %s\1\1", _user, _accessToken).getBytes()));
transport.issueCommand("AUTH XOAUTH2 " + auth, 235);

但同样的错误。

标签: androidjakarta-mail

解决方案


推荐阅读