SMTP Google Apps Oauth2 - 中继

时间:2017-01-24 06:50:16

标签: smtp google-apps oauth2 smtp-auth emailrelay

我正在尝试使用oAuth2机制连接到Google SMTP服务器来发送邮件。

public static Transport connectToSmtp(String smtpServer, int port, String email, String authToken, boolean isDebug, MimeMessage mimeMsg)
     throws Exception
{
    Properties props = new Properties();
    props.put("mail.smtp.starttls.enable", "true");
    props.put("mail.smtp.starttls.required", "true");
    props.put("mail.smtp.sasl.enable", "true");
    props.put("mail.smtp.sasl.mechanisms", "XOAUTH2");
    props.put("mail.imaps.sasl.mechanisms.oauth2.oauthToken", authToken);
    Session session = Session.getInstance(props);
    session.setDebug(isDebug);
    final String emptyPassword = "";
    Transport transport = session.getTransport("smtp");
    transport.connect(smtpServer, port, email, emptyPassword);
    try
    {
        transport.sendMessage(mimeMsg, mimeMsg.getAllRecipients());
    }
    catch (Exception e)
    {
        logger.log(Level.WARNING, "Exception Occured : ", e);
    }
    return transport;
}

我的应用程序的客户ID和秘密:

ID - 345101 * -i6ki * 4tk1sms.apps.googleusercontent.com

秘密 - e6NHB * - eZ-r k

上面的代码引发了以下错误:

  
    

javax.mail.AuthenticationFailedException:535-5.7.8不接受用户名和密码。了解更多信息     535 5.7.8 https://support.google.com/mail/answer/14257 o135sm276925ith.4 - gsmtp

  

Smtp服务器:aspmx.l.google.com, 港口:25

编辑:

我已针对我尝试连接的Google App帐户更改了以下内容,并清除了上述异常:

  1. 无2步验证

  2. 允许不太安全的应用 “安全” - > “基本设置” - > “转到不太安全的应用设置” - > “允许用户管理他们对安全性较低的应用程序的访问”

  3. 但是在清除了上述异常之后。我有另一个例外。

      
        

    com.sun.mail.smtp.SMTPSendFailedException:550-5.7.1中继[121. .2]的凭据无效。您在Google Apps SMTP中继服务中注册的IP地址与此电子邮件发送的帐户的域名不匹配。如果您尝试从未在Googles Apps帐户下注册或具有空信封的域中继邮件,则必须将邮件服务器配置为使用SMTP AUTH标识发送域或显示您的某个域HELO或EHLO命令中的名称。有关更多信息,请访问https://support.google.com/a/answer/6140680#invalidcred f65sm341248ith.1 - gsmtp     ;

      

    所以我更改了以下设置:

    应用> Google Apps> Gmail> Gmail的设置>高级设置

    SMTP中继服务

    • 允许的发件人:任何地址(不推荐)
    • 仅接受来自指定IP地址的邮件:否
    • 需要SMTP身份验证:是
    • 需要TLS加密:否

    即使在尝试上述更改后,也会抛出相同的异常。 请帮忙。

1 个答案:

答案 0 :(得分:0)

必须在传输对象中区分普通身份验证和OAuth2,该对象将实际邮件数据发送到SMTP服务器。 这是在JavaMail中使用 Transport.connect()中的密码参数完成的。

如果上述代码中的密码为 null ,则Java MailClient会将身份验证视为OAuth而非普通身份验证。

所以代码应该是

final String emptyPassword = null;

作为对评论的回复,
如果验证是作为IP地址给出的,则不验证给定的用户名和密码。相反,连接来自的IP地址用作身份验证 当您将发件人IP地址添加到GApps中继邮件设置并选择身份验证类型作为IP地址时,这就是相同代码工作的原因。