41

我不熟悉这个在java中发送邮件的功能。我在发送电子邮件以重置密码时遇到错误。希望你能给我一个解决方案。

下面是我的代码:

public synchronized static boolean sendMailAdvance(String emailTo, String subject, String body)
{
    String host = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-ADDRESS");
    String userName = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-USERNAME");
    String password = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-PASSWORD");
    String port = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-PORT");
    String starttls = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-STARTTLS");
    String socketFactoryClass = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-SOCKET-CLASS");
    String fallback = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-ALLOW-FALLBACK");                         

    try
    {
        java.util.Properties props = null;
        props = System.getProperties();
        props.put("mail.smtp.user", userName);
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.debug", "true");

        if(!"".equals(port))
        {
            props.put("mail.smtp.port", port);
            props.put("mail.smtp.socketFactory.port", port);
        }

        if(!"".equals(starttls))
            props.put("mail.smtp.starttls.enable",starttls);

        if(!"".equals(socketFactoryClass))                   
            props.put("mail.smtp.socketFactory.class",socketFactoryClass);

        if(!"".equals(fallback))
            props.put("mail.smtp.socketFactory.fallback", fallback);

        Session session = Session.getDefaultInstance(props, null);
        session.setDebug(true);

        MimeMessage msg = new MimeMessage(session);
        msg.setFrom(new InternetAddress(userName));
        msg.setSubject(subject);                
        msg.setText(body, "ISO-8859-1");
        msg.setSentDate(new Date());
        msg.setHeader("content-Type", "text/html;charset=\"ISO-8859-1\"");
        msg.addRecipient(Message.RecipientType.TO, new InternetAddress(emailTo));
        msg.saveChanges();

        Transport transport = session.getTransport("smtp");
        transport.connect(host, userName, password);
        transport.sendMessage(msg, msg.getAllRecipients());
        transport.close();
            return true;
    }
    catch (Exception mex)
    {
        mex.printStackTrace();
        return false;
    }
}

引发以下错误:

调试:setDebug:JavaMail 版本 1.4.1ea-SNAPSHOT

DEBUG: getProvider() returning   javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]

调试 SMTP:useEhlo true,useAuth true

调试 SMTP:尝试连接到主机“smtp.gmail.com”,端口 465,isSSL false 220 mx.google.com ESMTP m4sm5929870pbg.38 - gsmtp

调试 SMTP:连接到主机“smtp.gmail.com”,端口:465

EHLO脂肪

250-mx.google.com 为您服务,[175.139.198.14]

250 尺寸 35882577

250-8BITMIME

250-AUTH 登录 PLAIN XOAUTH XOAUTH2 PLAIN-CLIENTTOKEN

250 增强状态代码

第250章

调试 SMTP:找到扩展名“SIZE”,arg“35882577”

调试 SMTP:找到扩展名“8BITMIME”,arg“”

调试 SMTP:找到扩展名“AUTH”,arg“LOGIN PLAIN XOAUTH XOAUTH2 PLAIN-CLIENTTOKEN”

调试 SMTP:找到扩展“ENHANCEDSTATUSCODES”,arg“”

调试 SMTP:找到扩展名“CHUNKING”,arg“”

调试 SMTP:尝试进行身份验证

授权登录

334 VXNlcm5hbWU6

YWNjb3VudEBibG9vbWluZy5jb20ubXk=

第334章

Ymxvb21pbmc= 535-5.7.8 用户名和密码不被接受。如需了解详情,请访问 535 5.7.8 http://support.google.com/mail/bin/answer.py?answer=14257

m4sm5929870pbg.38 - gsmtp

[STDOUT] javax.mail.AuthenticationFailedException

[STDOUT] 在 javax.mail.Service.connect(Service.java:319)

[STDOUT] 在 javax.mail.Service.connect(Service.java:169)

[STDOUT] 在 com.vlee.util.mail.SendMail.sendMailAdvance(SendMail.java:283)

