我正在尝试使用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帐户更改了以下内容,并清除了上述异常:
无2步验证
允许不太安全的应用 “安全” - > “基本设置” - > “转到不太安全的应用设置” - > “允许用户管理他们对安全性较低的应用程序的访问”
但是在清除了上述异常之后。我有另一个例外。
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中继服务
即使在尝试上述更改后,也会抛出相同的异常。 请帮忙。
答案 0 :(得分:0)
必须在传输对象中区分普通身份验证和OAuth2,该对象将实际邮件数据发送到SMTP服务器。 这是在JavaMail中使用 Transport.connect()中的密码参数完成的。
如果上述代码中的密码为 null ,则Java MailClient会将身份验证视为OAuth而非普通身份验证。
所以代码应该是
final String emptyPassword = null;
作为对评论的回复,
如果验证是作为IP地址给出的,则不验证给定的用户名和密码。相反,连接来自的IP地址用作身份验证
当您将发件人IP地址添加到GApps中继邮件设置并选择身份验证类型作为IP地址时,这就是相同代码工作的原因。