Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过Java使用gmail发送电子邮件_Java_Email_Gmail - Fatal编程技术网

通过Java使用gmail发送电子邮件

通过Java使用gmail发送电子邮件,java,email,gmail,Java,Email,Gmail,我正试图使用以下代码通过java发送电子邮件: package send_email; import java.util.Properties; import javax.mail.*; import javax.mail.internet.*; /** * * @author A */ public class Send_email { /** * @param args the command line arguments */ pub

我正试图使用以下代码通过java发送电子邮件:

package send_email;
import java.util.Properties;  
import javax.mail.*;  
import javax.mail.internet.*;  
/**
 *
 * @author A
 */
public class Send_email {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        String host="smtp.gmail.com";  
  final String user="***@gmail.com";//change accordingly  
  final String password="****";//change accordingly  

  String to="*******@gmail.com";//change accordingly  

   //Get the session object  
   Properties props = new Properties();  
   props.put("mail.smtp.host",host);  
   props.put("mail.smtp.auth", "true");  

   Session session = Session.getDefaultInstance(props,  
    new javax.mail.Authenticator() {  
      protected PasswordAuthentication getPasswordAuthentication() {  
    return new PasswordAuthentication(user,password);  
      }  
    });  

   //Compose the message  
    try {  
     MimeMessage message = new MimeMessage(session);  
     message.setFrom(new InternetAddress(user));  
     message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));  
     message.setSubject("javatpoint");  
     message.setText("This is simple program of sending email using JavaMail API");  

    //send the message  
     Transport.send(message);  

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

     } catch (MessagingException e) {e.printStackTrace();} 
    }

}
但我得到了以下错误:

javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 25, response: 554
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1694)
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:525)
    at javax.mail.Service.connect(Service.java:313)
    at javax.mail.Service.connect(Service.java:172)
    at javax.mail.Service.connect(Service.java:121)
    at javax.mail.Transport.send0(Transport.java:190)
    at javax.mail.Transport.send(Transport.java:120)
    at send_email.Send_email.main(Send_email.java:48)
BUILD SUCCESSFUL (total time: 0 seconds)
javax.mail.MessagingException: Could not convert socket to TLS;
  nested exception is:
    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1652)
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:534)
    at javax.mail.Service.connect(Service.java:313)
    at javax.mail.Service.connect(Service.java:172)
    at javax.mail.Service.connect(Service.java:121)
    at javax.mail.Transport.send0(Transport.java:190)
    at javax.mail.Transport.send(Transport.java:120)
    at send_email.Send_email.main(Send_email.java:52)
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1946)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:316)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:310)
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1640)
    at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:223)
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1037)
    at sun.security.ssl.Handshaker.process_record(Handshaker.java:965)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1064)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1367)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1395)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1379)
    at com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:503)
    at com.sun.mail.util.SocketFetcher.startTLS(SocketFetcher.java:443)
    at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1647)
    ... 7 more
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:397)
    at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:302)
    at sun.security.validator.Validator.validate(Validator.java:262)
    at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:330)
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:237)
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:132)
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1622)
    ... 17 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141)
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126)
    at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:392)
    ... 23 more
我允许端口25通过防火墙,然后我使用telnet“telnet smtp.gmail.com 25”对其进行了测试,但我得到了这个错误 554 OutgoingFilter“由于发送垃圾邮件或病毒,您被临时推迟 有关更多信息,请联系16333“

那么我该如何修复这个错误呢

编辑:我现在通过Telnet收到此错误“421无法连接到SMTP服务器108.177.15.109(108.177.15.109:25),请连接 ror 10060

与主机的连接丢失。 " 编辑_2:我发现gmail SMTP的端口是587,我已经相应地将会话对象更改为

Properties p = new Properties();
p.put("mail.smtp.auth", "true");
p.put("mail.transport.protocol", "smtp");
p.put("mail.smtp.host", "smtp.gmail.com");
p.put("mail.smtp.port", "587");
p.put("mail.smtp.starttls.enable","true");
p.put("mail.smtp.starttls.required","true"); 
这个代码是在那里提供的。但是,我得到以下错误:

javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 25, response: 554
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1694)
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:525)
    at javax.mail.Service.connect(Service.java:313)
    at javax.mail.Service.connect(Service.java:172)
    at javax.mail.Service.connect(Service.java:121)
    at javax.mail.Transport.send0(Transport.java:190)
    at javax.mail.Transport.send(Transport.java:120)
    at send_email.Send_email.main(Send_email.java:48)
