2

I am trying to send emails using spring 5.1.3.RELEASE and Tomcat 9.0.43 but having the below exception. I can see in Tomcat lib folder the libraries mail-1.4.7.jar and javax.mail-api-1.6.2.jar but due to some reasons the exception below is showing that it's trying to use a method signature not available in mail-1.4.7 but only in the version 1.5.6.

I tried exclusion tag in all the dependencies in my pom.xml without success and changing the order and I don't want to change tomcat libs to replace the mail-1.4.7.

Could you help me please. Is there a way to enforce the use of application libs instead of Tomcat libs or what am I missing please in my configuration/code below.

java.lang.NoSuchMethodError: com.sun.mail.util.LineOutputStream.<init>(Ljava/io/OutputStream;Z)V
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1655)
    at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1913)
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1119)
    at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:462)
    at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:321)
    at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:310)
    at my.company.service.MailSenderServiceImpl.send(MailSenderServiceImpl.java:25)
    at my.company.controller.EmailController.sendMail(EmailController.java:21)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:189)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:800)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:626)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:346)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:887)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1684)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)

My pom.xml looks like this:

<dependencies>
    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>mail</artifactId>
        <version>1.4.7</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>javax.mail-api</artifactId>
        <version>1.6.2</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.1.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>5.1.3.RELEASE</version>
        <exclusions>
            <exclusion>
                <groupId>javax.mail</groupId>
                <artifactId>javax.mail-api</artifactId>
            </exclusion>
            <exclusion>
                <groupId>javax.mail</groupId>
                <artifactId>mail</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.1.3.RELEASE</version>
    </dependency>
</dependencies>

My mail sender bean looks like this:

@Bean(name = "mailSender")
public JavaMailSender mailSender() {
    org.springframework.mail.javamail.JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
    
    mailSender.setHost("localhost");
    mailSender.setPort(25);
      
    mailSender.setUsername("admin@gmail.com");
    mailSender.setPassword("password");
      
    Properties props = mailSender.getJavaMailProperties();
    props.put("mail.transport.protocol", "smtp");
    props.put("mail.smtp.auth", "false");
    props.put("mail.smtp.starttls.enable", "false");
    props.put("mail.debug", "true");

    return mailSender;
}

The sending method:

public boolean send(String sender, String receiver, String subject, String message) {
    
    try {
    
    SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
    simpleMailMessage.setFrom(sender);
    simpleMailMessage.setTo(receiver);
    simpleMailMessage.setSubject(subject);
    simpleMailMessage.setText(message);
    
    mailSender.send(simpleMailMessage);
    
    return true;
    
    }catch(Exception e) {
        e.printStackTrace();
        return false;
    }
}
Andronicus
  • 25,419
  • 17
  • 47
  • 88
armada1750
  • 21
  • 1
  • 1
    If `org.springframework.mail.javamail.JavaMailSenderImpl` uses a method not in 1.4.7 then there's nothing you can do about that in your pom.xml. You will either need to use a newer mail or an older spring. – tgdavies Sep 06 '21 at 08:20
  • Or use javamail directly instead of via spring – tgdavies Sep 06 '21 at 08:30
  • 1
    thanks @tgdavies,. I would like to keep using Spring 5 and currently I have confirmed that it works by replacing tomcat lib mail-1.4.7.jar by javax.mail-1.6.2.jar in tomcat lib directly but this is not a clean solution so I was wondering if we can do it through project properties or maven. In weblogic we can do it I think by using an ear package and changing some properties in weblogic.xml to enforce the use of project libraries: true – armada1750 Sep 06 '21 at 08:51
  • Using javamail directly instead of spring is a good option in fact, why didn't I think of that :) I'll try it – armada1750 Sep 06 '21 at 08:52
  • Tomcat always prefers WEB-INF/lib – tgdavies Sep 06 '21 at 08:53
  • I tried your suggestion to use java mail instead of spring mail and it resolve my issue in fact. Thanks – armada1750 Sep 06 '21 at 09:14
  • no solution on this one? same here, Tomcat 9 and java.lang.NoSuchMethodError: com.sun.mail.util.PropUtil.getBooleanSessionProperty(Ljavax/mail/Session;Ljava/lang/String;Z)Z – Mohamad Eghlima Apr 01 '22 at 04:23

0 Answers0