无法在远程服务器中发送电子邮件

时间:2018-06-25 09:42:54

标签: java spring ubuntu javamail remote-server

我有一个Java代码,用于通过端口587上的smtp协议发送电子邮件。为此,我正在使用javax邮件api。我可以在localhost(Windows和ubuntu)计算机上发送邮件。

当我创建了war文件并将其部署在具有ubuntu OS的远程服务器上时,出现了问题,日志中没有错误。请帮助可能的原因以及解决方法。

这是我的示例spring-java代码

public void sendMailForResetPassword(String emailId ) throws AddressException, MessagingException {
     EmailDataObject emailproperties=new EmailDataObject();

     try {
    Properties props = new Properties();
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.starttls.enable", "true");
    props.put("mail.smtp.host", emailproperties.host_name);
    props.put("mail.smtp.port", 587);
      props.put("mail.smtp.ssl.trust",  emailproperties.host_name);
      props.put("mail.smtp.UseDefaultCredentials",  false);

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




    String link = "www.example.com";
              System.out.println("This is best way for forgot password");
      StringBuilder bodyText = new StringBuilder(); 


    bodyText.append("<div>")
             .append("  Dear User<br/><br/>")
             .append("  We got your reset password request, Find below link to reset password <br/>")
             .append("  Please click <a href=\""+link+"\">here</a> or open below link in browser<br/>")
             .append("  <br/><br/>")

             .append("</div>");
        Message message = new MimeMessage(session);

        message.setFrom(new InternetAddress(emailproperties.from));
        message.setRecipients(Message.RecipientType.TO,
            InternetAddress.parse(emailId));
        message.setSubject("Reset Password");
        message.setContent(bodyText.toString(), "text/html; charset=utf-8");
        session.setDebug(true);

        System.out.println(message);
        Transport.send(message);



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

修改

这是会话的输出。setDebug(true);

 DEBUG SMTP: Found extension "ETRN", arg ""
 DEBUG SMTP: Found extension "STARTTLS", arg ""
 DEBUG SMTP: Found extension "AUTH", arg "PLAIN LOGIN"
 DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
 DEBUG SMTP: Found extension "8BITMIME", arg ""
 DEBUG SMTP: Found extension "DSN", arg ""
 DEBUG SMTP: Found extension "SMTPUTF8", arg ""
 STARTTLS 220 2.0.0 Ready to start TLS
 EHLO ubuntu-minimal

谢谢。

3 个答案:

答案 0 :(得分:1)

您似乎陷入了客户端向服务器宣布其名称的困境。也许服务器不喜欢您没有使用有效的DNS名称这一事实?如果正确配置了客户端计算机上的名称服务,则JavaMail(通过JDK)应该能够确定客户端计算机的DNS名称。由于这不起作用,您可以通过将JavaMail SMTP会话属性mail.smtp.localhost设置为客户端计算机的有效标准DNS主机名来覆盖它。

请注意,您可以通过getting rid of the Authenticator简化代码。

答案 1 :(得分:0)

您必须将Transport告诉Session并连接它们,然后关闭Transport,请尝试

    Transport smtpTransport = session.getTransport();
    smtpTransport.connect();
    smtpTransport.sendMessage(message, message.getAllRecipients());
    smtpTransport.close();

不只是

    Transport.send(message);

答案 2 :(得分:0)

我在Java中使用Email类找到了以上问题的答案。

npm run build