[STDOUT] 在 com.vlee.servlet.ecommerce.DoMemberLogin.fnSendPwd(DoMemberLogin.java:251)

[STDOUT] 在 com.vlee.servlet.ecommerce.DoMemberLogin.doPost(DoMemberLogin.java:72)

4

16 回答 16

82

可能是 Gmail 帐户保护导致的此问题。只需单击下面的链接并禁用安全设置。它将起作用。 https://www.google.com/settings/security/lesssecureapps

于 2014-11-04T09:13:36.307 回答
22
于 2015-05-02T11:32:05.347 回答
17

您应该将端口更改为587,我测试了您的代码,它工作正常

如果仍然发生错误,请将会话变量更改为以下代码:

Session session = Session.getInstance(props, new javax.mail.Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(userName, password);
    }
});
于 2013-09-13T04:48:00.123 回答
11

默认情况下,Gmail 帐户是高度安全的。当我们从非 gmail 工具使用 gmail smtp 时,电子邮件被阻止。要在我们的本地环境中进行测试,请将您的 gmail 帐户的安全性降低为

  1. 登录到 Gmail。
  2. 以https://www.google.com/settings/security/lesssecureapps访问 URL
  3. 选择“开启”
于 2017-03-10T10:15:58.757 回答
8

大多数 AuthenticationFieldException 错误发生在尝试阻止登录时,首先登录您的 gmail 并转到https://www.google.com/settings/security/lesssecureapps 并检查打开。我以这种方式解决了这种问题。

于 2015-09-13T15:43:04.470 回答
5

如果您从新的应用程序或设备登录您的 gmail 帐户,Google 可能会阻止该设备。尝试按照以下步骤操作:

为了保护您的帐户,如果我们怀疑不是您,Google 可能会更难登录您的帐户。例如,如果您正在旅行或尝试从新设备登录您的帐户,Google 可能会要求您提供用户名和密码以外的其他信息。

从您之前用于访问您的 Google 帐户的其他设备转到https://g.co/allowaccess ,然后按照说明进行操作。尝试从被阻止的应用重新登录。

于 2016-08-30T10:24:59.013 回答
4

更改此设置(设置不太安全的应用程序): https ://www.google.com/settings/security/lesssecureapps

于 2016-06-20T09:32:17.043 回答
4

您必须记住几个步骤。

现在有两种情况如果你在本地机器上开发,在浏览器中登录你的google账号,这样google就可以识别机器了。

如果您已将应用程序部署到服务器上,那么在第一次请求之后,您将收到身份验证错误,因此您必须授予对服务器的访问权限,只需转到此处授予访问权限 - https://www.google.com/accounts/显示解锁验证码

于 2020-09-15T20:11:41.653 回答
3

对我有用的解决方案有两个步骤。

  1. 第一步

    package com.student.mail;
    
    import java.util.Properties;
    
    import javax.mail.Authenticator;
    import javax.mail.Message;
    import javax.mail.MessagingException;
    import javax.mail.PasswordAuthentication;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    
    /**
     *
     * @author jorge santos
     */
    public class GoogleMail {
        public static void main(String[] args) {
            Properties props = new Properties();
            props.put("mail.smtp.host", "smtp.gmail.com");
            props.put("mail.smtp.socketFactory.port", "465");
            props.put("mail.smtp.socketFactory.class",
                "javax.net.ssl.SSLSocketFactory");
            props.put("mail.smtp.auth", "true");
            props.put("mail.smtp.port", "465"); 
            Session session = Session.getDefaultInstance(props,
            new javax.mail.Authenticator() {
                                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication("conaderindicadores@gmail.com","Silueta95#");
                }
            });
    
        try {
    
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress("conaderindicadores@gmail.com"));
            message.setRecipients(Message.RecipientType.TO,
                    InternetAddress.parse("netneillip@gmail.com"));
            message.setSubject("Testing Subject");
            message.setText("Test Mail");
    
            Transport.send(message);
    
            System.out.println("Done");
    
        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
    }
    
    }
    
  2. 启用 gmail 安全性

    https://myaccount.google.com/u/2/lesssecureapps?pli=1&pageId=none
    
