/* * Copyright 2016 Red Hat, Inc. and/or its affiliates * and other contributors as indicated by the @author tags. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.keycloak.testsuite.util; import com.icegreen.greenmail.util.GreenMail; import com.icegreen.greenmail.util.ServerSetup; import org.jboss.logging.Logger; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMessage.RecipientType; import javax.mail.internet.MimeMultipart; import java.io.IOException; import java.lang.Thread.UncaughtExceptionHandler; import java.net.SocketException; import static org.keycloak.testsuite.util.MailServerConfiguration.HOST; import static org.keycloak.testsuite.util.MailServerConfiguration.PORT; public class MailServer { private static final Logger log = Logger.getLogger(MailServer.class); private static GreenMail greenMail; public static void main(String[] args) throws Exception { MailServer.start(); MailServer.createEmailAccount("test@email.test", "password"); try { while (true) { int c = greenMail.getReceivedMessages().length; if (greenMail.waitForIncomingEmail(Long.MAX_VALUE, c + 1)) { MimeMessage m = greenMail.getReceivedMessages()[c++]; log.info("-------------------------------------------------------"); log.info("Received mail to " + m.getRecipients(RecipientType.TO)[0]); if (m.getContent() instanceof MimeMultipart) { MimeMultipart mimeMultipart = (MimeMultipart) m.getContent(); for (int i = 0; i < mimeMultipart.getCount(); i++) { log.info("----"); log.info(mimeMultipart.getBodyPart(i).getContentType() + ":\n"); log.info(mimeMultipart.getBodyPart(i).getContent()); } } else { log.info("\n" + m.getContent()); } log.info("-------------------------------------------------------"); } } } catch (IOException | InterruptedException | MessagingException ex) { throw new RuntimeException(ex); } } public static void start() { ServerSetup setup = new ServerSetup(Integer.parseInt(PORT), HOST, "smtp"); greenMail = new GreenMail(setup); greenMail.start(); log.info("Started mail server (" + HOST + ":" + PORT + ")"); } public static void stop() { if (greenMail != null) { log.info("Stopping mail server (localhost:3025)"); // Suppress error from GreenMail on shutdown Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() { @Override public void uncaughtException(Thread t, Throwable e) { if (!(e.getCause() instanceof SocketException && e.getStackTrace()[0].getClassName() .equals("com.icegreen.greenmail.smtp.SmtpHandler"))) { log.error("Exception in thread \"" + t.getName() + "\" "); log.error(e.getMessage(), e); } } }); greenMail.stop(); } } public static void createEmailAccount(String email, String password) { log.debug("Creating email account " + email); greenMail.setUser(email, password); } public static MimeMessage getLastReceivedMessage() throws InterruptedException { if (greenMail.waitForIncomingEmail(1)) { return greenMail.getReceivedMessages()[greenMail.getReceivedMessages().length - 1]; } return null; } }