Java电子邮件在本地spring应用程序上工作,但在部署的Heroku应用程序上不工作

Java电子邮件在本地spring应用程序上工作,但在部署的Heroku应用程序上不工作,java,spring,email,heroku,Java,Spring,Email,Heroku,所以我试图从heroku上部署的spring应用程序发送一封电子邮件。在本地运行时,电子邮件发送得非常好,但在heroku上,我发现以下错误: javax.mail.MessaginException:无法将套接字转换为TLS; 2021-04-30T14:46:49.318141+00:00应用程序[web.1]:嵌套异常为: 2021-04-30T14:46:49.318145+00:00应用程序[web.1]:javax.net.ssl.SSLHandshakeException:没有合适

所以我试图从heroku上部署的spring应用程序发送一封电子邮件。在本地运行时,电子邮件发送得非常好,但在heroku上,我发现以下错误:

javax.mail.MessaginException:无法将套接字转换为TLS; 2021-04-30T14:46:49.318141+00:00应用程序[web.1]:嵌套异常为: 2021-04-30T14:46:49.318145+00:00应用程序[web.1]:javax.net.ssl.SSLHandshakeException:没有合适的协议(协议被禁用或密码套件不合适) 2021-04-30T14:46:49.318644+00:00应用程序[web.1]:位于com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1907) 2021-04-30T14:46:49.318767+00:00应用程序[web.1]:位于com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:666) 2021-04-30T14:46:49.318886+00:00应用程序[web.1]:位于javax.mail.Service.connect(Service.java:317) 2021-04-30T14:46:49.318972+00:00应用程序[web.1]:位于javax.mail.Service.connect(Service.java:176) 2021-04-30T14:46:49.319037+00:00应用程序[web.1]:位于javax.mail.Service.connect(Service.java:125)

然而,这个错误却奇迹般地出现了。直到昨天为止,heroku的工作还很顺利。我猜可能是因为heroku认为它可疑才标记了它。有人知道有什么补救办法吗

以下是我的代码:

public static void sendEmail(User user) throws MessagingException {    
        //System.out.println("Preparing to send email");
        Properties properties = new Properties();
        
        properties.put("mail.smtp.auth",  "true");
        properties.put("mail.smtp.starttls.enable", "true");
        properties.put("mail.smtp.host",  "smtp.gmail.com");
        properties.put("mail.smtp.port",  "587");
        
        String myAccountEmail = "-redacted-";
        String password = "-redacted-";
        
        User recipient = user;
        
        javax.mail.Session session = javax.mail.Session.getInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(myAccountEmail, password);
            }
        });
        
        Message message = prepareMessage(session, myAccountEmail, recipient);
        
        Transport.send(message);
        //System.out.println("Message sent successfully");
    }

我不确定这是不是一个合适的解决方案,或者它是否适合您的情况,但我在过去几天里一直在研究同一个问题,解决方案是升级heroku运行我的应用程序的java版本

在应用程序根文件夹的system.properties文件中:

java.runtime.version=13
事实证明,他们正在使用的Java11映像有一些旧的SSL版本,而且(就我而言)作为开发人员,没有办法禁用它


它解决了我的问题,我希望它能解决你的问题。不确定Heroku将来是否会为java 11 dynos解决这个问题。

检查是否打开了必要的端口我不知道怎么做@JAsgarov,它也在本地运行如果Heroku默认允许发送SMTP,我会非常惊讶。你的评论“它也在本地运行”告诉我你不知道端口到底是什么。。。请快速阅读,因为您需要这些信息,然后谷歌如何打开heroku Ports。对于连接MySQL数据库的JDBC连接器,我们也遇到了同样的情况。还是不知道为什么。我认为开放港口不是一个有希望的建议。我们的应用程序能够通过TLS连接到MySQL,直到今天的部署包含一些与JDBC连接无关的小更新。非常感谢!非常好,对我也很好!