【问题标题】:Mail : com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.1 Authentication required邮件:com.sun.mail.smtp.SMTPSendFailedException:530 5.7.1 需要身份验证
【发布时间】:2022-03-01 13:19:45
【问题描述】:

我正在尝试从我的 Java 应用程序向任何特定的电子邮件地址发送一封电子邮件。我正在使用 JavaMail API,但不幸的是我收到了 SMTPSendFailedException 错误。任何人都可以告诉我我在哪里做错了。这是我的代码

    Properties properties = new Properties();
    properties.put("mail.smtp.host", "plus.smtp.mail.yahoo.com");
    properties.put("mail.smtp.port", "587");
    properties.put("mail.smtp.starttls.enable", "true");
    properties.put("mail.smtp.user", emailId);
    properties.put("mail.smtp.password", password);

    Session emailSession = Session.getDefaultInstance(properties,
            new Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(emailId,password);
                }
            });
    emailSession.setDebug(true);

    try {
        MimeMessage message = new MimeMessage(emailSession);
        message.setFrom(new InternetAddress(from));
        message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));
        message.setSubject("Ping");
        message.setText("Hello, this is example of sending email  ");

        // Send message
        Transport.send(message);
        System.out.println("message sent successfully....");

    } catch (MessagingException e) {
        throw new RuntimeException(e);
    }

当我运行这段代码时,我得到了:

DEBUG: setDebug: JavaMail version 1.4.7
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to host "plus.smtp.mail.yahoo.com", port 587, isSSL false
220 *.smtp.mail.yahoo.com ESMTP ready
DEBUG SMTP: connected to host "plus.smtp.mail.yahoo.com", port: 587

EHLO Libsys-PC
250-*.smtp.mail.yahoo.com
250-PIPELINING
250-SIZE 41697280
250-8 BITMIME
250 XXXXXXXX
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "SIZE", arg "41697280"
DEBUG SMTP: Found extension "8", arg "BITMIME"
DEBUG SMTP: Found extension "XXXXXXXX", arg ""
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to host "plus.smtp.mail.yahoo.com", port 587, isSSL false
220 *.smtp.mail.yahoo.com ESMTP ready
DEBUG SMTP: connected to host "plus.smtp.mail.yahoo.com", port: 587

EHLO Libsys-PC
250-*.smtp.mail.yahoo.com
250-PIPELINING
250-SIZE 41697280
250-8 BITMIME
250 XXXXXXXX
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "SIZE", arg "41697280"
DEBUG SMTP: Found extension "8", arg "BITMIME"
DEBUG SMTP: Found extension "XXXXXXXX", arg ""
DEBUG SMTP: use8bit false
MAIL FROM:from
530 5.7.1 Authentication required
DEBUG SMTP: got response code 530, with response: 530 5.7.1 Authentication required

RSET
250 2.0.0 OK
DEBUG SMTP: MessagingException while sending, THROW: 
com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.1 Authentication required

    at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:2108)
    at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:1609)
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1117)
    at javax.mail.Transport.send0(Transport.java:195)
    at javax.mail.Transport.send(Transport.java:124)
    at Mail.main(Mail.java:119)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
QUIT
221 2.0.0 Bye
Exception in thread "main" java.lang.RuntimeException: com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.1 Authentication required

    at Mail.main(Mail.java:123)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.1 Authentication required

    at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:2108)
    at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:1609)
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1117)
    at javax.mail.Transport.send0(Transport.java:195)
    at javax.mail.Transport.send(Transport.java:124)
    at Mail.main(Mail.java:119)
    ... 5 more

    Process finished with exit code 1

反映后我的代码是:

     Properties properties = new Properties();
    properties.put("mail.smtp.host","smtp.gmail.com");
    properties.put("mail.smtp.port", 587);
    properties.put("mail.smtp.auth",true);
    properties.put("mail.smtp.starttls.enable", "true");
    Session emailSession = Session.getInstance(properties);
    emailSession.setDebug(true);

    //create the POP3 store object and connect with the pop server
    try {

        MimeMessage message = new MimeMessage(emailSession);
        message.setFrom(new InternetAddress(from));
        message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));
        message.setSubject("Ping");
        message.setText("Hello, this is example of sending email  ");
        Transport.send(message,id,password);

        System.out.println("message sent successfully....");

    } catch (MessagingException e) {
        e.printStackTrace();
        throw new RuntimeException(e);
    }