BUILD SUCCESSFUL (total time: 0 seconds)
javax.mail.MessagingException: Could not convert socket to TLS;
  nested exception is:
    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1652)
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:534)
    at javax.mail.Service.connect(Service.java:313)
    at javax.mail.Service.connect(Service.java:172)
    at javax.mail.Service.connect(Service.java:121)
    at javax.mail.Transport.send0(Transport.java:190)
    at javax.mail.Transport.send(Transport.java:120)
    at send_email.Send_email.main(Send_email.java:52)
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1946)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:316)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:310)
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1640)
    at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:223)
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1037)
    at sun.security.ssl.Handshaker.process_record(Handshaker.java:965)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1064)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1367)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1395)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1379)
    at com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:503)
    at com.sun.mail.util.SocketFetcher.startTLS(SocketFetcher.java:443)
    at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1647)
    ... 7 more
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:397)
    at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:302)
    at sun.security.validator.Validator.validate(Validator.java:262)
    at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:330)
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:237)
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:132)
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1622)
    ... 17 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141)
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126)
    at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:392)
    ... 23 more
然而,当通过这个新端口连接时,telenet给了我以下信息:220 smtp.gmail.com ESMTP a24sm5897091wmb.29-gsmtp 我想这意味着我是通过telnet连接的。

试试这些设置

Properties p = new Properties();
p.put("mail.smtp.auth", "true");
p.put("mail.transport.protocol", "smtp");
p.put("mail.smtp.host", "smtp.gmail.com");
p.put("mail.smtp.port", "587");
p.put("mail.smtp.starttls.enable","true");
p.put("mail.smtp.starttls.required","true");
试试这些设置

Properties p = new Properties();
p.put("mail.smtp.auth", "true");
p.put("mail.transport.protocol", "smtp");
p.put("mail.smtp.host", "smtp.gmail.com");
p.put("mail.smtp.port", "587");
p.put("mail.smtp.starttls.enable","true");
p.put("mail.smtp.starttls.required","true");

您可以使用以下技术之一获取SMTP服务器:

  • 安装并使用任何SMTP服务器,如Postcast服务器、Apache 詹姆斯服务器、电子邮件服务器等
  • 使用主机提供程序提供的SMTP服务器,例如my SMTP 服务器是mail.xxx.com
  • 使用其他公司提供的SMTP服务器,如Gmail等
  • 要使用JavaMail API发送电子邮件,需要加载两个jar文件: -mail.jar -激活.jar 下面是一个例子

    import java.util.*; 
    import javax.mail.*; 
    import javax.mail.internet.*; 
    import javax.activation.*;
    
        public class TestSendEmail {
    
           public static void main(String [] args) {    
              // Recipient's email ID needs to be mentioned.
              String to = "abcd@gmail.com";
    
              // Sender's email ID needs to be mentioned
              String from = "test@gmail.com";
    
              // Assuming you are sending email from localhost
              String host = "localhost";
    
              // Get system properties
              Properties properties = System.getProperties();
    
              // Setup mail server
              properties.setProperty("mail.smtp.host", host);
    
              // Get the default Session object.
              Session session = Session.getDefaultInstance(properties);
    
              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(Subject Line!");
    
                 // Now set the actual message
                 message.setText("actual message");
    
                 // Send message
                 Transport.send(message);
                 System.out.println("Sent message successfully....");
              } catch (MessagingException mex) {
                 mex.printStackTrace();
              }    } }
    

    您可以使用以下技术之一获取SMTP服务器:

  • 安装并使用任何SMTP服务器,如Postcast服务器、Apache 詹姆斯服务器、电子邮件服务器等
  • 使用主机提供程序提供的SMTP服务器,例如my SMTP 服务器是mail.xxx.com
  • 使用其他公司提供的SMTP服务器,如Gmail等
  • 要使用JavaMail API发送电子邮件,需要加载两个jar文件: -mail.jar -激活.jar 下面是一个例子

    import java.util.*; 
    import javax.mail.*; 
    import javax.mail.internet.*; 
    import javax.activation.*;
    
        public class TestSendEmail {
    
           public static void main(String [] args) {    
              // Recipient's email ID needs to be mentioned.
              String to = "abcd@gmail.com";
    
              // Sender's email ID needs to be mentioned
              String from = "test@gmail.com";
    
              // Assuming you are sending email from localhost
              String host = "localhost";
    
              // Get system properties
              Properties properties = System.getProperties();
    
              // Setup mail server
              properties.setProperty("mail.smtp.host", host);
    
              // Get the default Session object.
              Session session = Session.getDefaultInstance(properties);
    
              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(Subject Line!");
    
                 // Now set the actual message
                 message.setText("actual message");
    
                 // Send message
                 Transport.send(message);
                 System.out.println("Sent message successfully....");
              } catch (MessagingException mex) {
                 mex.printStackTrace();
              }    } }
    

    这与你的gmail帐户和谷歌政策有关。也许我会打16333。你在过去的24小时里运行了多少次这个程序?如果你试图在短时间内发送邮件太多次,邮件中继会将你视为垃圾邮件来源,这与你的gmail帐户和谷歌政策有关。也许我会打16333。你在过去的24小时里运行了多少次这个程序?如果您试图在短时间内发送邮件太多次,邮件中继会将您视为垃圾邮件源,这是有道理的;我发现javax.mail.MessaginException错误:无法将套接字转换为TLS;