【问题标题】:Java Email SMTP & TSL, Error Can't sending emailJava 电子邮件 SMTP 和 TLS,错误无法发送电子邮件
【发布时间】:2017-09-19 04:19:27
【问题描述】:

我在使用 SMTP 和 TSl 的 Java 电子邮件方面遇到问题,请帮我解决这个问题。我认为问题是运输,但我不确定。下面是我的代码和错误sn-ps,请帮我找出我的错误和解决方案。

TSLEmail.class

import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;

public class TSLEmail 
{
  public static void main(String[] args) 
  {
      final String fromEmail = "mail@gmail.com"; //requires valid 
      gmail id
      final String password = "mypass12"; // correct password for gmail id
      final String toEmail = "recipients@gmail.com"; // can be any email id 

      System.out.println("TLSEmail Start");
      Properties props = new Properties();
      props.put("mail.smtp.host", "10.20.200.220"); //SMTP Host
      props.put("mail.user", "user12");
     //props.put("mail.password", password);
     props.put("mail.smtp.port", "587"); //TLS Port
     props.put("mail.smtp.auth", "true"); //enable authentication
     props.put("mail.smtp.starttls.enable", "true"); //enable STARTTLS

     //create Authenticator object to pass in Session.getInstance argument
     Authenticator auth = new Authenticator() {
                     //override the getPasswordAuthentication method
                     protected PasswordAuthentication 
        getPasswordAuthentication() {
                                     return new 
        PasswordAuthentication(fromEmail, password);
                     }
        };
       Session session = Session.getInstance(props, auth);

       EmailUtil.sendEmail(session, toEmail,"TLSEmail Testing Subject", 
       "TLSEmail Testing Body");

     }
   }

EmailUtil.class

import java.util.Date;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

 public class EmailUtil 
 {
   public static void sendEmail(Session session, String toEmail, String 
   subject, String body)
   {
      try
      {
        MimeMessage msg = new MimeMessage(session);
        //set message headers
        msg.addHeader("Content-type", "text/HTML; charset=UTF-8");
        msg.addHeader("format", "flowed");
        msg.addHeader("Content-Transfer-Encoding", "8bit");

        msg.setFrom(new InternetAddress("mail@gmail.com"));

        msg.setReplyTo(InternetAddress.parse("recipients@gmail.com"));

        msg.setSubject(subject, "UTF-8");

        msg.setText(body, "UTF-8");

        msg.setSentDate(new Date());

        msg.setRecipients(Message.RecipientType.TO, 
        InternetAddress.parse(toEmail, false));

        System.out.println("Message is ready");
        Transport.send(msg);  

         System.out.println("EMail Sent Successfully!!");
        }
       catch (Exception e) {
         e.printStackTrace();
       }
     }
  }

结果(错误):

TLSEmail Start
Message is ready
javax.mail.MessagingException: Can't send command to SMTP host;
   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.sendCommand(SMTPTransport.java:1564)
    at com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:1551)
    at com.sun.mail.smtp.SMTPTransport.ehlo(SMTPTransport.java:935)
    at 
     com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:426)
    at javax.mail.Service.connect(Service.java:310)
    at javax.mail.Service.connect(Service.java:169)
    at javax.mail.Service.connect(Service.java:118)
    at javax.mail.Transport.send0(Transport.java:188)
    at javax.mail.Transport.send(Transport.java:118)
    at com.bca.controller.EmailUtil.sendEmail(EmailUtil.java:35)
    at com.bca.controller.TSLEmail.main(TSLEmail.java:34)
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(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
    at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
    at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
    at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source)
    at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source)
    at sun.security.ssl.Handshaker.processLoop(Unknown Source)
    at sun.security.ssl.Handshaker.process_record(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown 
       Source)
    at sun.security.ssl.SSLSocketImpl.writeRecord(Unknown Source)
    at sun.security.ssl.AppOutputStream.write(Unknown Source)
    at com.sun.mail.util.TraceOutputStream.write(TraceOutputStream.java:114)
    at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
    at java.io.BufferedOutputStream.flush(Unknown Source)
    at com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:1562)
       ... 10 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(Unknown Source)
    at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
    at sun.security.validator.Validator.validate(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.validate(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown 
       Source)
       ... 22 more
 Caused by: sun.security.provider.certpath.SunCertPathBuilderException: 
 unable to find valid certification path to requested target
    at sun.security.provider.certpath.SunCertPathBuilder.build(Unknown 
        Source)
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown 
        Source)
    at java.security.cert.CertPathBuilder.build(Unknown Source)
       ... 28 more

请帮我为我的问题找到一个简单而确定的解决方案。 谢谢你

【问题讨论】:

  • JavaMail FAQ。 (我想知道他们为什么称其为常见问题解答?...)

标签: java maven server smtp jakarta-mail


【解决方案1】:

听起来您需要将服务器返回的证书添加到您的 JRE 的信任库中,

有很多很好的文章解释了如何做到这一点,包括:

Java Keytool Essentials: Working with Java Keystores

如果这是一个 Web 应用程序(例如,Tomcat 或 JBoss),那么在服务器级别(而不是您的 JRE)执行此操作。

【讨论】:

    【解决方案2】:

    也添加此属性。它对我有用。

    props.put("mail.smtp.ssl.trust", Smtp_host);
    

    【讨论】:

    • 如果您将端口 587 与 starttls 一起使用,请不要添加该属性。
    猜你喜欢
    • 2016-08-24
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 2011-07-30
    • 2016-04-17
    相关资源
    最近更新 更多