但调试输出和之前的一样

    DEBUG: setDebug: JavaMail version 1.5.5
 DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 587, isSSL false
220 smtp.gmail.com ESMTP i62sm9706430pfg.62 - gsmtp
DEBUG SMTP: connected to host "smtp.gmail.com", port: 587

EHLO Libsys-PC
250-smtp.gmail.com at your service, [163.47.140.139]
250-SIZE 35882577
250-8BITMIME
250-ENHANCEDSTATUSCODES
250-PIPELINING
250 SMTPUTF8
DEBUG SMTP: Found extension "SIZE", arg "35882577"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "SMTPUTF8", arg ""
DEBUG SMTP: use8bit false
MAIL FROM:<rohitsingla6@gmail.com>
530 5.7.0 Must issue a STARTTLS command first. i62sm9706430pfg.62 - gsmtp
DEBUG SMTP: got response code 530, with response: 530 5.7.0 Must issue a STARTTLS command first. i62sm9706430pfg.62 - gsmtp

RSET
250 2.1.5 Flushed i62sm9706430pfg.62 - gsmtp
DEBUG SMTP: MessagingException while sending, THROW: 
com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first. i62sm9706430pfg.62 - gsmtp

    at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:2249)
    at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:1740)
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1239)
    at javax.mail.Transport.send0(Transport.java:255)
    at javax.mail.Transport.send(Transport.java:174)
    at GMail.main(GMail.java:32)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
QUIT
221 2.0.0 closing connection i62sm9706430pfg.62 - gsmtp
com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first. i62sm9706430pfg.62 - gsmtp

    at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:2249)
    at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:1740)
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1239)
    at javax.mail.Transport.send0(Transport.java:255)
    at javax.mail.Transport.send(Transport.java:174)
    at GMail.main(GMail.java:32)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Exception in thread "main" java.lang.RuntimeException: com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first. i62sm9706430pfg.62 - gsmtp

    at GMail.main(GMail.java:38)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first. i62sm9706430pfg.62 - gsmtp

    at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:2249)
    at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:1740)
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1239)
    at javax.mail.Transport.send0(Transport.java:255)
    at javax.mail.Transport.send(Transport.java:174)
    at GMail.main(GMail.java:32)
    ... 5 more

【问题讨论】:

    标签: email jakarta-mail


    【解决方案1】:

    您应该upgrade to JavaMail 1.5.5 并修复这些common mistakes;特别是,您应该摆脱 Authenticator 并使用Transport.send method that accepts a user name and password。如果无法升级,请将属性mail.smtp.auth 设置为"true"。并且没有 mail.smtp.password 属性,所以不要费心设置它。

    【讨论】:

    • 您好,我已经按照您的说法更改了代码,但仍然出现同样的错误。防火墙是否有可能阻止它。因为当我从另一个网络上的另一个系统运行它时,它成功运行。
    • 进行更改后 JavaMail 调试输出显示什么?使用更新的代码和输出编辑您的问题。
    • 它使用 465 端口工作。并通过添加一个属性“mail.smtp.ssl.enable”为真。但我不明白为什么它不适用于 587 端口
    • 您说您遇到了同样的错误,但事实并非如此。当使用端口 587 时,它希望您在验证之前使用 STARTTLS 命令。为此,您需要将mail.smtp.starttls.enable 设置为true
    【解决方案2】:
    • 在 JAVA Mail API 中,您必须根据 java mail API.so 的文档设置用户名和发件人地址,

    • 这两个句子在你的代码中应该是这样的,只要你 正在使用 JAVA 邮件 API

      properties.put("mail.smtp.user", emailId);

      message.setFrom(new InternetAddress(emailId));

    【讨论】:

      猜你喜欢
      • 2014-01-13
      • 1970-01-01
      • 2017-04-17
      • 1970-01-01
      • 2012-07-28
      • 2018-06-28
      • 1970-01-01
      • 1970-01-01
      • 2018-10-07
      相关资源
      最近更新 更多