JavaMail与Gmail:535-5.7.1用户名和密码不被接受。

31

使用JavaMail API发送邮件时,我收到了错误提示,但我确定用户名和密码是100%正确的。我连接的Gmail账户是一个较老的账户,因为他们说新账户需要时间才能正常工作。

接收到的错误信息:

DEBUG SMTP RCVD: 535-5.7.1 Username and Password not accepted. Learn more at

535 5.7.1 http://mail.google.com/support/bin/answer.py?answer=14257 x35sm3011668
wfh.6

javax.mail.SendFailedException: Sending failed;
  nested exception is:
        javax.mail.AuthenticationFailedException
        at javax.mail.Transport.send0(Transport.java:218)
        at javax.mail.Transport.send(Transport.java:80)
        at Main.<init>(Main.java:41)
        at Main.main(Main.java:51)

...这是我的代码:

import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;
 
public class Main
{
    String  d_email = "abc@gmail.com",
            d_password = "pass",
            d_host = "smtp.gmail.com",
            d_port  = "465",
            m_to = "abc@gmail.com",
            m_subject = "Testing",
            m_text = "testing email.";
    
    public Main()
    {
        Properties props = new Properties();
        props.put("mail.smtp.user", d_email);
        props.put("mail.smtp.host", d_host);
        props.put("mail.smtp.port", d_port);
        props.put("mail.smtp.starttls.enable","true");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.debug", "true");
        props.put("mail.smtp.socketFactory.port", d_port);
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.socketFactory.fallback", "false");
 
        SecurityManager security = System.getSecurityManager();
 
        try
        {
            Authenticator auth = new SMTPAuthenticator();
            Session session = Session.getInstance(props, auth);
            session.setDebug(true);
            MimeMessage msg = new MimeMessage(session);
            msg.setText(m_text);
            msg.setSubject(m_subject);
            msg.setFrom(new InternetAddress(d_email));
            msg.addRecipient(Message.RecipientType.TO, new InternetAddress(m_to));
            Transport.send(msg);
        }
        catch (Exception mex)
        {
            mex.printStackTrace();
        } 
    }
    
    public static void main(String[] args)
    {
        Main blah = new Main();
    }
 
    private class SMTPAuthenticator extends javax.mail.Authenticator
    {
        public PasswordAuthentication getPasswordAuthentication()
        {
            return new PasswordAuthentication(d_email, d_password);
        }
    }
}

11
@bobby:您的密码的base64编码值在原始帖子中可见。我已经在一个小时前将其删除,但它仍然在编辑历史记录中可见。我强烈建议您在恶意黑客可能破解您的Gmail帐户之前更改您的Gmail密码。 - BalusC
9个回答

54

我也遇到了同样的问题: 我参考了这个链接,按照以下步骤操作后问题得到解决。

Gmail账户默认是高度安全的。当我们使用非Gmail工具发送邮件时,会被阻止。为了在本地测试,需要降低你的Gmail账户安全等级:

  1. 登录Gmail账户。
  2. 访问链接https://www.google.com/settings/security/lesssecureapps
  3. 选择“启用”

1
谢谢,这对我有用。我以为问题出在我的代码、用户名和密码上,但这实际上解决了问题。我认为 Gmail 已经更新了安全配置。 - stingray_
3
很不幸,这个解决方案很快将过时,因为谷歌宣布“2022年5月30日起,谷歌将停止支持使用仅使用用户名和密码让您登录谷歌账号的第三方应用程序或设备。相反,您需要使用“使用Google登录”或其他更安全的技术,如OAuth 2.0进行登录。了解更多信息。”实际上,从5月30日起,“较不安全的应用程序”选项将不再可用。 - yaylitzis

