Issue
We have configured email delivery using the application server JNDI mail resource:
- Configuring in the context.xml of the application server:
-
<Resource name="mail/MailSession" auth="Container" type="javax.mail.Session" mail.smtp.host="MY_HOST_VALUE" />
-
- And adding the following property to the portal-ext.properties file
-
mail.session.jndi.name=mail/Session
-
But the following error appears in the logs when attempting to send emails:
2025-02-12 15:36:49.270 ERROR [liferay/mail-2][InfrastructureUtil:84] Unable to lookup mail/MailSession javax.naming.NameNotFoundException: Name [java:comp/env/mail/MailSession] is not bound in this Context. Unable to find [java:comp]. at org.apache.naming.NamingContext.lookup(NamingContext.java:520) ~[catalina.jar:9.0.98] at org.apache.naming.NamingContext.lookup(NamingContext.java:155) ~[catalina.jar:9.0.98] at javax.naming.InitialContext.lookup(InitialContext.java:409) ~[?:?] at com.liferay.portal.kernel.jndi.JNDIUtil._lookup(JNDIUtil.java:196) ~[portal-kernel.jar:?] at com.liferay.portal.kernel.jndi.JNDIUtil._lookup(JNDIUtil.java:214) ~[portal-kernel.jar:?] at com.liferay.portal.kernel.jndi.JNDIUtil.lookup(JNDIUtil.java:83) ~[portal-kernel.jar:?] at com.liferay.portal.kernel.util.InfrastructureUtil._createMailSession(InfrastructureUtil.java:81) [portal-kernel.jar:?] at com.liferay.portal.kernel.util.InfrastructureUtil.getMailSession(InfrastructureUtil.java:36) [portal-kernel.jar:?] at com.liferay.mail.service.impl.MailServiceImpl.getSession(MailServiceImpl.java:97) [portal-impl.jar:?] at com.liferay.mail.service.impl.MailServiceImpl.getSession(MailServiceImpl.java:73) [portal-impl.jar:?] at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?] at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?] at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?] at java.lang.reflect.Method.invoke(Method.java:566) ~[?:?] at com.liferay.portal.spring.aop.AopMethodInvocationImpl.proceed(AopMethodInvocationImpl.java:41) [portal-impl.jar:?] at com.liferay.portal.spring.transaction.TransactionInterceptor.invoke(TransactionInterceptor.java:60) [portal-impl.jar:?] at com.liferay.portal.spring.aop.AopMethodInvocationImpl.proceed(AopMethodInvocationImpl.java:48) [portal-impl.jar:?] at com.liferay.portal.spring.aop.AopInvocationHandler.invoke(AopInvocationHandler.java:40) [portal-impl.jar:?] at com.sun.proxy.$Proxy71.getSession(Unknown Source) [?:?] at com.liferay.mail.kernel.service.MailServiceUtil.getSession(MailServiceUtil.java:33) [portal-kernel.jar:?] at com.liferay.mail.internal.MailEngine.send(MailEngine.java:138) [portal-impl.jar:?] at com.liferay.mail.internal.MailEngine.send(MailEngine.java:283) [portal-impl.jar:?] at com.liferay.mail.messaging.MailMessageListener.doMailMessage(MailMessageListener.java:89) [portal-impl.jar:?] at com.liferay.mail.messaging.MailMessageListener.doReceive(MailMessageListener.java:95) [portal-impl.jar:?] at com.liferay.portal.kernel.messaging.BaseMessageListener.receive(BaseMessageListener.java:22) [portal-kernel.jar:?] at com.liferay.portal.kernel.messaging.InvokerMessageListener.receive(InvokerMessageListener.java:62) [portal-kernel.jar:?] at com.liferay.portal.messaging.internal.ParallelDestination$1.run(ParallelDestination.java:47) [bundleFile:?] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?] at java.lang.Thread.run(Thread.java:829) [?:?] Suppressed: javax.naming.NamingException: Could not create resource factory instance at org.apache.naming.factory.ResourceFactory.getDefaultFactory(ResourceFactory.java:74) ~[catalina.jar:9.0.98] at org.apache.naming.factory.FactoryBase.getObjectInstance(FactoryBase.java:87) ~[catalina.jar:9.0.98] at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:341) ~[?:?] at org.apache.naming.NamingContext.lookup(NamingContext.java:544) ~[catalina.jar:9.0.98] at org.apache.naming.NamingContext.lookup(NamingContext.java:148) ~[catalina.jar:9.0.98] at org.apache.naming.NamingContext.lookup(NamingContext.java:530) ~[catalina.jar:9.0.98] at org.apache.naming.NamingContext.lookup(NamingContext.java:148) ~[catalina.jar:9.0.98] at org.apache.naming.NamingContext.lookup(NamingContext.java:530) ~[catalina.jar:9.0.98] at org.apache.naming.NamingContext.lookup(NamingContext.java:148) ~[catalina.jar:9.0.98] at org.apache.naming.NamingContext.lookup(NamingContext.java:530) ~[catalina.jar:9.0.98] at org.apache.naming.NamingContext.lookup(NamingContext.java:155) ~[catalina.jar:9.0.98] at org.apache.naming.SelectorContext.lookup(SelectorContext.java:144) ~[catalina.jar:9.0.98] at javax.naming.InitialContext.lookup(InitialContext.java:409) ~[?:?] at com.liferay.portal.kernel.jndi.JNDIUtil._lookup(JNDIUtil.java:196) ~[portal-kernel.jar:?] at com.liferay.portal.kernel.jndi.JNDIUtil._lookup(JNDIUtil.java:214) ~[portal-kernel.jar:?] at com.liferay.portal.kernel.jndi.JNDIUtil.lookup(JNDIUtil.java:83) ~[portal-kernel.jar:?] at com.liferay.portal.kernel.util.InfrastructureUtil._createMailSession(InfrastructureUtil.java:81) [portal-kernel.jar:?] at com.liferay.portal.kernel.util.InfrastructureUtil.getMailSession(InfrastructureUtil.java:36) [portal-kernel.jar:?] at com.liferay.mail.service.impl.MailServiceImpl.getSession(MailServiceImpl.java:97) [portal-impl.jar:?] at com.liferay.mail.service.impl.MailServiceImpl.getSession(MailServiceImpl.java:73) [portal-impl.jar:?] at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?] at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?] at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?] at java.lang.reflect.Method.invoke(Method.java:566) ~[?:?] at com.liferay.portal.spring.aop.AopMethodInvocationImpl.proceed(AopMethodInvocationImpl.java:41) [portal-impl.jar:?] at com.liferay.portal.spring.transaction.TransactionInterceptor.invoke(TransactionInterceptor.java:60) [portal-impl.jar:?] at com.liferay.portal.spring.aop.AopMethodInvocationImpl.proceed(AopMethodInvocationImpl.java:48) [portal-impl.jar:?] at com.liferay.portal.spring.aop.AopInvocationHandler.invoke(AopInvocationHandler.java:40) [portal-impl.jar:?] at com.sun.proxy.$Proxy71.getSession(Unknown Source) [?:?] at com.liferay.mail.kernel.service.MailServiceUtil.getSession(MailServiceUtil.java:33) [portal-kernel.jar:?] at com.liferay.mail.internal.MailEngine.send(MailEngine.java:138) [portal-impl.jar:?] at com.liferay.mail.internal.MailEngine.send(MailEngine.java:283) [portal-impl.jar:?] at com.liferay.mail.messaging.MailMessageListener.doMailMessage(MailMessageListener.java:89) [portal-impl.jar:?] at com.liferay.mail.messaging.MailMessageListener.doReceive(MailMessageListener.java:95) [portal-impl.jar:?] at com.liferay.portal.kernel.messaging.BaseMessageListener.receive(BaseMessageListener.java:22) [portal-kernel.jar:?] at com.liferay.portal.kernel.messaging.InvokerMessageListener.receive(InvokerMessageListener.java:62) [portal-kernel.jar:?] at com.liferay.portal.messaging.internal.ParallelDestination$1.run(ParallelDestination.java:47) [bundleFile:?] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?] at java.lang.Thread.run(Thread.java:829) [?:?] Caused by: java.lang.NoClassDefFoundError: javax/mail/Authenticator at java.lang.Class.forName0(Native Method) ~[?:?] at java.lang.Class.forName(Class.java:315) ~[?:?] at org.apache.naming.factory.ResourceFactory.getDefaultFactory(ResourceFactory.java:62) ~[catalina.jar:9.0.98] ... 39 more Caused by: java.lang.ClassNotFoundException: javax.mail.Authenticator at java.net.URLClassLoader.findClass(URLClassLoader.java:476) ~[?:?] at java.lang.ClassLoader.loadClass(ClassLoader.java:594) ~[?:?] at java.lang.ClassLoader.loadClass(ClassLoader.java:527) ~[?:?] at java.lang.Class.forName0(Native Method) ~[?:?] at java.lang.Class.forName(Class.java:315) ~[?:?] at org.apache.naming.factory.ResourceFactory.getDefaultFactory(ResourceFactory.java:62) ~[catalina.jar:9.0.98] ... 39 more
We followed this Liferay documentation to configure it:
Environment
- DXP 2024.Q4
Resolution
According to the tomcat JDNI installation documentation here: https://tomcat.apache.org/tomcat-9.0-doc/jndi-resources-howto.html#JavaMail_Sessions
In the "4. Install the JavaMail libraries" sections, it is said:
Unpackage the distribution and place mail.jar into $CATALINA_HOME/lib so that it is available to Tomcat during the initialization of the mail Session Resource. Note: placing this jar in both $CATALINA_HOME/lib and a web application's lib folder will cause an error, so ensure you have it in the $CATALINA_HOME/lib location only.
So in order to solve the issue you have to:
- Shutdown the application server
- Copy the
mail.jarandactivation.jarfiles from the[LIFERAY_HOME]/tomcat-9.x.x/webapps/ROOT/WEB-INF/shielded-container-libfolder to the[LIFERAY_HOME]/tomcat-9.x.x/libfolder. - Delete the mail.jar from the
shielded-container-libfolder -
Do not delete the
activation.jarfile from theshielded-container-libfolder. Liferay DXP may require this library. - Start the application server
The activation.jar must be copied to the tomcat lib folder because mail.jar has some class dependencies with that JAR file.
Additional Information