Java 使用SendGrid在Heroku中发送邮件

Java 使用SendGrid在Heroku中发送邮件,java,email,heroku,playframework,sendgrid,Java,Email,Heroku,Playframework,Sendgrid,我正在尝试使用Heroku中的Play Framework和SendGrid发送电子邮件。我将配置(Application.conf)设置如下: mail.smtp=smtp mail.smtp.host=smtp.sendgrid.net mail.smtp.port=587 mail.smtp.user=${SENDGRID_USERNAME} mail.smtp.pass=${SENDGRID_PASSWORD} mail.smtp.protocol=smtps mail.smtp.cha

我正在尝试使用Heroku中的Play Framework和SendGrid发送电子邮件。我将配置(Application.conf)设置如下:

mail.smtp=smtp
mail.smtp.host=smtp.sendgrid.net
mail.smtp.port=587
mail.smtp.user=${SENDGRID_USERNAME}
mail.smtp.pass=${SENDGRID_PASSWORD}
mail.smtp.protocol=smtps
mail.smtp.channel=plain
mail.debug=true
但我有一个例外:

DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at javax.mail.Session.getService(Session.java:760)
    at javax.mail.Session.getTransport(Session.java:689)
    at javax.mail.Session.getTransport(Session.java:632)
    at javax.mail.Session.getTransport(Session.java:612)
    at javax.mail.Session.getTransport(Session.java:667)
    at javax.mail.Transport.send0(Transport.java:148)
    at javax.mail.Transport.send(Transport.java:80)
    at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1232)
    at org.apache.commons.mail.Email.send(Email.java:1267)
    at play.libs.Mail$2.call(Mail.java:180)
    at play.libs.Mail$2.call(Mail.java:175)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.SecurityException: class "com.sun.mail.util.PropUtil"'s signer information does not match signer information of other classes in the same package
    at java.lang.ClassLoader.checkCerts(ClassLoader.java:806)
    at java.lang.ClassLoader.preDefineClass(ClassLoader.java:487)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:625)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at com.sun.mail.smtp.SMTPTransport.<init>(SMTPTransport.java:146)
    at com.sun.mail.smtp.SMTPTransport.<init>(SMTPTransport.java:133)
    ... 20 more
ERROR  niceThrowable, 

@68efkgai3
The email has not been sent

Mail error
A mail error occured : Error while sending email

play.exceptions.MailException: Error while sending email
    at play.libs.Mail$2.call(Mail.java:183)
    at play.libs.Mail$2.call(Mail.java:175)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
Caused by: org.apache.commons.mail.EmailException: Sending the email to the following server failed : smtp.sendgrid.net:25
    at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1242)
    at org.apache.commons.mail.Email.send(Email.java:1267)
    at play.libs.Mail$2.call(Mail.java:180)
    ... 6 more
Caused by: javax.mail.NoSuchProviderException: smtp
    at javax.mail.Session.getService(Session.java:764)
    at javax.mail.Session.getTransport(Session.java:689)
    at javax.mail.Session.getTransport(Session.java:632)
    at javax.mail.Session.getTransport(Session.java:612)
    at javax.mail.Session.getTransport(Session.java:667)
    at javax.mail.Transport.send0(Transport.java:148)
    at javax.mail.Transport.send(Transport.java:80)
    at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1232)
    ... 8 more