13
给定的代码片段在我的Gmail账户上运行良好,所以这个问题出在其他地方。你是否按照错误信息中给出的链接进行了操作?它包含以下提示:
  • 确保您已输入完整的电子邮件地址(例如username@gmail.com)
  • 重新输入密码以确保它正确。请注意,密码区分大小写。
  • 确保您的邮件客户端没有设置太频繁地检查新邮件。如果您的邮件客户端每10分钟以上检查一次新邮件,则可能会重复请求您的用户名和密码。
尤其是最后一点非常重要。Google在这方面非常严格。如果您正在尝试以编程方式连接Gmail,并且在一分钟内尝试连接超过10次,那么您可能已经被阻止了。耐心一些,在一段时间之后它会自动解除阻止。
如果您想要更多的发送邮件自由,我建议寻找专用的邮件主机或设置自己的邮件服务器,例如Apache James或Microsoft Exchange。我已经在你以前的一个问题中详细回答了这个问题

嘿,谢谢...它起作用了..!!你能告诉我如何使用JSP发送邮件吗..!!我正在尝试在网站中实现“忘记密码”,你有什么想法和建议来实现这个功能吗..!! - simplyblue
只需创建一个servlet类来执行任务,并在JSP中创建一个HTML表单,该表单提交到此servlet正在侦听的URL。在servlet方法中,您可以按照通常的方式编写和调用真正的Java代码。在此处了解有关JSP / Servlet的更多信息:http://courses.coreservlets.com/Course-Materials/csajsp2.html - BalusC
@simplyblue 你好,能否帮我一下?你是怎么解决这个问题的?我也在苦苦挣扎,请帮帮我。谢谢。 - user11176692

12

我遇到了完全相同的问题,原因是我在我的Gmail账户上开启了两步验证

通过生成一个新的应用程序专用密码,并在我的Java应用程序中使用该密码,这个“535 5.7.1”问题就解决了。

您可以按照官方谷歌指南来生成新的应用专用密码。


7

4

现在,Google不支持较不安全的应用程序,因此我们遇到了此问题。 请按照以下步骤解决使用SMTP发送邮件时的身份验证问题。

1- 在您的电子邮件中启用两步验证
2- 一旦您启用了上述内容,您将能够在同一安全选项卡中看到应用程序密码选项
3- 现在为其他(自定义)生成应用程序密码
4- 在您的代码中使用此生成的密码代替您的gmail密码。

享受吧 :)


1

我遇到了相同的错误信息,以下是我解决问题的方法:

创建应用程序密码:以下是我们如何生成应用程序密码:

1. Visit your App passwords page. You may be asked to sign in to your Google Account.

2. At the bottom, click Select app and choose the app you’re using.
Click Select device and choose the device you’re using.

3. Select Generate.

4. Follow the instructions to enter the App password (the 16 character code in the yellow bar) on your device.

5. Select Done.

我曾为一个Spring Boot应用工作,我得到了该应用程序的密码,例如sadsadaffferere,对于电子邮件地址xyz@gmail.com。因此,我需要配置应用程序属性如下:

# the email settings
# ------------------
spring.mail.host=smtp.gmail.com
spring.mail.username=xyz@gmail.com
spring.mail.password=sadsadaffferere
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.socketFactory.port=465
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
spring.mail.properties.mail.smtp.socketFactory.fallback=false
support.email=xyz@gmail.com

之后一切正常运作


1
你需要在Gmail设置中启用“允许不安全的应用程序”选项。

没错,但从2022年5月30日起,Google将不再支持此选项。 - walkmn

0

如果之前相同的凭据可以使用,但现在无法使用,则此问题的主要原因是 Gmail 客户端上的密码不匹配/更改,并未在 Jenkins 或其他 CI 服务器中更新。如果不是这种情况,请检查 @BalusC 提到的原因。


0

我关闭了防病毒软件并启用了Gmail中的不安全应用程序,但现在谷歌已禁用此选项,为了使其工作,您需要进行两步验证并生成16位密码,并将其粘贴到application.properties中以替换这个16位密码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接