/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.mail.internal; import java.util.ArrayList; import java.util.Collection; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import jodd.mail.EmailAddress; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import de.rcenvironment.core.command.common.CommandException; import de.rcenvironment.core.command.spi.CommandContext; import de.rcenvironment.core.command.spi.CommandDescription; import de.rcenvironment.core.command.spi.CommandPlugin; import de.rcenvironment.core.mail.InvalidMailException; import de.rcenvironment.core.mail.Mail; import de.rcenvironment.core.mail.MailDispatchResult; import de.rcenvironment.core.mail.MailDispatchResultListener; import de.rcenvironment.core.mail.MailService; import de.rcenvironment.core.utils.common.StringUtils; /** * A {@link CommandPlugin} providing a mail command to send mails from the command console. * * @author Tobias Rodehutskors */ public class MailCommandPlugin implements CommandPlugin { private static final String PERM_FAILURE = "Unable to delivered the mail to the mail server. Most likely the SMTP server configuration is wrong: %s"; private static final String CMD_MAIL = "mail"; private Log log = LogFactory.getLog(MailCommandPlugin.class); private MailService mailService; protected void bindMailService(MailService service) { this.mailService = service; } @Override public void execute(final CommandContext context) throws CommandException { context.consumeExpectedToken(CMD_MAIL); if (!mailService.isConfigured()) { context.println("The SMTP mail server is not configured or invalid configured."); // ignore additional tokens context.consumeRemainingTokens(); return; } String recipient = context.consumeNextToken(); if (recipient == null || !(new EmailAddress(recipient).isValid())) { throw CommandException.syntaxError("You need to specify a valid mail address as the recipient.", context); } String subject = context.consumeNextToken(); if (subject == null) { throw CommandException.syntaxError("You need to specify a subject.", context); } String body = context.consumeNextToken(); if (body == null) { throw CommandException.syntaxError("You need the message body.", context); } // ignore additional tokens context.consumeRemainingTokens(); Mail validatedMail; try { validatedMail = Mail.createMail(new String[] { recipient }, subject, body, null); } catch (InvalidMailException e) { // unlikely that this is going to happen, since we already have validated the input throw CommandException.executionError(e.getMessage(), context); } Future<?> sendMailFuture = mailService.sendMail(validatedMail, new MailDispatchResultListener() { @Override public void receiveResult(MailDispatchResult result, String message) { switch (result) { case SUCCESS: context.println("Successfully delivered the mail to the mail server."); break; case FAILURE: context.println(StringUtils.format(PERM_FAILURE, message)); break; case FAILURE_RETRY: context.println("Unable to delivered the mail to the mail server. Retrying..."); break; default: log.warn("Received unexpected result from the mail service."); break; } } }); try { sendMailFuture.get(); } catch (InterruptedException | ExecutionException e) { log.error(e); throw CommandException.executionError(e.getMessage(), context); } } @Override public Collection<CommandDescription> getCommandDescriptions() { final Collection<CommandDescription> contributions = new ArrayList<CommandDescription>(); contributions.add(new CommandDescription(CMD_MAIL, "<recipient> <subject> <body>", false, "Sends an email.", "<recipient> - The recipient to whom the mail should be addressed.", "<subject> - The subject of the mail.", "<body> - The mail body.")); return contributions; } }