DEBUG:getProvider()返回javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,sun Microsystems,Inc]
java.lang.reflect.InvocationTargetException
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:513)
在javax.mail.Session.getService(Session.java:760)
在javax.mail.Session.getTransport(Session.java:689)
在javax.mail.Session.getTransport(Session.java:632)
在javax.mail.Session.getTransport(Session.java:612)
在javax.mail.Session.getTransport(Session.java:667)
在javax.mail.Transport.send0(Transport.java:148)
在javax.mail.Transport.send(Transport.java:80)
位于org.apache.commons.mail.Email.sendMimeMessage(Email.java:1232)
位于org.apache.commons.mail.Email.send(Email.java:1267)
at play.libs.Mail$2.call(Mail.java:180)
at play.libs.Mail$2.call(Mail.java:175)
位于java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
位于java.util.concurrent.FutureTask.run(FutureTask.java:138)
位于java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
运行(Thread.java:662)
原因:java.lang.SecurityException:class“com.sun.mail.util.PropUtil”的签名者信息与同一包中其他类的签名者信息不匹配
位于java.lang.ClassLoader.checkCerts(ClassLoader.java:806)
位于java.lang.ClassLoader.preDefineClass(ClassLoader.java:487)
位于java.lang.ClassLoader.defineClassCond(ClassLoader.java:625)
位于java.lang.ClassLoader.defineClass(ClassLoader.java:615)
位于java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
位于java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
在java.net.URLClassLoader.access$000(URLClassLoader.java:58)
在java.net.URLClassLoader$1.run(URLClassLoader.java:197)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.net.URLClassLoader.findClass(URLClassLoader.java:190)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:306)
位于sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:247)
在com.sun.mail.smtp.SMTPTransport.(SMTPTransport.java:146)
在com.sun.mail.smtp.SMTPTransport.(SMTPTransport.java:133)
... 20多
可丢弃的错误,
@68efkgai3
电子邮件尚未发送
邮件错误
发生邮件错误:发送电子邮件时出错
play.exceptions.MailException:发送电子邮件时出错
at play.libs.Mail$2.call(Mail.java:183)
at play.libs.Mail$2.call(Mail.java:175)
位于java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
位于java.util.concurrent.FutureTask.run(FutureTask.java:138)
位于java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
运行(Thread.java:662)
原因:org.apache.commons.mail.EmailException:将电子邮件发送到以下服务器失败:smtp.sendgrid.net:25
位于org.apache.commons.mail.Email.sendMimeMessage(Email.java:1242)
位于org.apache.commons.mail.Email.send(Email.java:1267)
at play.libs.Mail$2.call(Mail.java:180)
... 还有6个
原因:javax.mail.NoSuchProviderException:smtp
在javax.mail.Session.getService(Session.java:764)
在javax.mail.Session.getTransport(Session.java:689)
在javax.mail.Session.getTransport(Session.java:632)
在javax.mail.Session.getTransport(Session.java:612)
在javax.mail.Session.getTransport(Session.java:667)
在javax.mail.Transport.send0(Transport.java:148)
在javax.mail.Transport.send(Transport.java:80)
位于org.apache.commons.mail.Email.sendMimeMessage(Email.java:1232)
... 8个以上
在调试Mail.java类时,似乎可以正确设置参数。任何人都可以共享他/她的配置?

也许您还需要:

mail.smtp.auth=true
mail.smtp.starttls.enable=true

如果您使用的是我相信的其他设置,则应该将其注释掉。看起来这是基于堆栈跟踪的错误。

好的,找到了。问题是我正在使用的模块有一个非依赖管理的mail.jar副本(Java邮件api)。由于Play嵌入了它自己的副本,这导致了冲突,导致了“神秘”错误:

另一个支持在模块中使用dependencies.yml的论点,伙计们


多亏了所有回答问题的人,他们帮了忙:)

您的堆栈跟踪表明它正试图使用端口25而不是587。。。“将电子邮件发送到以下服务器失败:smtp.sendgrid.net:25”@Brand是的,我知道,但是设置是针对端口587的,属性映射在Play中的mail.java内部时会得到“mail.smtp.port->587”。我建议您的属性没有被实际使用。@Brand是的,我不知道为什么:(根据规范,它们应该“以某种方式”工作不,它们没有什么区别,从我调试时看到的情况来看,Play似乎没有使用它们
mail.smtp=smtp
Caused by: javax.mail.NoSuchProviderException: smtp