于 2018-09-23T21:43:12.370 回答
2

很长一段时间以来,我一直遇到同样的错误。

当我将会话调试更改为 true

Session session = Session.getDefaultInstance(props, new GMailAuthenticator("xxxxx@gmail.com", "xxxxx"));
session.setDebug(true);

我从控制台获得了帮助网址https://support.google.com/mail/answer/78754以及 javax.mail.AuthenticationFailedException。

从链接中的步骤,我遵循了每个步骤。当我用字母、数字和符号的组合更改密码时,令我惊讶的是,电子邮件生成时没有出现身份验证异常。

注意:我的旧密码更不安全。

于 2016-01-17T09:36:51.930 回答
1

2个可能的原因:

  • 您的用户名可能需要整个电子邮件 ID 'username@example.com'
  • 最明显的:密码错误。调试以查看使用的密码是否正确。
于 2013-10-18T02:03:16.147 回答
0
trying to connect to host "smtp.gmail.com", port 465, isSSL false

您的 gmail smtp 设置错误。Gmail 需要 SSL。请参阅有关如何通过 Gmail SMTP 通过 Java 发送电子邮件的教程,例如:http ://www.mkyong.com/java/javamail-api-sending-email-via-gmail-smtp-example/

于 2013-09-13T04:24:33.313 回答
0

以防万一有人来寻找这个问题的解决方案。

可以通过激活正在使用的帐户的 google 两步验证并创建应用程序特定密码来缓解身份验证问题。我和OP有同样的问题。启用两步工作。

于 2015-12-25T20:12:36.320 回答
0

我也有这个问题,但解决方案与编码无关。确保您能够连接到 gmail。ping smtp.gmail.com。如果您没有收到回复,请检查您的防火墙设置。这也可能是代理设置问题。

于 2016-09-12T19:09:54.400 回答
0

使用给定的 SMTP 设置实现三件事

  1. 禁用两因素身份验证:https ://myaccount.google.com/security
  2. 允许不太安全的应用程序:https ://www.google.com/settings/security/lesssecureapps
  3. 使用链接允许新设备:https ://g.co/allowaccess

SMTP 设置:

  • smtp.gmail.com
  • 端口:465
  • 使用 SSL
  • 从电子邮件地址
  • Gmail 用户名
  • 邮箱密码
  • 收件人电子邮件地址
于 2021-06-25T05:23:44.540 回答
-1
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;

public class SendMail1 {

    public static void main(String[] args) {
        // Recipient's email ID needs to be mentioned.
          String to = "valid email to address";

          // Sender's email ID needs to be mentioned
          String from = "valid email from address";


          // Get system properties
          Properties properties = System.getProperties();

          properties.put("mail.smtp.starttls.enable", "true"); 
          properties.put("mail.smtp.host", "smtp.gmail.com");

          properties.put("mail.smtp.port", "587");
          properties.put("mail.smtp.auth", "true");
          Authenticator authenticator = new Authenticator () {
                public PasswordAuthentication getPasswordAuthentication(){
                    return new PasswordAuthentication("userid","password");//userid and password for "from" email address 
                }
            };

            Session session = Session.getDefaultInstance( properties , authenticator);  
          try{
             // Create a default MimeMessage object.
             MimeMessage message = new MimeMessage(session);

             // Set From: header field of the header.
             message.setFrom(new InternetAddress(from));

             // Set To: header field of the header.
             message.addRecipient(Message.RecipientType.TO,
                                      new InternetAddress(to));

             // Set Subject: header field
             message.setSubject("This is the Subject Line!");

             // Now set the actual message
             message.setText("This is actual message");

             // Send message
             Transport.send(message);
             System.out.println("Sent message successfully....");
          }catch (MessagingException mex) {
             mex.printStackTrace();
          }
    }

}
于 2014-09-09T09:29:55.980 回答