Preloader image

Este é apenas um exemplo simples para demonstrar um uso muito básico da API. Deve ser o suficiente para você começar a usar o java mail pacotes.

Um serviço REST simples usando a API Jakarta Mail

Aqui vemos um terminal RESTful muito simples que pode ser chamado com uma mensagem a ser enviada por e-mail. Não seria difícil modificar o aplicativo para fornecer opções de configuração mais úteis. Como está, isso não enviará qualquer coisa, mas se você alterar os parâmetros para corresponder ao seu servidor de correio você verá a mensagem sendo enviada. Você pode encontrar muito mais detalhado informações sobre o Javamail API aqui

package org.superbiz.rest;

import jakarta.annotation.Resource;
import jakarta.mail.Message;
import jakarta.mail.MessagingException;
import jakarta.mail.PasswordAuthentication;
import jakarta.mail.Session;
import jakarta.mail.Transport;
import jakarta.mail.URLName;
import jakarta.mail.internet.InternetAddress;
import jakarta.mail.internet.MimeMessage;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
import java.util.Date;

@Path("/email")
public class EmailService {

    @Resource(mappedName = "java:comp/env/tomee/mail/exampleSMTP")
    private Session mailSession;

    @POST
    public String lowerCase(final String message) {

        try {

            /* Ensures that smtp authentication mechanism works as configured */
            boolean authenticate = "true".equals(mailSession.getProperty("mail.smtp.auth"));
            if (authenticate) {
                final String username = mailSession.getProperty("mail.smtp.user");
                final String password = mailSession.getProperty("mail.smtp.password");

                final URLName url = new URLName(
                        mailSession.getProperty("mail.transport.protocol"),
                        mailSession.getProperty("mail.smtp.host"), -1, null,
                        username, null);

                mailSession.setPasswordAuthentication(url, new PasswordAuthentication(username, password));
            } else {
                return "Using EMailService without SMTP auth configured. This might be valid, but could also be dangerous!";
            }

            //Set this just to see some internal logging
            mailSession.setDebug(true);

            //Create a message
            final MimeMessage msg = new MimeMessage(mailSession);
            msg.setFrom(new InternetAddress("admin@localhost")); //your e-mail address
            final InternetAddress[] address = {new InternetAddress("user@provider.com")};
            msg.setRecipients(Message.RecipientType.TO, address);
            msg.setSubject("JavaMail API test");
            msg.setSentDate(new Date());
            msg.setText(message, "UTF-8");

            Transport.send(msg);
        } catch (final MessagingException e) {
            return "Failed to send message: " + e.getMessage();
        }

        return "Sent";
    }
}

Teste

Teste para o serviço JAXRS

O teste usa o Arquillian com o adaptador TomEE embedded, assim o serviço REST roda em um TomEE real.

O método @Deployment cria rapidamente o aplicativo web a ser implantado com a classe EmailService e um WEB-INF/resources.xml que declara a sessão de e-mail. A sessão aponta para um servidor SMTP GreenMail que o teste inicia em uma porta aleatória. testable = false executa os métodos de teste como cliente do aplicativo implantado, e @ArquillianResource injeta a URL base dele.

Finalmente, para testá-lo, usamos a API do cliente cxf para chamar o serviço REST post () método.

package org.superbiz.rest;

import com.icegreen.greenmail.util.GreenMail;
import com.icegreen.greenmail.util.ServerSetup;
import org.apache.cxf.jaxrs.client.WebClient;
import org.apache.openejb.util.NetworkUtil;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.arquillian.test.api.ArquillianResource;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.StringAsset;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.io.IOException;
import java.net.URL;
import java.util.concurrent.CountDownLatch;

import static org.junit.Assert.assertEquals;

@RunWith(Arquillian.class)
public class EmailServiceTest {

    private static final int SMTP_TEST_PORT = NetworkUtil.getNextAvailablePort();

    private static final String USER_PASSWORD = "s3cr3t";
    private static final String USER_NAME = "admin@localhost";
    private static final String EMAIL_USER_ADDRESS = "admin@localhost";

