Expand my Community achievements bar.

Guidelines for the Responsible Use of Generative AI in the Experience Cloud Community.
SOLVED

How to send email based on listener outputs in AEM?

Avatar

Level 6

I've got this listener which listens to any changes including addition, modification and deletion for nodes under content directory. A mail has to be send to some mail address whenever the listener logs a change. How to work around that?

import javax.jcr.RepositoryException;

import javax.jcr.Session;

import javax.jcr.observation.Event;

import javax.jcr.observation.EventListener;

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

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

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

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

import com.day.cq.mailer.MessageGatewayService;

import org.osgi.service.component.ComponentContext;

import javax.jcr.observation.EventIterator ;

 

@Component(immediate=true,

service= EventListener.class)

 

public class ContentChangeListener implements EventListener{

 

     private Session adminSession;

      

     

     @Reference

     org.apache.sling.jcr.api.SlingRepository repository;

    

     @Reference

     private MessageGatewayService messageGatewayService;

      

     @Activate

     public void activate(ComponentContext context) throws Exception {

     System.out.println("Started Listener");

     try {

         adminSession = repository.loginService("testing",null);

         adminSession.getWorkspace().getObservationManager().addEventListener(

          this, Event.PROPERTY_ADDED|Event.NODE_ADDED|Event.NODE_MOVED|Event.NODE_REMOVED|Event.PROPERTY_CHANGED|Event.PROPERTY_REMOVED,

          "/content/silversea/en/homepage", true, null, null, false);

      

          

     } catch (RepositoryException e){

      System.out.println("unable to register session"+e);

     }

    }

    @Deactivate

    public void deactivate(){

     if (adminSession != null){

      adminSession.logout();

     }

    }

      

    public void onEvent(EventIterator eventIterator) {

      try {

        while (eventIterator.hasNext()){

      

        System.out.println("Something has been added : {}"+ eventIterator.nextEvent().getPath());

        }

       } catch(RepositoryException e){

       System.out.println("Error while treating events"+e);

      }

     }

    }

1 Accepted Solution

Avatar

Correct answer by
Level 5

Hi jezwn

Add following code in your Activate method and modify variables accordingly. I have configured gmail for sending the mails.​

String sender_mail = YOUR_EMAIL_ADDRESS;

String sender_pass = YOUR_PASSWORD;

String host = "smtp.gmail.com";

int port    = 587;

String recipient_mail = 'email@address.com';

String mail_subject = "Test Subject";

String mail_content = "This is sample email content";

java.util.Properties props = new java.util.Properties();

props.put("mail.smtp.host", host);

props.put("mail.smtp.port", port);

props.put("mail.smtp.starttls.enable", true);

props.put("mail.smtp.auth", true);

Session session = Session.getInstance(props, new javax.mail.Authenticator() {

    protected PasswordAuthentication getPasswordAuthentication() {

        return new PasswordAuthentication(sender_mail, sender_pass);

    }

});

try {

    MimeMessage msg = new MimeMessage(session);

    InternetAddress[] address = InternetAddress.parse(recipient_mail, true);

    msg.setRecipients(Message.RecipientType.TO, address);

    String timeStamp = new SimpleDateFormat("yyyymmdd_hh-mm-ss").format(new Date());

    msg.setSubject(mail_subject);

    msg.setSentDate(new Date());

    msg.setText(mail_content);

    msg.setHeader("XPriority", "1");

    Transport.send(msg);

    LOGGER.info("Mail has been sent successfully");

} catch (MessagingException mex) {

    LOGGER.info("Unable to send an email: " + mex);

}


Don't forget to import libraries

Hope it helps!

View solution in original post

1 Reply

Avatar

Correct answer by
Level 5

Hi jezwn

Add following code in your Activate method and modify variables accordingly. I have configured gmail for sending the mails.​

String sender_mail = YOUR_EMAIL_ADDRESS;

String sender_pass = YOUR_PASSWORD;

String host = "smtp.gmail.com";

int port    = 587;

String recipient_mail = 'email@address.com';

String mail_subject = "Test Subject";

String mail_content = "This is sample email content";

java.util.Properties props = new java.util.Properties();

props.put("mail.smtp.host", host);

props.put("mail.smtp.port", port);

props.put("mail.smtp.starttls.enable", true);

props.put("mail.smtp.auth", true);

Session session = Session.getInstance(props, new javax.mail.Authenticator() {

    protected PasswordAuthentication getPasswordAuthentication() {

        return new PasswordAuthentication(sender_mail, sender_pass);

    }

});

try {

    MimeMessage msg = new MimeMessage(session);

    InternetAddress[] address = InternetAddress.parse(recipient_mail, true);

    msg.setRecipients(Message.RecipientType.TO, address);

    String timeStamp = new SimpleDateFormat("yyyymmdd_hh-mm-ss").format(new Date());

    msg.setSubject(mail_subject);

    msg.setSentDate(new Date());

    msg.setText(mail_content);

    msg.setHeader("XPriority", "1");

    Transport.send(msg);

    LOGGER.info("Mail has been sent successfully");

} catch (MessagingException mex) {

    LOGGER.info("Unable to send an email: " + mex);

}


Don't forget to import libraries

Hope it helps!