Сброс соединения при попытке отправить почту - PullRequest
0 голосов
/ 12 января 2020

Я пытаюсь отправить электронное письмо с использованием javax.mail версии 1.4.7. Это код, который я использую для отправки почты:

String protocollo = "smtps";
String usernamePec = "fromAddress@pec.it";
String passwordPec = "mypassword";
String pecTo = "ToAddress@pec.it";


Properties props = new Properties();
props.put("mail.transport.protocol", "smtps");
props.put("mail.smtps.host", "smtps.pec.aruba.it"); // esempio smtp.gmail.com
props.put("mail.smtps.auth", "true");

Session session = Session.getInstance(props,new javax.mail.Authenticator()
{
  public PasswordAuthentication getPasswordAuthentication()
    {
    return new PasswordAuthentication( usernamePec,passwordPec);
     }
});

 MimeMessage messaggioEmail = new MimeMessage( session );
 MimeMessageHelper helper = new MimeMessageHelper(messaggioEmail, true);
 helper.setFrom(usernamePec);
 helper.setTo(pecTo);
 helper.setSubject("Test Subject");
 helper.setPriority(1);
 helper.setText("Body Mail ", false);           
 messaggioEmail.saveChanges();
 com.sun.mail.smtp.SMTPMessage mex = new SMTPMessage(messaggioEmail);
 com.sun.mail.smtp.SMTPSSLTransport t = 
 (com.sun.mail.smtp.SMTPSSLTransport)session.getTransport(protocollo); // <--SMTPS
 t.setStartTLS(true); //<-- impostiamo il flag per iniziare la comunicazione sicura
 t.connect( "smtps.pec.aruba.it", usernamePec,passwordPec);
 t.sendMessage( mex, mex.getAllRecipients());
 t.close();

Запустив этот код, я получаю следующее исключение:

javax.mail.MessagingException: Could not connect to SMTP host: smtps.pec.aruba.it, port: 465;
      nested exception is:
        java.net.SocketException: Connection reset
        at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1961)
        at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:654)
        at javax.mail.Service.connect(Service.java:295)
        at javax.mail.Service.connect(Service.java:176)
        at test.Test.main(Test.java:199)
    Caused by: java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(SocketInputStream.java:210)
        at java.net.SocketInputStream.read(SocketInputStream.java:141)
        at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
        at sun.security.ssl.InputRecord.read(InputRecord.java:503)
        at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:975)
        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:549)
        at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:354)
        at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:237)
        at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1927)
... 4 more

Кажется, проблема из-за плохой SSL-сертификат рукопожатие, любые предложения по этому поводу, где я делаю не так?

Ответы [ 3 ]

0 голосов
/ 13 января 2020

Во-первых, давайте упростим ваш код.

Измените создание сеанса следующим образом:

Session session = Session.getInstance(props);

Получите транспорт следующим образом:

 Transport t = session.getTransport(protocollo); // <--SMTPS

Удалите вызов t.setStartTLS; Вероятно, это источник вашей проблемы.

Вы используете протокол "smtps", который использует SSL при первом подключении к серверу. Поддержка «STARTTLS» предназначена для случаев, когда серверу требуется сначала подключиться с использованием простого текстового подключения, а затем переключиться на TLS (SSL) после подключения. Это не то, что вы делаете здесь, и если ваш сервер этого не требует, вы не хотите этого делать.

0 голосов
/ 12 марта 2020

Обновление библиотеки:

<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>
0 голосов
/ 12 января 2020

Как я прокомментировал с OP, может быть проблема с вашим подходом к соединению SSL / TLS. Попробуйте этот пример кода с вашими собственными настройками, я успешно использовал его в самых разных средах. Или, может быть, вы можете просто выбрать важную часть кода из примера:

