2011-11-19 235 views
1

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

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 

调试中播放的Mail.java类,它似乎正确设置参数。任何使其工作的人都可以分享他/她的配置?

+0

你的堆栈跟踪表明它试图使用端口25,而不是587 ... “发送电子邮件失败以下服务器:SMTP .sendgrid.net:25“ – bwest

+0

@Brand是的,我知道,但设置是为端口587和属性映射得到”mail.smtp.port-> 587“,而在播放中的Mail.java –

+0

我建议您的物业并未实际使用。 – bwest

回答

0

好的,找到它。问题是我使用的模块有一个非依赖项管理的mail.jar(Java邮件API)副本。如播放嵌入它自己的拷贝,这引起这就造成了“神秘”的错误冲突:

Caused by: javax.mail.NoSuchProviderException: smtp 

另一种说法赞成使用dependencies.yml你的模块,家伙!

感谢大家谁回答的答案,他们以某种方式帮助:)

1

也许你还需要:

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

不,他们没有什么区别,而且Play似乎并没有使用他们,而我在调试时看到的却是 –

1
mail.smtp=smtp 

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

+0

不,它没有工作,可惜:( –

相关问题