Expand my Community achievements bar.

Nomination window for the Adobe Community Advisor Program, Class of 2025, is now open!
SOLVED

How to send an email with Day CQ Mail Service?

Avatar

Level 2

I created a component with a form. My intention is to be able to send the results of the data entered to the email, which is always written using a form. I'm trying with a servlet but it doesn't seem to detect it either

1 Accepted Solution

Avatar

Correct answer by
Level 7

Hi @Vodjakxa 
try below approaches:
servlet: 

@Component(service = Servlet.class,
        property = {
                "sling.servlet.resourceTypes=project/components/content/contact-us",
                "sling.servlet.methods=" + HttpConstants.METHOD_POST,
                "sling.servlet.extensions=json"
        })
public class ContactusServlet extends SlingAllMethodsServlet {

    @Reference
    private CustomEmailService customEmailService;

    @Override
    protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("name");
        String email = request.getParameter("email");
        String message = request.getParameter("message");

        String resourcePath = request.getResource().getPath();
        Resource resource = request.getResourceResolver().resolve(resourcePath);

        ValueMap vm = ResourceUtil.getValueMap(resource);
        String path = vm.get("path").toString();


        // Email content
        String subject = "New Contact Us Submission";
        String body = "Name: " + name + "\nEmail: " + email + "\nMessage: " + message;

        try {
            // Send email
            boolean isEmailSent = customEmailService.sendEmail(email, subject, body);

            if (isEmailSent) {
                response.sendRedirect(path + ".html");
            } else {
                response.getWriter().write("{\"status\":\"error\",\"message\":\"Failed to send email.\"}");
            }
        } catch (Exception e) {
            response.getWriter().write("{\"status\":\"error\",\"message\":\"" + e.getMessage() + "\"}");
        }

    }
}

 

Service:

public interface CustomEmailService {
    boolean sendEmail(String recipient, String subject, String body) throws EmailException, MessagingException;
}

 

ServiceImpl:

@Component(service = CustomEmailService.class, immediate = true)
public class CustomEmailServiceImpl implements CustomEmailService {
    @Override
    public boolean sendEmail(String recipient, String subject, String body) throws EmailException, MessagingException {
        final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
        Properties props = System.getProperties();
        props.setProperty("mail.smtp.host", "smtp.gmail.com");
        props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
        props.setProperty("mail.smtp.socketFactory.fallback", "false");
        props.setProperty("mail.smtp.port", "465");
        props.setProperty("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enabled", "true");
        props.put("mail.smtp.starttls.required", "true");
        props.put("mail.smtp.ssl.protocols", "TLSv1.2");
        props.put("mail.debug", "true");
        props.put("mail.store.protocol", "pop3");
        props.put("mail.transport.protocol", "smtp");

        Session session = Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("abc@gmail.com","ashdkasjhdue");
            }
        });

        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress("abc@gmail.com"));
        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipient));
        message.setSubject(subject);
        message.setText(body);
        try {
            Transport.send(message);
            return true;

        } catch (MessagingException e) {
            return false;
            //throw new RuntimeException(e);

        }




    }
}


you can also refer to this: https://experienceleaguecommunities.adobe.com/t5/adobe-experience-manager/how-to-send-email-after-fo... 

Hope this helps!

View solution in original post

5 Replies

Avatar

Level 7

Lot of documentation available for sending email from AEM.

  1. Easiest is using ACS Commons https://adobe-consulting-services.github.io/acs-aem-commons/features/e-mail/email-api/index.html
  2. If just using AEM email service, you must configure Advance Network configuration and DefaultMailService. refer https://experienceleague.adobe.com/en/docs/experience-manager-65/content/sites/administering/operati...
  3. For AEM onprem refer https://experienceleague.adobe.com/en/docs/experience-manager-65/content/sites/administering/operati... and https://experienceleague.adobe.com/en/docs/experience-manager-65/content/forms/administrator-help/co...
  4. Make sure to follow email best practices https://experienceleague.adobe.com/en/docs/experience-manager-65/content/sites/administering/integra...

If you tried and getting specific error, can help to troubleshoot. 

 

 

Avatar