    private static GreenMail mailServer;
    private static CountDownLatch started = new CountDownLatch(1);

    @ArquillianResource
    private URL base;

    @Deployment(testable = false)
    public static WebArchive app() {
        //Note: We can also configure this via tomee.xml
        return ShrinkWrap.create(WebArchive.class)
                .addClass(EmailService.class)
                .addAsWebInfResource(new StringAsset(
                        "<resources>\n" +
                        "  <Resource id=\"tomee/mail/mySMTP\" type=\"jakarta.mail.Session\">\n" +
                        "    mail.debug = false\n" +
                        "    mail.transport.protocol = smtp\n" +
                        "    mail.smtp.host = localhost\n" +
                        "    mail.smtp.port = " + SMTP_TEST_PORT + "\n" +
                        "    mail.smtp.auth = true\n" +
                        "    mail.smtp.user = " + USER_NAME + "\n" +
                        "    password = " + USER_PASSWORD + "\n" +
                        "  </Resource>\n" +
                        "</resources>"), "resources.xml");
    }

    @BeforeClass
    public static void setUp() throws InterruptedException {
        mailServer = new CustomGreenMailServer(new ServerSetup(SMTP_TEST_PORT, null, "smtp"));
        mailServer.start();

        //wait for the server startup...
        started.await();

        // create user on mail server
        mailServer.setUser(EMAIL_USER_ADDRESS, USER_NAME, USER_PASSWORD);
    }

    @AfterClass
    public static void tearDown() {
        if (mailServer != null) {
            mailServer.stop();
        }
    }

    @Test
    public void post() throws IOException {
        final String message = WebClient.create(base.toExternalForm()).path("email/").post("Hello TomEE", String.class);
        assertEquals("Sent", message);
    }

    public static class CustomGreenMailServer extends GreenMail {

        public CustomGreenMailServer(ServerSetup config) {
            super(new ServerSetup[]{config});
        }

        public synchronized void start() {
            super.start();
            started.countDown();
        }
    }
}

Corrida

A execução do exemplo é bastante simples. No diretório "javamail-api" excute:

$ mvn clean install

O que deve criar uma saída como a seguir.

Running org.superbiz.rest.EmailServiceTest
INFO: Starting TomEE from: /tmp/arquillian-apache-tomee-25745
INFO: Starting Servlet engine: [Apache Tomcat/11.0.25]
INFO: Starting ProtocolHandler ["http-nio-53129"]
INFO: Configuring enterprise application: /path/to/tomee/examples/javamail/target/tomee-embedded/0/f1d94c4d-a6ab-4b6a-a606-5e712002aebf
INFO: Creating Resource(id=f1d94c4d-a6ab-4b6a-a606-5e712002aebf/tomee/mail/mySMTP)
INFO: Auto-linking resource-ref 'java:comp/env/org.superbiz.rest.EmailService/mailSession' in bean f1d94c4d-a6ab-4b6a-a606-5e712002aebf.Comp813932100 to Resource(id=tomee/mail/mySMTP)
INFO: Enterprise application "/path/to/tomee/examples/javamail/target/tomee-embedded/0/f1d94c4d-a6ab-4b6a-a606-5e712002aebf" loaded.
INFO: Deployed Application(path=/path/to/tomee/examples/javamail/target/tomee-embedded/0/f1d94c4d-a6ab-4b6a-a606-5e712002aebf)
INFO: REST Application: http://localhost:53129/f1d94c4d-a6ab-4b6a-a606-5e712002aebf/      -> org.apache.openejb.server.rest.InternalApplication
INFO:      Service URI: http://localhost:53129/f1d94c4d-a6ab-4b6a-a606-5e712002aebf/email -> Pojo org.superbiz.rest.EmailService
INFO:              POST http://localhost:53129/f1d94c4d-a6ab-4b6a-a606-5e712002aebf/email ->      String lowerCase(String)
INFO: Undeploying app: /path/to/tomee/examples/javamail/target/tomee-embedded/0/f1d94c4d-a6ab-4b6a-a606-5e712002aebf
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.620 s -- in org.superbiz.rest.EmailServiceTest
Results:

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0