/*
* Copyright 2011-2012 the original author or authors.
*
* 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.vertx.mods;
import org.vertx.java.busmods.BusModBase;
import org.vertx.java.core.Handler;
import org.vertx.java.core.eventbus.Message;
import org.vertx.java.core.json.JsonArray;
import org.vertx.java.core.json.JsonObject;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Date;
import java.util.Properties;
/**
* Mailer Bus Module<p>
* Please see the busmods manual for a full description<p>
*
* @author <a href="http://tfox.org">Tim Fox</a>
*/
public class Mailer extends BusModBase implements Handler<Message<JsonObject>> {
private Session session;
private Transport transport;
private String address;
private boolean ssl;
private String host;
private int port;
private boolean auth;
private String username;
private String password;
@Override
public void start() {
super.start();
address = getOptionalStringConfig("address", "vertx.mailer");
ssl = getOptionalBooleanConfig("ssl", false);
host = getOptionalStringConfig("host", "localhost");
port = getOptionalIntConfig("port", 25);
auth = getOptionalBooleanConfig("auth", false);
username = getOptionalStringConfig("username", null);
password = getOptionalStringConfig("password", null);
eb.registerHandler(address, this);
Properties props = new Properties();
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.host", host);
props.put("mail.smtp.socketFactory.port", port);
if (ssl) {
props.put("mail.smtp.socketFactory.class",
"javax.net.ssl.SSLSocketFactory");
}
props.put("mail.smtp.socketFactory.fallback", false);
props.put("mail.smtp.auth", String.valueOf(auth));
//props.put("mail.smtp.quitwait", "false");
session = Session.getInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
//session.setDebug(true);
try {
transport = session.getTransport();
transport.connect();
} catch (MessagingException e) {
logger.error("Failed to setup mail transport", e);
}
}
@Override
public void stop() {
try {
transport.close();
} catch (MessagingException e) {
logger.error("Failed to stop mail transport", e);
}
}
private InternetAddress[] parseAddresses(Message<JsonObject> message, String fieldName,
boolean required)
{
Object oto = message.body.getField(fieldName);
if (oto == null) {
if (required) {
sendError(message, fieldName + " address(es) must be specified");
}
return null;
}
try {
InternetAddress[] addresses = null;
if (oto instanceof String) {
addresses = InternetAddress.parse((String)oto, true);
} else if (oto instanceof JsonArray) {
JsonArray loto = (JsonArray)oto;
addresses = new InternetAddress[loto.size()];
int count = 0;
for (Object addr: loto) {
if (addr instanceof String == false) {
sendError(message, "Invalid " + fieldName + " field");
return null;
}
InternetAddress[] ia = InternetAddress.parse((String)addr, true);
addresses[count++] = ia[0];
}
}
return addresses;
} catch (AddressException e) {
sendError(message, "Invalid " + fieldName + " field");
return null;
}
}
public void handle(Message<JsonObject> message) {
String from = message.body.getString("from");
if (from == null) {
sendError(message, "from address must be specified");
return;
}
InternetAddress fromAddress;
try {
fromAddress = new InternetAddress(from, true);
} catch (AddressException e) {
sendError(message, "Invalid from address: " + from, e);
return;
}
InternetAddress[] recipients = parseAddresses(message, "to", true);
if (recipients == null) {
return;
}
InternetAddress[] cc = parseAddresses(message, "cc", false);
InternetAddress[] bcc = parseAddresses(message, "bcc", false);
String subject = message.body.getString("subject");
if (subject == null) {
sendError(message, "subject must be specified");
return;
}
String body = message.body.getString("body");
if (body == null) {
sendError(message, "body must be specified");
return;
}
javax.mail.Message msg = new MimeMessage(session);
try {
msg.setFrom(fromAddress);
msg.setRecipients(javax.mail.Message.RecipientType.TO, recipients);
msg.setRecipients(javax.mail.Message.RecipientType.CC, cc);
msg.setRecipients(javax.mail.Message.RecipientType.BCC, bcc);
msg.setSubject(subject);
msg.setText(body);
msg.setSentDate(new Date());
transport.send(msg);
sendOK(message);
} catch (MessagingException e) {
sendError(message, "Failed to send message", e);
} catch (Throwable t) {
t.printStackTrace();
}
}
}