【问题标题】:Is there a work around google disabling "Less secure apps"?是否有解决谷歌禁用“不太安全的应用程序”的方法?
【发布时间】:2022-08-03 10:43:42
【问题描述】:

因此,自 5 月 31 日起,谷歌禁用了“不太安全的应用程序”选项,所以我一直在使用 Java 邮件 API,并且自从更新以来,我无法再使用 Gmail smtp 发送电子邮件。

这是我得到的错误:

javax.mail.AuthenticationFailedException: 535-5.7.8 Username and Password not accepted. Learn more at
535 5.7.8  https://support.google.com/mail/?p=BadCredentials n13-20020a5d400d000000b0020ff7246934sm4970874wrp.95 - gsmtp

我切换到 Outlook 邮件,它似乎工作正常,但我想知道是否有办法使用 Gmail 帐户

Less secure apps & your Google Account

标签: email security gmail jakarta-mail


【解决方案1】:

您可以尝试通过“应用密码”进行身份验证。

在您的 Google 帐户上:

  1. 将“两步验证”设置为开启 2-Step Verification

  2. 创建 16 个字符的“应用程序密码”( How to create app password) -> 结果应该类似于: 16-character "App password"

  3. 使用 16 个字符的密码代替 Google 帐户密码

    MailMessage mail = new MailMessage();
    foreach (string receiver in DolociPrejemnike())
        mail.To.Add(receiver);
    mail.From = new MailAddress("app_gmail@gmail.com", "No replay"); //pošiljatelj (vedno enak)
    mail.Subject = SetSubject();
    mail.Body = SetBody();
    mail.IsBodyHtml = true;
    
    SmtpClient smtp = new SmtpClient();
    smtp.Host = "smtp.gmail.com";
    smtp.Port = 587;
    smtp.UseDefaultCredentials = true;
    smtp.Credentials = new System.Net.NetworkCredential("app_gmail@gmail.com", "xtqapucsmyvqmvxp"); // Enter seders User name and password  
    smtp.EnableSsl = true;
    smtp.Send(mail);
    

【讨论】:

  • 是的,我也成功地做到了这一点。您所要做的就是创建新密码并简单地用它替换您的凭据。其他一切都可以保持不变。不必使用 xoauth2。
  • 这应该是公认的答案,此外,谷歌推荐“应用程序密码”作为不太安全的应用程序的替代方案。
  • 如果代码示例是 Java,而不是 .Net,那将是完美的。
  • 这就是解决方案。
【解决方案2】:

所以感谢所有的重播!我通过这样做解决了这个问题:

我已启用“Windows 机器的应用程序密码” 然后我只是将密码从电子邮件密码更改为谷歌生成的密码

并将代码更改为以下内容:

public class JavaMailUtil {
public static void sendMail(String recepient,String order) throws Exception {

    Properties properties=new Properties();
    properties.put("mail.smtp.auth", "true");
    properties.put("mail.smtp.starttls.enable", "true");
    properties.put("mail.smtp.host", "smtp.gmail.com");
    properties.put("mail.smtp.port", "587");
    String myAccountEmail="yourEmailAddress@gmail.com";
    String password="Generated Windows machine password from google";
    Session session=Session.getInstance(properties, new Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(myAccountEmail, password);
        }
    });
    
    Message message=prepareMessage(session,myAccountEmail,recepient,order);
    Transport.send(message);
    System.out.println("Message Sent successfully");
}

private static Message prepareMessage(Session session,String from,String to,String orderInfo) {
    Message message = new MimeMessage(session);
    try {
        
        message.setFrom(new InternetAddress(from));
        message.setRecipient(Message.RecipientType.TO, new InternetAddress(to));a
        message.setSubject("Your subject here");
        message.setText(");
        return message;
    } catch (AddressException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

}

【讨论】:

    【解决方案3】:

    现在您不能再在 Google 的 smtp 服务器上使用登录名和密码了,唯一的选择就是使用 XOauth2

    我以前没有使用过 Jakarta,但它似乎支持它。你应该看看OAuth2 Support

    Properties props = new Properties();
    props.put("mail.imap.ssl.enable", "true"); // required for Gmail
    props.put("mail.imap.auth.mechanisms", "XOAUTH2");
    Session session = Session.getInstance(props);
    Store store = session.getStore("imap");
    store.connect("imap.gmail.com", username, oauth2_access_token);
    

    应用密码

    选项二是转到您的谷歌帐户并生成一个apps password

    运行代码时,使用生成的密码而不是实际的用户密码。主要问题是不知道谷歌将继续支持应用程序密码多久。

    【讨论】:

    • 谷歌禁用“不太安全的应用程序”后如何发送电子邮件?因为 imap 不能send 电子邮件。
    • 没有必要使用这种方法。使用其他答案中描述的“应用程序密码”就足够了。
    • 你确定谷歌会继续支持应用密码吗? Xoauth2 选项是一个更安全的选项。
    • @DalmTo google 推荐“应用程序密码”,无需担心支持,如果发生这种情况,他们可以使用其他方式。我敢肯定,在那之前还需要几年时间。
    【解决方案4】:

    对于那些遵循其他答案但在使用应用程序密码时仍然收到“身份验证失败”错误的人来说,关键是如果您正在使用该解决方案或遵循使用 oauth2 的指南,则此解决方案不适用于 XOAUTH2。

    所以在下面的代码中:

    props.put("mail.imap.auth.mechanisms", "XOAUTH2");
    

    只需将其更改为以下内容:

    props.put("mail.imap.auth.mechanisms", "XOAUTH");
    

    它应该工作,保持所有其他相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-17
      • 2022-07-19
      • 2023-01-12
      • 2022-07-07
      • 2018-12-16
      • 2022-06-11
      • 2018-05-07
      • 2014-09-29
      相关资源
      最近更新 更多