Java 无法从Play framework发送电子邮件

Java 无法从Play framework发送电子邮件,java,playframework,jakarta-mail,playframework-2.2,Java,Playframework,Jakarta Mail,Playframework 2.2,我正在尝试使用Play框架发送电子邮件。在applications.conf中,当我设置smtp.mock=true时,它工作得非常好: [info] application - HTML: Welcome to Play20StartApp. <br> Click on this link : http://localhost:9000/confirm/d77ea256-0d2e-4df5-b66e-e034159f8042 to confirm your email.<br

我正在尝试使用Play框架发送电子邮件。在applications.conf中,当我设置smtp.mock=true时,它工作得非常好:

[info] application - HTML: Welcome to Play20StartApp. <br> Click on this link : http://localhost:9000/confirm/d77ea256-0d2e-4df5-b66e-e034159f8042 to confirm your email.<br><br>--<br>null
[debug] application - Mail sent - SMTP:smtp.google.com:465 SSL:yes user:username@gmail.com password:password
我已将smtp.user设置为正确的值,即。server@businessdomain.com . 知道是什么导致了这个错误吗

故障排除步骤

  • 使用的电子邮件是真实的电子邮件,为了发布,它们是匿名的。同样地,使用真实的域名
  • 通过本地邮件服务器(exim)测试,以及通过Gmail(smtp.google.com)和谷歌应用(aspmx.l.google.com)服务器直接发送。已使用邮件客户端验证了这些设置
  • 下面的Java代码片段工作得非常好

    导入java.util。; 导入javax.mail。; 导入javax.mail.internet。; 导入javax.activation


  • 如果您在将来包装mailer操作(或使用Java等效工具),那么您可能会遇到一个变量范围问题:

    这项工作:

    val mail = use[MailerPlugin].email
    val async: Future[Unit] = Future{
      mail.setSubject(subject)
      mail.setRecipient(recipient)
      mail.setFrom(from)
      mail.send(body)
    }
    async.onFailure{case(e)=>
      Logger.error(s"mailer failed for $recipient due to: ${e.getMessage}")
    }
    
    这不起作用:

    我假设封闭范围在未来的封闭期内可用;在本例中,肯定不是这样,因为底层Apache Commons邮件程序使用“From address required”进行bail。果然,设置smtp.mock=true表明,当mail.setFrom和friends在将来的{…}范围之外填充时,fromAddress为null

    有趣的是,即使我将async val分解为一个本地方法,并传入构造的mailer和body文本:

    private def async(mail: MailerAPI, body: String): Future[Unit] = Future{
      mail.send(body)
    }
    

    在未来之外设置的邮件属性仍然是空的,尽管直接传递了一个构造的邮件器——令人惊讶的是,没有?

    我对Play框架一无所知;它不是使用您上面发布的(工作)Java代码吗?您实际上是在电子邮件中设置发件人地址,还是仅设置要进行身份验证的SMTP用户名?不,它没有使用Java代码。我将该Java代码与确切的电子邮件配置(从、到smtp服务器)一起使用,只是为了确保问题不在于smtp/传输位。i、 e.plainjavax.mail是有效的。当我尝试从Play Framework发送电子邮件时,它失败了,并抱怨表单地址无效。然后我猜您需要告诉Play Framework设置发件人地址,但只告诉SMTP用户。@BillShannon这是正确的。这就是我在application.conf文件smtp.host=smtp.google.com smtp.port=465 smtp.from=“my”中所做的。email@gmail.com“那没用。看来你需要一个游戏框架专家。试着在网上发帖。
    val mail = use[MailerPlugin].email
    val async: Future[Unit] = Future{
      mail.setSubject(subject)
      mail.setRecipient(recipient)
      mail.setFrom(from)
      mail.send(body)
    }
    async.onFailure{case(e)=>
      Logger.error(s"mailer failed for $recipient due to: ${e.getMessage}")
    }
    
    val mail = use[MailerPlugin].email
    mail.setSubject(subject)
    mail.setRecipient(recipient)
    mail.setFrom(from)
    val async: Future[Unit] = Future{mail.send(body)}
    async.onFailure{case(e)=>
      Logger.error(s"mailer failed for $recipient due to: ${e.getMessage}")
    }
    
    private def async(mail: MailerAPI, body: String): Future[Unit] = Future{
      mail.send(body)
    }