Correct answer by
Level 7

Hi @Vodjakxa 
try below approaches:
servlet: 

@Component(service = Servlet.class,
        property = {
                "sling.servlet.resourceTypes=project/components/content/contact-us",
                "sling.servlet.methods=" + HttpConstants.METHOD_POST,
                "sling.servlet.extensions=json"
        })
public class ContactusServlet extends SlingAllMethodsServlet {

    @Reference
    private CustomEmailService customEmailService;

    @Override
    protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("name");
        String email = request.getParameter("email");
        String message = request.getParameter("message");

        String resourcePath = request.getResource().getPath();
        Resource resource = request.getResourceResolver().resolve(resourcePath);

        ValueMap vm = ResourceUtil.getValueMap(resource);
        String path = vm.get("path").toString();


        // Email content
        String subject = "New Contact Us Submission";
        String body = "Name: " + name + "\nEmail: " + email + "\nMessage: " + message;

        try {
            // Send email
            boolean isEmailSent = customEmailService.sendEmail(email, subject, body);

            if (isEmailSent) {
                response.sendRedirect(path + ".html");
            } else {
                response.getWriter().write("{\"status\":\"error\",\"message\":\"Failed to send email.\"}");
            }
        } catch (Exception e) {
            response.getWriter().write("{\"status\":\"error\",\"message\":\"" + e.getMessage() + "\"}");
        }

    }
}

 

Service:

public interface CustomEmailService {
    boolean sendEmail(String recipient, String subject, String body) throws EmailException, MessagingException;
}

 

ServiceImpl:

@Component(service = CustomEmailService.class, immediate = true)
public class CustomEmailServiceImpl implements CustomEmailService {
    @Override
    public boolean sendEmail(String recipient, String subject, String body) throws EmailException, MessagingException {
        final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
        Properties props = System.getProperties();
        props.setProperty("mail.smtp.host", "smtp.gmail.com");
        props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
        props.setProperty("mail.smtp.socketFactory.fallback", "false");
        props.setProperty("mail.smtp.port", "465");
        props.setProperty("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enabled", "true");
        props.put("mail.smtp.starttls.required", "true");
        props.put("mail.smtp.ssl.protocols", "TLSv1.2");
        props.put("mail.debug", "true");
        props.put("mail.store.protocol", "pop3");
        props.put("mail.transport.protocol", "smtp");

        Session session = Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("abc@gmail.com","ashdkasjhdue");
            }
        });

        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress("abc@gmail.com"));
        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipient));
        message.setSubject(subject);
        message.setText(body);
        try {
            Transport.send(message);
            return true;

        } catch (MessagingException e) {
            return false;
            //throw new RuntimeException(e);

        }




    }
}


you can also refer to this: https://experienceleaguecommunities.adobe.com/t5/adobe-experience-manager/how-to-send-email-after-fo... 

Hope this helps!

Avatar

Level 2

Thank you for the  reply.

 

Instead in the html with the form what should I put in action?

Avatar

Level 7

you can call the servlet and pass your values params 

Avatar

Level 6

To send an email with Day CQ Mail Service in AEM, follow these steps:
1. Configure Mail Service in AEM Go to /system/console/configuration/com.day.cq.mailer.DefaultMailService and set up SMTP settings (host, port, username, and password).
2. Create a Servlet to Send Email Create a servlet to handle form submission and send email:

 

package com.example.core.servlet;

import com.day.cq.mailer.Message;
import com.day.cq.mailer.MessageFactory;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.apache.sling.api.request.RequestParameter;
import javax.servlet.Servlet;

public class EmailServlet extends SlingAllMethodsServlet {
    
    protected void doPost(SlingSafeMethodsServletRequest request, SlingSafeMethodsServletResponse response) {
        String subject = request.getParameter("subject");
        String body = request.getParameter("body");
        
        Message email = MessageFactory.create();
        email.setSubject(subject);
        email.setBody(body);
        email.setTo("recipient@example.com");
        
        // Send email
        email.send();
    }
}

 

3. Map the Servlet to a Path Ensure the servlet is mapped to a specific path in your AEM configuration so it can be triggered by a form submission.