private void sendMail()
        throws MessagingException, AddressException, IOException {
    String smtpHost = "";
    Integer smtpPort = 465;
    final String from = "me@me.com";
    final String password = "";
    String to = "theOtherGuy@he.com";
    String cc = "";
    String bcc = "";
    String subject = "";
    String bodyText = "";
    List<File> files = null; // Set attachment files if needed

    boolean sslEnable = true;
    boolean startTlsEnable = false;

    String user = "";
    Properties properties = new Properties();
    properties.put("mail.smtp.host", smtpHost);
    properties.put("mail.smtp.port", smtpPort);

    if (user != null && !user.equals("")) {
        properties.put("mail.smtp.user", user);
        properties.put("mail.smtps.user", user);
    } else {
        properties.put("mail.smtp.user", from);
        properties.put("mail.smtps.user", from);
    }
    properties.put("mail.smtp.sendpartial", "true");
    properties.put("mail.smtps.host", smtpHost);
    properties.put("mail.smtps.port", smtpPort);
    properties.put("mail.smtps.sendpartial", "true");
    properties.put("mail.smtp.timeout", 30000);
    properties.put("mail.smtp.connectiontimeout", 60000);
    properties.put("mail.smtp.writetimeout", 15000);

    if (startTlsEnable) {
        properties.put("mail.smtp.starttls.enable", "true");
        properties.put("mail.smtps.starttls.enable", "true");
        properties.put("mail.smtp.ssl.trust", smtpHost);
        properties.put("mail.smtps.ssl.trust", smtpHost);
        properties.put("mail.protocol.ssl.trust", smtpHost);
    }
    if (sslEnable) {
        properties.put("mail.smtp.ssl.enable", "true");
        properties.put("mail.smtp.ssl.trust", smtpHost);
        properties.put("mail.smtps.ssl.enable", "true");
        properties.put("mail.smtps.ssl.trust", smtpHost);
        properties.put("mail.protocol.ssl.trust", smtpHost);
    }

    Session session;
    if (password != null && password.length() > 0) {
        properties.put("mail.smtp.auth", "true");
        final String userName = user;
        if (user != null && !user.equals("")) {
            session = Session.getInstance(properties,
                    new javax.mail.Authenticator() {
                        protected PasswordAuthentication getPasswordAuthentication() {
                            return new PasswordAuthentication(userName,
                                    password);
                        }
                    });
        } else {
            session = Session.getInstance(properties,
                    new javax.mail.Authenticator() {
                        protected PasswordAuthentication getPasswordAuthentication() {
                            return new PasswordAuthentication(from,
                                    password);
                        }
                    });
        }

    } else {
        session = Session.getInstance(properties);
    }

    MimeMessage mailMessage = new MimeMessage(session);
    try {
        mailMessage.setFrom(new InternetAddress(from));
    } catch (AddressException e) {
        throw new AddressException("Invalid FROM address: " + e.getMessage());
    }

    mailMessage.setRecipients(Message.RecipientType.TO, to);
    mailMessage.setRecipients(Message.RecipientType.CC, cc);
    mailMessage.setRecipients(Message.RecipientType.BCC, bcc);
    mailMessage.setSubject(subject);
    mailMessage.setSentDate(new Date());

    // Set the email message text.
    MimeBodyPart messagePart = new MimeBodyPart();
    messagePart.setContent(bodyText, "text/html; charset=utf-8");
    // messagePart.setText(bodyText);
    Multipart multipart = new MimeMultipart("mixed");
    multipart.addBodyPart(messagePart);

    try {
        if (files != null) {
            for (File file : files) {
                MimeBodyPart attachmentPart = new MimeBodyPart();
                attachmentPart.attachFile(file);
                multipart.addBodyPart(attachmentPart);
            }
        }
    } catch (MessagingException e) {
        throw new MessagingException(
                "Error attaching files, MessagingException: "
                        + e.getMessage());
    } catch (IOException e) {
        throw new IOException("Error attaching files: " + e.getMessage());
    }

    mailMessage.setContent(multipart);

    if (password == null || password.length() < 1) {
        Transport.send(mailMessage, mailMessage.getAllRecipients());
    } else if (user != null && !user.equals("")) {
        Transport.send(mailMessage, mailMessage.getAllRecipients(), user,
                password);
    } else {
        Transport.send(mailMessage, mailMessage.getAllRecipients(), from,
                password);
    }
}
...