/* * RapidMiner * * Copyright (C) 2001-2014 by RapidMiner and the contributors * * Complete list of developers available at our web site: * * http://rapidminer.com * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see http://www.gnu.org/licenses/. */ package com.rapidminer.operator.tools; import java.util.HashMap; import java.util.List; import java.util.Map; import com.rapidminer.RapidMiner; import com.rapidminer.operator.MailNotSentException; import com.rapidminer.operator.Operator; import com.rapidminer.operator.OperatorDescription; import com.rapidminer.operator.OperatorException; import com.rapidminer.operator.OperatorVersion; import com.rapidminer.operator.ProcessSetupError.Severity; import com.rapidminer.operator.SimpleProcessSetupError; import com.rapidminer.operator.UserError; import com.rapidminer.operator.ports.DummyPortPairExtender; import com.rapidminer.parameter.ParameterType; import com.rapidminer.parameter.ParameterTypeBoolean; import com.rapidminer.parameter.ParameterTypeList; import com.rapidminer.parameter.ParameterTypeString; import com.rapidminer.parameter.ParameterTypeText; import com.rapidminer.parameter.TextType; import com.rapidminer.parameter.conditions.AboveOperatorVersionCondition; import com.rapidminer.parameter.conditions.BooleanParameterCondition; import com.rapidminer.tools.MailUtilities; import com.rapidminer.tools.ParameterService; /** * * @author Simon Fischer, Nils Woehler * */ public class SendMailOperator extends Operator { public static final OperatorVersion VERSION_SWAPPED_INPUT_PORTS = new OperatorVersion(5, 2, 6); private DummyPortPairExtender through = new DummyPortPairExtender("through", getInputPorts(), getOutputPorts()); public static final String PARAMETER_TO = "to"; public static final String PARAMETER_SUBJECT = "subject"; public static final String PARAMETER_BODY_PLAIN = "body_plain"; public static final String PARAMETER_BODY_HTML = "body_html"; public static final String PARAMETER_USE_HTML = "use_html"; public static final String PARAMETER_HEADERS = "headers"; public static final String PARAMETER_THROW_ERROR = "ignore_errors"; public SendMailOperator(OperatorDescription description) { super(description); through.start(); getTransformer().addRule(through.makePassThroughRule()); } @Override protected void performAdditionalChecks() { super.performAdditionalChecks(); String method = ParameterService.getParameterValue(RapidMiner.PROPERTY_RAPIDMINER_TOOLS_MAIL_METHOD); if (method.equals(RapidMiner.PROPERTY_RAPIDMINER_TOOLS_MAIL_METHOD_VALUES[0])) { // sendmail String command = ParameterService.getParameterValue(RapidMiner.PROPERTY_RAPIDMINER_TOOLS_SENDMAIL_COMMAND); if (command == null || command.equals("")) { addError(new SimpleProcessSetupError(Severity.WARNING, getPortOwner(), "no_send_mail_command")); } } else if (method.equals(RapidMiner.PROPERTY_RAPIDMINER_TOOLS_MAIL_METHOD_VALUES[1])) { //smtp String user = ParameterService.getParameterValue(RapidMiner.PROPERTY_RAPIDMINER_TOOLS_SMTP_USER); if (user == null || user.equals("")) { addError(new SimpleProcessSetupError(Severity.WARNING, getPortOwner(), "no_smtp_mail_user_set")); } String passwd = ParameterService.getParameterValue(RapidMiner.PROPERTY_RAPIDMINER_TOOLS_SMTP_PASSWD); if (passwd == null || passwd.equals("")) { addError(new SimpleProcessSetupError(Severity.WARNING, getPortOwner(), "no_smtp_mail_passwd_set")); } String host = ParameterService.getParameterValue(RapidMiner.PROPERTY_RAPIDMINER_TOOLS_SMTP_HOST); if (host == null || host.equals("")) { addError(new SimpleProcessSetupError(Severity.WARNING, getPortOwner(), "no_smtp_mail_host_set")); } String port = ParameterService.getParameterValue(RapidMiner.PROPERTY_RAPIDMINER_TOOLS_SMTP_PORT); if (port == null || port.equals("")) { addError(new SimpleProcessSetupError(Severity.WARNING, getPortOwner(), "no_smtp_mail_port_set")); } } } @Override public void doWork() throws OperatorException { String to = getParameterAsString(PARAMETER_TO); String subject = getParameterAsString(PARAMETER_SUBJECT); Map<String, String> headers = new HashMap<String, String>(); for (String[] entry : getParameterList(PARAMETER_HEADERS)) { headers.put(entry[0], entry[1]); } String body; if (getParameterAsBoolean(PARAMETER_USE_HTML)) { body = getParameterAsString(PARAMETER_BODY_HTML); headers.put("Content-Type", "text/html"); } else { body = getParameterAsString(PARAMETER_BODY_PLAIN); } if (getCompatibilityLevel().isAtMost(VERSION_SWAPPED_INPUT_PORTS)) { MailUtilities.sendEmail(to, subject, body, headers); } else { if (!getParameterAsBoolean(PARAMETER_THROW_ERROR)) { try { MailUtilities.sendEmailWithException(to, subject, body, headers); } catch (MailNotSentException e) { throw new UserError(this, e.getCause(), e.getErrorKey(), e.getArguments()); } } else { MailUtilities.sendEmail(to, subject, body, headers); } } through.passDataThrough(); } @Override public List<ParameterType> getParameterTypes() { final List<ParameterType> types = super.getParameterTypes(); types.add(new ParameterTypeString(PARAMETER_TO, "Receiver of the email.", false, false)); types.add(new ParameterTypeString(PARAMETER_SUBJECT, "Subject the email.", false, false)); types.add(new ParameterTypeBoolean(PARAMETER_USE_HTML, "Format text as HTML?.", false, false)); ParameterType type = new ParameterTypeText(PARAMETER_BODY_PLAIN, "Body of the email.", TextType.PLAIN, false); type.registerDependencyCondition(new BooleanParameterCondition(this, PARAMETER_USE_HTML, false, false)); type.setExpert(false); types.add(type); type = new ParameterTypeText(PARAMETER_BODY_HTML, "Body of the email in HTML format.", TextType.HTML, "<html>\n" + " <head>\n" + " <title>RapidMiner Mail Message</title>\n" + " </head>\n" + " <body>\n" + " <p>\n" + " </p>\n" + " </body>\n" + "</html>\n"); type.registerDependencyCondition(new BooleanParameterCondition(this, PARAMETER_USE_HTML, false, true)); type.setExpert(false); types.add(type); type = new ParameterTypeList(PARAMETER_HEADERS, "Additional mail headers", new ParameterTypeString("header", "Name of the header"), new ParameterTypeString("value", "value of the header")); type.setExpert(true); types.add(type); type = new ParameterTypeBoolean(PARAMETER_THROW_ERROR, "If set errors will be logged only. Otherwise the process will be stopped and an error will be shown.", false); type.setExpert(false); types.add(type); type.registerDependencyCondition(new AboveOperatorVersionCondition(this, VERSION_SWAPPED_INPUT_PORTS)); return types; } @Override public OperatorVersion[] getIncompatibleVersionChanges() { return new OperatorVersion[] { VERSION_SWAPPED_INPUT_PORTS }; } }