Mail MessageGateway is null | Community
Skip to main content
January 11, 2016
Solved

Mail MessageGateway is null

  • January 11, 2016
  • 15 replies
  • 8760 views

I created a mail service class, which should use the CQ Mail Configuration.
However I compared my code to several samples from the Internet my service does not work, because
messageGatewayService.getGateway(...) always returns null. This is my simplified code:

------------------------------------------
import org.apache.commons.mail.Email;
import org.apache.commons.mail.HtmlEmail;
import org.apache.commons.mail.SimpleEmail;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.day.cq.mailer.MessageGateway;
import com.day.cq.mailer.MessageGatewayService;

@Component(immediate = true)
@Service(MailService.class)
public class MailServiceImpl implements MailService {

    private static final Logger LOGGER = LoggerFactory.getLogger(MailServiceImpl.class);
    
    @Reference
    private MessageGatewayService messageGatewayService;
    
    @Override
    public void sendMail(String subject, String mailText, List<String> recipients) {
        LOGGER.info("Send mail");
        try {        
            Email email = new SimpleEmail();    
            for (String recipient : recipients) {
                email.addTo(recipient, recipient);
            }
            email.setSubject(subject);
            email.setMsg(mailText);
            
            MessageGateway<Email> messageGateway = messageGatewayService.getGateway(Email.class);
            // --> returns null
            MessageGateway<SimpleEmail> messageGateway1 = messageGatewayService.getGateway(SimpleEmail.class);
            // --> returns null
            MessageGateway<HtmlEmail> messageGateway2 = messageGatewayService.getGateway(HtmlEmail.class);
            // --> returns null
            //MessageGateway messageGateway3 = messageGatewayService.getGateway(com.day.cq.mailer.impl.DefaultMailService.class);
            // --> deactivated in code, because DefaultMailService.class unknown

            if (messageGateway!=null) {
                messageGateway.send((Email) email);
            } else {
                LOGGER.error("Message gateway could not be retrieved.");
            }        
        } catch(Exception ex) {
            LOGGER.error("Error on sending mail.");        
        }            
    }
}
------------------------------------------
I tested the params used in my CQ Mail configuration in a different mail application and mails were sent out correctly, so the configuration seems not to be the problem.

When I debug the messageGatewayService class I can see it contains a map for gateway configurations which contains the CQ Mail configuration I defined in OSGI (see attachment).
So the messageGatewayService knows about my CQ Mail config. But it resists to deliver it to me :(

I noticed that the CQ Mail configuration in the gateway map is stored with key 'com.day.cq.mailer.impl.DefaultMailService' so it is the PID of the service.
But all examples I saw get the gateway via
MessageGateway<Email> messageGateway = messageGatewayService
.getGateway(Email.class) or
.getGateway(SimpleEmail.class) or
.getGateway(HtmlEmail.class)
which does not work for me?

Any idea?

This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.
Best answer by smacdonald2008

See this community article that covers this use case: 

https://helpx.adobe.com/experience-manager/using/creating-custom-aem-workflow-steps.html

In this article - it steps you through how to create a custom workflow step that emails using a MessageServiceGateway. 

If you follow this and get it working - you can compare it with your code and where the differences are. 

15 replies

smacdonald2008
Level 10
February 3, 2017

Did you try followoing the above article as it? 

poo21488
Level 2
January 25, 2018

I'm facing a similar problem where the emails are sent successfully sometimes and sometimes not.

If I check the logs, when emails are not sent I see this in my error.log

com.day.cq.wcm.foundation.forms.impl.MailServlet The mail service is currently not available! Unable to send form mail.

This translates to me that the object for class com.day.cq.mailer.MailService was null.

Level 3
September 17, 2018

We are facing the same null pointer issue while sending mail via messgegatway

messageGateway = messageGatewayService.getGateway(email.class)

We have configured the SMTP server and able to test get the OOTB mails(Ex:request for activation) How ever same thing not working using the custom code?

Do we have any dependencies with felix scr annotations because we are using aem 6.3 sp2 with service annotations but still we are facing messagegatway as null ?

smacdonald2008
Level 10
September 17, 2018

For AEM 6.3 - try using DS Annotations.

Level 3
September 18, 2018

Hi Smac,

I have used latest DS annotation for the same but still messageGatewayService.getGateway(email.class) throwing null pointer do we have to add any other dependencies in the pom xml.if not using Felix scr annotations.below are the annotations used

import org.apache.commons.mail.Email;

import org.apache.commons.mail.SimpleEmail;

import org.osgi.service.component.annotations.Component;

import org.osgi.service.component.annotations.Reference;

import com.day.cq.mailer.MessageGateway;

import com.day.cq.mailer.MessageGatewayService;

looks like with OSGi R6 annotations in AEM 6.3 it's mail service is not working ?