I always have troubles with sending email-messages from my application which I host locally.
The issue is that my ISP provider SMTP works only via SSL. I was able to setup Outlook to work with it and since ISP use not trusted certificate I was asked to confirm that that certificate is trusted.
So, actually (going ahead) we have two problems
- Configure /deploy/mail-service.xml to use correct port and other SSL parameters
- Add ISP certificate into the java keystore (since the certificate is not trusted)
So, after couple of experiments and googling I find that following combination of parameters work for me
<server>
<mbean code="org.jboss.mail.MailService" name="jboss:service=Mail">
<attribute name="JNDIName">java:/Mail</attribute>
<attribute name="User">${username}</attribute>
<attribute name="Password">${password}</attribute>
<attribute name="Configuration">
<configuration>
<!-- Change to your mail server prototocol -->
<property name="mail.store.protocol" value="pop3"></property>
<property name="mail.transport.protocol" value="smtp"></property>
<!-- Change to the user who will receive mail -->
<property name="mail.user" value="${username}"></property>
<!-- Change to the mail server -->
<property name="mail.pop3.host" value="${pop3-server}"></property>
<!-- SSL parameters STARTED-->
<property name="mail.smtp.host" value="${smtp-server}"></property>
<property name="mail.smtp.auth" value="true"></property>
<!-- The mail server port -->
<property name="mail.smtp.port" value="465"></property>
<property name="mail.smtp.ssl.enable" value="true"></property>
<property name="mail.smtp.socketFactory.class" value="javax.net.ssl.SSLSocketFactory"></property>
<!-- SSL parameters ENDED -->
<property name="mail.smtp.connectiontimeout" value="20000"></property>
<property name="mail.smtp.timeout" value="20000"></property>
<!-- Change to the address mail will be from -->
<property name="mail.from" value="${yourname@yourisp}"></property>
<!-- Enable debugging to see a lot of inetresting about SMTP protocol -->
<property name="mail.debug" value="true"></property>
</configuration>
</attribute>
<depends>jboss:service=Naming</depends>
</mbean>
</server>
So, that configuration seems at least trying to connect to my SMTP server, but emails are still not sent out. The reason is the SSL-certificate which my ISP used is signed by cacert.org, which issue free certificates.
To fix this issue I have to install that certificate into my java keystore and the easiest way to do it was to use InstallCert program (the link to source-code)
I run java my-smtp-server:465 input “1″ and program generate jssecacerts. After that I updated cacerts file in my %JRE-HOME%/lib/security with generated file (of course I backed up previous cacerts) and that was enough to start using my SSL email.
To find more details or solve more issues you can read the JavaMail FAQ which cover a lot of topics, for example I think it worth to use gmail or yahoo smtp for your email testing purposes, since they are always present and you are not depend on your ISP SMTP
Can you please provide complete example of using mail service in JBOSS. I just want to implement that into my application where I use jBOSS.
Hi, I use it from Seam application and it’s pretty easy (you may find complete instructions here)
It’s pretty easy with Seam
1. Configure application (inject JNDI mailService)
2. Define message template
3. Send from Seam action (java-code)
@In(create=true) private Renderer renderer; public void send() { try { renderer.render("/simple.xhtml"); facesMessages.add("Email sent successfully"); } catch (Exception e) { facesMessages.add("Email sending failed: " + e.getMessage()); } }too easy to be true, but it’s true
If you don’t use seam – you probably have to use Java-Mail API
For Spring application you could use Spring Mail API and JNDI bound mail-session
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> <property name="session"><ref bean="mailSession"></property> </bean> <bean id="mailSession" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"><value>java:/Mail</value></property> </bean>If you don’t have Spring and don’t have Seam than you probably have to retrieve and use your JNDI bound mail-sesison with following java-code (see full example in the jboss-docs
Context initCtx = new InitialContext(); Context envCtx = (Context) initCtx.lookup("java:comp/env"); Session session = (Session) envCtx.lookup("mail/Session"); Message message = new MimeMessage(session); message.setFrom(new InternetAddress(request.getParameter("from")); InternetAddress to[] = new InternetAddress[1]; to[0] = new InternetAddress(request.getParameter("to")); message.setRecipients(Message.RecipientType.TO, to); message.setSubject(request.getParameter("subject")); message.setContent(request.getParameter("content"), "text/plain"); Transport.send(message);While I think this is extremely good information I’m not sure if it is for me