// ---------------------------------------------------------------------------
// jWebSocket - jWebSocket SMTP Plug-In
// Copyright (c) 2010 Innotrade GmbH, jWebSocket.org
// ---------------------------------------------------------------------------
// THIS CODE IS FOR RESEARCH, EVALUATION AND TEST PURPOSES ONLY!
// THIS CODE MAY BE SUBJECT TO CHANGES WITHOUT ANY NOTIFICATION!
// ---------------------------------------------------------------------------
// This program is free software; you can redistribute it and/or modify it
// under the terms of the GNU Lesser 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 Lesser General Public License for
// more details.
// You should have received a copy of the GNU Lesser General Public License along
// with this program; if not, see <http://www.gnu.org/licenses/lgpl.html>.
// ---------------------------------------------------------------------------
package org.jwebsocket.plugins.mail;
import java.util.List;
import java.util.Map;
import javolution.util.FastList;
import javolution.util.FastMap;
import org.apache.commons.mail.Email;
import org.apache.commons.mail.EmailAttachment;
import org.apache.commons.mail.HtmlEmail;
import org.apache.commons.mail.MultiPartEmail;
import org.apache.log4j.Logger;
import org.jwebsocket.api.PluginConfiguration;
import org.jwebsocket.api.WebSocketConnector;
import org.jwebsocket.config.JWebSocketServerConstants;
import org.jwebsocket.kit.PlugInResponse;
import org.jwebsocket.logging.Logging;
import org.jwebsocket.plugins.TokenPlugIn;
import org.jwebsocket.server.TokenServer;
import org.jwebsocket.token.Token;
/**
*
* @author aschulze
*/
public class MailPlugIn extends TokenPlugIn {
private static Logger mLog = Logging.getLogger(MailPlugIn.class);
private static String SMTP_HOST = null;
private static final String SMTP_HOST_KEY = "smtp_host";
private static Integer SMTP_PORT = -1;
private static final String SMTP_PORT_KEY = "smtp_port";
private static Boolean SMTP_AUTH = false;
private static final String SMTP_AUTH_KEY = "smtp_auth";
private static String SMTP_USER = null;
private static final String SMTP_USER_KEY = "smtp_user";
private static String SMTP_PASSWORD = null;
private static final String SMTP_PASSWORD_KEY = "smtp_password";
private static Boolean SMTP_POP3BEFORE = false;
private static final String SMTP_POP3BEFORE_KEY = "smtp_pop3before";
private static String POP3_HOST = null;
private static final String POP3_HOST_KEY = "pop3_host";
private static Integer POP3_PORT = -1;
private static final String POP3_PORT_KEY = "pop3_port";
private static String POP3_USER = null;
private static String POP3_USER_KEY = "pop3_user";
private static String POP3_PASSWORD = null;
private static String POP3_PASSWORD_KEY = "pop3_password";
// if namespace changed update client plug-in accordingly!
private static final String NS_MAIL = JWebSocketServerConstants.NS_BASE + ".plugins.mail";
public MailPlugIn() {
super(null);
}
public MailPlugIn(PluginConfiguration aConfiguration) {
super(aConfiguration);
if (mLog.isDebugEnabled()) {
mLog.debug("Instantiating mail plug-in...");
}
// specify default name space for admin plugin
this.setNamespace(NS_MAIL);
mGetSettings();
}
private void mGetSettings() {
SMTP_HOST = getSetting(SMTP_HOST_KEY, null);
SMTP_PORT = Integer.parseInt(getSetting(SMTP_PORT_KEY, "25"));
SMTP_AUTH = getSetting(SMTP_AUTH_KEY, "false").equals("true");
SMTP_USER = getSetting(SMTP_USER_KEY, null);
SMTP_PASSWORD = getSetting(SMTP_PASSWORD_KEY, null);
SMTP_POP3BEFORE = getSetting(SMTP_POP3BEFORE_KEY, "false").equals("true");
POP3_HOST = getSetting(POP3_HOST_KEY, null);
POP3_PORT = Integer.parseInt(getSetting(POP3_PORT_KEY, "110"));
POP3_USER = getSetting(POP3_USER_KEY, null);
POP3_PASSWORD = getSetting(POP3_PASSWORD_KEY, null);
}
@Override
public void processToken(PlugInResponse aResponse,
WebSocketConnector aConnector, Token aToken) {
String lType = aToken.getType();
String lNS = aToken.getNS();
if (lType != null && getNamespace().equals(lNS)) {
// select from database
if (lType.equals("sendMail")) {
sendMail(aConnector, aToken);
}
}
}
private void sendMail(WebSocketConnector aConnector, Token aToken) {
TokenServer lServer = getServer();
String lFrom = aToken.getString("from", "[unknown]");
String lTo = aToken.getString("to");
String lCC = aToken.getString("cc");
String lBCC = aToken.getString("bcc");
String lSubject = aToken.getString("subject");
String lBody = aToken.getString("body");
Boolean lIsHTML = aToken.getBoolean("html", false);
// instantiate response token
Token lResponse = lServer.createResponse(aToken);
Map lMap = new FastMap();
if (lFrom != null && lFrom.length() > 0) {
lMap.put("from", lFrom);
}
if (lTo != null && lTo.length() > 0) {
lMap.put("to", lTo);
}
if (lCC != null && lCC.length() > 0) {
lMap.put("cc", lCC);
}
if (lBCC != null && lBCC.length() > 0) {
lMap.put("bcc", lBCC);
}
if (lSubject != null && lSubject.length() > 0) {
lMap.put("subject", lSubject);
}
if (lBody != null && lBody.length() > 0) {
lMap.put("body", lBody);
}
// Create the attachment
List<EmailAttachment> lAttachments = new FastList<EmailAttachment>();
/*
if( aAttachments != null ) {
for( int lIdx = 0; lIdx < aAttachments.length; lIdx++ ) {
EmailAttachment lAttachment = new EmailAttachment();
lAttachment.setPath( aAttachments[ lIdx ] );
lAttachment.setDisposition( EmailAttachment.ATTACHMENT );
// lAttachment.setDescription( "Picture of John" );
// lAttachment.setName( "John" );
lAttachments.add( lAttachment );
}
}
*/
// Create the lEmail message
if (mLog.isDebugEnabled()) {
mLog.debug("Sending e-mail to " + lTo + " with subject '" + lSubject + "'...");
}
try {
Email lEmail;
if (lIsHTML) {
lEmail = new HtmlEmail();
} else {
lEmail = new MultiPartEmail();
}
lEmail.setHostName(SMTP_HOST);
lEmail.setSmtpPort(SMTP_PORT);
if (SMTP_AUTH) {
lEmail.setAuthentication(
SMTP_USER,
SMTP_PASSWORD);
}
if (SMTP_POP3BEFORE) {
lEmail.setPopBeforeSmtp(
true,
POP3_HOST,
POP3_USER,
POP3_PASSWORD);
}
if (lFrom != null && lFrom.length() > 0) {
lEmail.setFrom(lFrom);
}
if (lTo != null && lTo.length() > 0) {
lEmail.addTo(lTo);
}
if (lSubject != null && lSubject.length() > 0) {
lEmail.setSubject(lSubject);
}
if (lBody != null && lBody.length() > 0) {
if (lIsHTML) {
HtmlEmail lHTML = ((HtmlEmail) lEmail);
/*
URL lURL = new URL("http://five-feet-further.com/aschulze/images/portrait_web_kleiner.jpg");
String lCID = ((HtmlEmail )lEmail).embed(lURL, "five feet further logo");
//url = new URL( "http://five-feet-further.com/resources/css/IJX4FWDocu.css" );
// String css = ((HtmlEmail)lEmail).embed( url, "name of css" );
((HtmlEmail )lEmail).setHtmlMsg(
"<html><body>" +
"<style type=\"text/css\">" +
"h1 { " +
" font-family:arial, helvetica, sans-serif;" +
" font-weight:bold;" +
" font-size:18pt;" +
"}" +
"</style>" +
// "<link href=\"cid:" + css + "\" type=\"text/css\" rel=\"stylesheet\">" +
"<p><img src=\"cid:" + lCID + "\"></p>" +
"<p><img src=\"http://five-feet-further.com/aschulze/images/portrait_web_kleiner.jpg\"></p>" +
lItem +
"</body></html>");
*/
/*
// Now the message body.
Multipart mp = new MimeMultipart();
BodyPart textPart = new MimeBodyPart();
// sets type to "text/plain"
textPart.setText("Kann Ihr Browser keine HTML-Mails darstellen?");
BodyPart pixPart = new MimeBodyPart();
pixPart.setContent(lMsg, "text/html");
// Collect the Parts into the MultiPart
mp.addBodyPart(textPart);
mp.addBodyPart(pixPart);
// Put the MultiPart into the Message
((HtmlEmail) lEmail).setContent((MimeMultipart)mp);
((HtmlEmail) lEmail).buildMimeMessage();
/*
// ((HtmlEmail) lEmail).setContent(lMsg, Email.TEXT_HTML);
// lHeaders.put("Innotrade-Id", "4711-0815");
// lHTML.setHeaders(lHeaders);
// ((HtmlEmail) lEmail).setCharset("UTF-8");
// ((HtmlEmail) lEmail).setMsg(lMsg);
lMM.setHeader("Innotrade-Id", "4711-0815");
// ((HtmlEmail) lEmail).setContent(lTxtMsg, Email.TEXT_PLAIN);
*/
// String lTxtMsg = "Your Email-Client does not support HTML messages.";
lHTML.setHtmlMsg(lBody);
// lHTML.setTextMsg(lTxtMsg);
} else {
lEmail.setMsg(lBody);
}
}
// add attachment(s), if such
for (EmailAttachment lAttachment : lAttachments) {
((MultiPartEmail) lEmail).attach(lAttachment);
}
for (int lIdx = 0; lIdx < lAttachments.size(); lIdx++) {
((MultiPartEmail) lEmail).attach(
(EmailAttachment) lAttachments.get(lIdx));
}
// send the Email
String lMsgId = lEmail.send();
if (mLog.isInfoEnabled()) {
mLog.info(
"Email successfully sent"
+ " from " + (lFrom != null ? lFrom : "(no sender)")
+ " to " + (lTo != null ? lTo : "(no receipient)")
+ ", subject " + (lSubject != null ? "'" + lSubject + "'" : "(no subject)")
+ ", Id " + lMsgId);
}
lResponse.setString("id", lMsgId);
} catch (Exception lEx) {
String lMsg = lEx.getClass().getSimpleName() + ": " + lEx.getMessage();
mLog.error(lMsg);
lResponse.setInteger("code", -1);
lResponse.setString("msg", lMsg);
}
// send response to requester
lServer.sendToken(aConnector, lResponse);
}
}