blob: 1aee22da6b316740f6775afcfea3f1fb6979b3ee [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You 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.apache.geode.admin.jmx.internal;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashSet;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import org.apache.logging.log4j.Logger;
import org.apache.geode.SystemFailure;
import org.apache.geode.logging.internal.log4j.api.LogService;
/**
* Provides the ways to send emails to all the registered email id It also provides the way to
* add/remove email ids. Can be used to send email in case of any alerts raised / warning / failure
* in gemfire.
*
* @since GemFire 5.1
*/
public class MailManager {
private static final Logger logger = LogService.getLogger();
public MailManager() {}
public MailManager(Properties mailProperties) {
setMailProperties(mailProperties);
}
public MailManager(File mailPropertiesFile) throws IOException {
Properties prop = new Properties();
FileInputStream fio = new FileInputStream(mailPropertiesFile);
try {
prop.load(fio);
} finally {
fio.close();
}
setMailProperties(prop);
}
public MailManager(String mailHost, String mailFrom) {
this.mailHost = mailHost;
this.mailFrom = mailFrom;
}
/**
* Send email to all the registered email id with given subject and message
*/
public void sendEmail(String subject, String message) {
processEmail(new EmailData(subject, message));
}
/**
* Send Emails to all the registered email id
*
* @param emailData Instance of EmailData
*/
// Why a separate method & class EmailData needed???
private void processEmail(EmailData emailData) {
if (logger.isTraceEnabled()) {
logger.trace("Entered MailManager:processEmail");
}
if (mailHost == null || mailHost.length() == 0 || emailData == null
|| mailToAddresses.length == 0) {
logger.error("Required mail server configuration is not specfied.");
if (logger.isDebugEnabled()) {
logger.debug("Exited MailManager:processEmail: Not sending email as conditions not met");
}
return;
}
Session session = Session.getDefaultInstance(getMailHostConfiguration());
MimeMessage mimeMessage = new MimeMessage(session);
String subject = emailData.subject;
String message = emailData.message;
String mailToList = getMailToAddressesAsString();
try {
for (int i = 0; i < mailToAddresses.length; i++) {
mimeMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(mailToAddresses[i]));
}
if (subject == null) {
subject = "Alert from GemFire Admin Agent";
}
mimeMessage.setSubject(subject);
if (message == null) {
message = "";
}
mimeMessage.setText(message);
Transport.send(mimeMessage);
logger.info("Email sent to {}. Subject: {}, Content: {}",
new Object[] {mailToList, subject, message});
} catch (VirtualMachineError err) {
SystemFailure.initiateFailure(err);
// If this ever returns, rethrow the error. We're poisoned
// now, so don't let this thread continue.
throw err;
} catch (Throwable ex) {
// Whenever you catch Error or Throwable, you must also
// catch VirtualMachineError (see above). However, there is
// _still_ a possibility that you are dealing with a cascading
// error condition, so you also need to check to see if the JVM
// is still usable:
SystemFailure.checkFailure();
StringBuilder buf = new StringBuilder();
buf.append("An exception occurred while sending email.");
buf.append(
"Unable to send email. Please check your mail settings and the log file.");
buf.append("\n\n").append(
String.format("Exception message: %s", ex.getMessage()));
buf.append("\n\n").append(
"Following email was not delivered:");
buf.append("\n\t")
.append(String.format("Mail Host: %s", mailHost));
buf.append("\n\t").append(String.format("From: %s", mailFrom));
buf.append("\n\t").append(String.format("To: %s", mailToList));
buf.append("\n\t").append(String.format("Subject: %s", subject));
buf.append("\n\t").append(String.format("Content: %s", message));
logger.error(buf.toString(), ex);
}
if (logger.isTraceEnabled()) {
logger.trace("Exited MailManager:processEmail");
}
}
/**
* Not yet implemented
*/
public void close() {}
/**
* @return All the registered email id as string
*/
private String getMailToAddressesAsString() {
StringBuffer mailToList = new StringBuffer();
for (int i = 0; i < mailToAddresses.length; i++) {
mailToList.append(mailToAddresses[i]);
mailToList.append(", ");
}
return mailToList.toString();
}
/**
*
* @return Properties consisting mailHost and mailFrom property
*/
private Properties getMailHostConfiguration() {
Properties result = new Properties();
if (mailHost == null) {
mailHost = "";
}
if (mailFrom == null) {
mailFrom = "";
}
result.setProperty("mail.host", mailHost);
result.put("mail.from", mailFrom);
return result;
}
/**
*
* @param host mail host server name
*/
public void setMailHost(String host) {
this.mailHost = host;
}
/**
*
* @return mail host server name
*/
public String getMailHost() {
return this.mailHost;
}
/**
*
* @param fromAddress mailFrom email id
*/
public void setMailFromAddress(String fromAddress) {
mailFrom = fromAddress;
}
/**
*
* @return mailFrom email id
*/
public String getMailFromAddress() {
return mailFrom;
}
/**
* add new mail id to ToList
*/
public void addMailToAddress(String toAddress) {
mailToSet.add(toAddress);
mailToAddresses = getAllToAddresses();
}
/**
* remove given mail id from ToList
*/
public void removeMailToAddress(String toAddress) {
mailToSet.remove(toAddress);
mailToAddresses = getAllToAddresses();
}
/**
* @return list all the registered email id
*/
public String[] getAllToAddresses() {
return (String[]) mailToSet.toArray(new String[0]);
}
/**
* remove all the registered email ids from ToList
*/
public void removeAllMailToAddresses() {
mailToSet.clear();
mailToAddresses = new String[0];
}
/**
* Set the mail properties, e.g mail host, mailFrom, MailTo etc
*/
public void setMailProperties(Properties mailProperties) {
mailHost = mailProperties.getProperty(PROPERTY_MAIL_HOST);
mailFrom = mailProperties.getProperty(PROPERTY_MAIL_FROM);
String mailList = mailProperties.getProperty(PROPERTY_MAIL_TO_LIST, "");
String split[] = mailList.split(",");
removeAllMailToAddresses();
for (int i = 0; i < split.length; i++) {
addMailToAddress(split[i].trim());
}
}
@Override
public String toString() {
StringBuffer buffer = new StringBuffer(200);
buffer.append("[Mail Host: ");
buffer.append(getMailHost());
buffer.append("]");
buffer.append(" [Mail From: ");
buffer.append(getMailFromAddress());
buffer.append("]");
buffer.append(" [Mail To: ");
if (mailToAddresses.length > 0) {
for (int i = 0; i < mailToAddresses.length; i++) {
buffer.append(mailToAddresses[i]);
buffer.append(", ");
}
buffer.replace(buffer.length() - 2, buffer.length(), "");
} else {
buffer.append(" Undefined");
}
buffer.append("]");
return buffer.toString();
}
private HashSet mailToSet = new HashSet();
private String mailToAddresses[] = new String[0];
protected String mailHost;
protected String mailFrom;
public static final String PROPERTY_MAIL_HOST = "mail.host";
public static final String PROPERTY_MAIL_FROM = "mail.from";
public static final String PROPERTY_MAIL_TO_LIST = "mail.toList";
/**
* Incorporating subject and message of email
*
*
*/
private static class EmailData {
String subject;
String message;
EmailData(String subject, String message) {
this.subject = subject;
this.message = message;
}
}
public static void main(String args[]) {
MailManager mailManager = new MailManager("mailsrv1.gemstone.com", "hkhanna@gemstone.com");
mailManager.sendEmail("Alert!", "Test");
}
}