/*
Copyright (c) 2003 eInnovation Inc. All rights reserved
This library 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 2.1 of the License, or (at your option) any later version.
This library 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.
*/
package org.entermedia.email;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Message.RecipientType;
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.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.openedit.ModuleManager;
import com.openedit.OpenEditRuntimeException;
import com.openedit.page.manage.PageManager;
public class PostMail
{
private static final Log log = LogFactory.getLog(PostMail.class);
protected String fieldSmtpUsername;
protected String fieldSmtpPassword;
protected String fieldSmtpServer = "localhost";
protected Integer fieldPort;
protected boolean fieldSmtpSecured = false;
protected PageManager fieldPageManager;
protected boolean fieldSslEnabled = false;
protected ModuleManager fieldModuleManager;
public ModuleManager getModuleManager()
{
return fieldModuleManager;
}
public void setModuleManager(ModuleManager inModuleManager)
{
fieldModuleManager = inModuleManager;
}
public PageManager getPageManager()
{
return fieldPageManager;
}
public void setPageManager(PageManager inPageManager)
{
fieldPageManager = inPageManager;
}
public String getSmtpPassword()
{
return fieldSmtpPassword;
}
public void setSmtpPassword(String inSmtpPassword)
{
this.fieldSmtpPassword = inSmtpPassword;
}
public boolean isSmtpSecured()
{
return fieldSmtpSecured;
}
public void setSmtpSecured(boolean inSmtpSecured)
{
this.fieldSmtpSecured = inSmtpSecured;
}
public String getSmtpUsername()
{
return fieldSmtpUsername;
}
public void setSmtpUsername(String inSmtpUsername)
{
this.fieldSmtpUsername = inSmtpUsername;
}
public void postMail(String recipient, String subject, String message, String from) throws MessagingException
{
postMail(new String[] { recipient }, subject, message, null, from);
}
// returns a new template web email instance preconfigured with spring
// settings.
public TemplateWebEmail getTemplateWebEmail()
{
TemplateWebEmail email = null;
if (getModuleManager() != null)
{
email = (TemplateWebEmail) getModuleManager().getBean("templateWebEmail");//from spring
}
if (email == null)
{
email = new TemplateWebEmail();
}
email.setPostMail(this);
email.setPageManager(getPageManager());
return email;
}
public void postMail(String[] recipients, String subject, String inHtml, String inText, String from) throws MessagingException
{
postMail(parseEmails(recipients), subject, inHtml, inText, from, null, null);
}
public List<InternetAddress> parseEmails(String[] inEmails)
{
List emails = new ArrayList<InternetAddress>();
for (int i = 0; i < inEmails.length; i++)
{
try
{
InternetAddress[] inet = InternetAddress.parse(inEmails[i]);
for (int j = 0; j < inet.length; j++)
{
emails.add(inet[i]);
}
}
catch( AddressException ex)
{
//ignore
log.error("Could not process email " + inEmails[i], ex);
}
}
return emails;
}
public void postMail(List<InternetAddress> recipients, String subject, String inHtml, String inText, String from, List inAttachments, Map inProperties) throws MessagingException
{
postMail(recipients, null, subject, inHtml, inText, from, inAttachments, inProperties);
}
public void postMail(List<InternetAddress> recipients, List<InternetAddress> blindrecipients, String subject, String inHtml, String inText, String from, List inAttachments, Map inProperties) throws MessagingException
{
// Set the host smtp address
Properties props = new Properties();
// create some properties and get the default Session
props.put("mail.smtp.host", fieldSmtpServer);
props.put("mail.smtp.port", String.valueOf(getPort()));
props.put("mail.smtp.auth", new Boolean(fieldSmtpSecured).toString());
if (isSslEnabled())
{
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
}
Session session;
// If we need to authenticate, create the authenticator
if (fieldSmtpSecured)
{
SmtpAuthenticator auth = new SmtpAuthenticator();
session = Session.getInstance(props, auth);
}
else
{
session = Session.getInstance(props);
}
// session.setDebug(debug);
// create a message
Message msg = new MimeMessage(session);
MimeMultipart mp = null;
// msg.setDataHandler(new DataHandler(new ByteArrayDataSource(message,
// "text/html")));
if (inAttachments != null && inAttachments.size() == 0)
{
inAttachments = null;
}
if (inText != null && inHtml != null || inAttachments != null)
{
// Create an "Alternative" Multipart message
mp = new MimeMultipart("mixed");
if (inText != null)
{
BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setContent(inText, "text/plain");
mp.addBodyPart(messageBodyPart);
}
if (inHtml != null)
{
BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setContent(inHtml, "text/html");
mp.addBodyPart(messageBodyPart);
}
if (inAttachments != null)
{
for (Iterator iterator = inAttachments.iterator(); iterator.hasNext();)
{
String filename = (String) iterator.next();
File file = new File(filename);
if (file.exists() && !file.isDirectory())
{
// create the second message part
MimeBodyPart mbp = new MimeBodyPart();
FileDataSource fds = new FileDataSource(file);
mbp.setDataHandler(new DataHandler(fds));
mbp.setFileName(fds.getName());
mp.addBodyPart(mbp);
}
}
}
msg.setContent(mp);
}
else if (inHtml != null)
{
msg.setContent(inHtml, "text/html");
}
else
{
msg.setContent(inText, "text/plain");
}
// set the from and to address
InternetAddress addressFrom = new InternetAddress(from);
msg.setFrom(addressFrom);
//msg.setRecipient(RecipientType.BCC, addressFrom);
msg.setSentDate(new Date());
if (recipients == null || recipients.isEmpty() )
{
throw new MessagingException("No recipients specified");
}
InternetAddress[] addressTo = recipients.toArray(new InternetAddress[recipients.size()]);
msg.setRecipients(Message.RecipientType.TO, addressTo);
//add bcc
if (blindrecipients != null && blindrecipients.isEmpty())
{
InternetAddress[] addressBcc = blindrecipients.toArray(new InternetAddress[blindrecipients.size()]);
msg.setRecipients(Message.RecipientType.BCC, addressBcc);
}
// Optional : You can also set your custom headers in the Email if you
// Want
// msg.addHeader("MyHeaderName", "myHeaderValue");
// Setting the Subject and Content Type
msg.setSubject(subject);
// Transport tr = session.getTransport("smtp");
// tr.connect(serverandport[0], null, null);
// msg.saveChanges(); // don't forget this
// tr.sendMessage(msg, msg.getAllRecipients());
// tr.close();
// msg.setContent(msg, "text/plain");
Transport.send(msg);
log.info("sent email " + subject);
}
public int getPort()
{
if (fieldPort == null)
{
fieldPort = Integer.getInteger("mail.smtp.port");
if (fieldPort == null)
{
fieldPort = new Integer(25);
}
}
return fieldPort;
}
public void setPort(int inPort)
{
this.fieldPort = new Integer(inPort);
}
public void setPort(Integer inPort)
{
this.fieldPort = inPort;
}
public String getSmtpServer()
{
return fieldSmtpServer;
}
public void setSmtpServer(String inSmtpServer)
{
this.fieldSmtpServer = inSmtpServer;
}
public class SmtpAuthenticator extends javax.mail.Authenticator
{
public javax.mail.PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication(fieldSmtpUsername, fieldSmtpPassword);
}
}
public boolean isSslEnabled()
{
return fieldSslEnabled;
}
public void setSslEnabled(boolean inSslEnabled)
{
fieldSslEnabled = inSslEnabled;
}
public InternetAddress parseEmail(String inValue)
{
try
{
InternetAddress inet = new InternetAddress(inValue);
return inet;
}
catch (AddressException ex)
{
//ignore
log.error("Could not process email " + inValue, ex);
}
return null;
}
}