/*
* File : $Source: /alkacon/cvs/alkacon/com.alkacon.opencms.newsletter/src/com/alkacon/opencms/newsletter/CmsNewsletterMail.java,v $
* Date : $Date: 2010/10/14 13:17:49 $
* Version: $Revision: 1.13 $
*
* This file is part of the Alkacon OpenCms Add-On Module Package
*
* Copyright (c) 2007 Alkacon Software GmbH (http://www.alkacon.com)
*
* The Alkacon OpenCms Add-On Module Package is free software:
* you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Alkacon OpenCms Add-On Module Package 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with the Alkacon OpenCms Add-On Module Package.
* If not, see http://www.gnu.org/licenses/.
*
* For further information about Alkacon Software GmbH, please see the
* company website: http://www.alkacon.com.
*
* For further information about OpenCms, please see the
* project website: http://www.opencms.org.
*/
package com.alkacon.opencms.newsletter;
import org.opencms.mail.CmsSimpleMail;
import org.opencms.main.CmsLog;
import org.opencms.util.CmsStringUtil;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.mail.internet.InternetAddress;
import org.apache.commons.logging.Log;
import org.apache.commons.mail.Email;
/**
* Sends newsletter emails to users that are subscribed to the mailing list.<p>
*
* @author Andreas Zahner
*
* @version $Revision: 1.13 $
*
* @since 7.0.3
*/
public class CmsNewsletterMail extends Thread {
/** The log object for this class. */
private static final Log LOG = CmsLog.getLog(CmsNewsletterMail.class);
/** The email data to send. */
private I_CmsNewsletterMailData m_mailData;
/** The error messages thrown while sending the newsletter. */
private List<String> m_mailErrors;
/** The name of the newsletter to send. */
private String m_newsletterName;
/** The newsletter mail recipients of type {@link InternetAddress}. */
private List<InternetAddress> m_recipients;
/** The email address to send an error report to. */
private String m_reportRecipientAddress;
/**
* Constructor, with parameters.<p>
*
* @param mailData the email to send
* @param recipients the newsletter mail recipients
* @param reportRecipientAddress the email address to send a report to
* @param newsletterName the name of the newsletter to send
*/
public CmsNewsletterMail(
I_CmsNewsletterMailData mailData,
List<InternetAddress> recipients,
String reportRecipientAddress,
String newsletterName) {
m_mailData = mailData;
m_recipients = recipients;
m_reportRecipientAddress = reportRecipientAddress;
m_newsletterName = newsletterName;
m_mailErrors = new ArrayList<String>();
}
/**
* @see java.lang.Thread#run()
*/
@Override
public void run() {
try {
// send the newsletter mails
sendMail();
} catch (Throwable t) {
// general failure, log it and add detailed error message to report
if (LOG.isErrorEnabled()) {
LOG.error(
Messages.get().getBundle().key(Messages.LOG_ERROR_NEWSLETTER_SEND_FAILED_1, getNewsletterName()),
t);
}
getMailErrors().add(
0,
Messages.get().getBundle().key(
Messages.MAIL_ERROR_NEWSLETTER_SEND_FAILED_2,
getNewsletterName(),
t.getLocalizedMessage())
+ "\n");
}
if (!getMailErrors().isEmpty() && CmsStringUtil.isNotEmptyOrWhitespaceOnly(getReportRecipientAddress())) {
// there were errors found while sending the newsletter, send error report mail
CmsSimpleMail errorMail = new CmsSimpleMail();
try {
// set from address using the newsletter configuration
errorMail.setFrom(m_mailData.getEmail().getFromAddress().getAddress());
} catch (Exception e) {
// failed to set from address in error report mail
getMailErrors().add(
0,
Messages.get().getBundle().key(
Messages.MAIL_ERROR_EMAIL_FROM_ADDRESS_1,
m_mailData.getContent().getFile().getRootPath())
+ "\n");
}
try {
errorMail.addTo(getReportRecipientAddress());
errorMail.setSubject(Messages.get().getBundle().key(Messages.MAIL_ERROR_SUBJECT_1, getNewsletterName()));
// generate the error report mail content
StringBuffer msg = new StringBuffer(1024);
msg.append(Messages.get().getBundle().key(Messages.MAIL_ERROR_BODY_1, getNewsletterName()));
msg.append("\n\n");
for (Iterator<String> i = getMailErrors().iterator(); i.hasNext();) {
// loop the stored error messages
msg.append(i.next());
if (i.hasNext()) {
msg.append("\n");
}
}
errorMail.setMsg(msg.toString());
// send the error report mail
errorMail.send();
} catch (Throwable t) {
// failed to send error mail, log failure
if (LOG.isErrorEnabled()) {
LOG.error(
Messages.get().getBundle().key(
Messages.LOG_ERROR_MAIL_REPORT_FAILED_1,
getReportRecipientAddress()),
t);
}
}
}
}
/**
* Sends the newsletter mails to the recipients.<p>
*/
public void sendMail() {
Iterator<InternetAddress> i = getRecipients().iterator();
int errLogCount = 0;
while (i.hasNext()) {
InternetAddress to = i.next();
List<InternetAddress> toList = new ArrayList<InternetAddress>(1);
toList.add(to);
try {
Email mail = getMailData().getEmail();
mail.setTo(toList);
mail.send();
} catch (Exception e) {
// log failed mail send process
if (LOG.isErrorEnabled()) {
LOG.error(Messages.get().getBundle().key(
Messages.LOG_ERROR_NEWSLETTER_EMAIL_SEND_FAILED_2,
to.getAddress(),
getNewsletterName()));
}
if (LOG.isDebugEnabled() && (errLogCount < 10)) {
LOG.debug(e);
errLogCount++;
}
// store message for error report mail
String errMsg = Messages.get().getBundle().key(Messages.MAIL_ERROR_EMAIL_ADDRESS_1, to.getAddress());
if (errLogCount == 10) {
errMsg += "\nStack:\n" + errMsg + "\n";
}
getMailErrors().add(errMsg);
}
}
}
/**
* Returns the email data to send.<p>
*
* @return the email data to send
*/
private I_CmsNewsletterMailData getMailData() {
return m_mailData;
}
/**
* Returns the error messages thrown while sending the newsletter.<p>
*
* @return the error messages thrown while sending the newsletter
*/
private List<String> getMailErrors() {
return m_mailErrors;
}
/**
* Returns the name of the newsletter to send.<p>
*
* @return the name of the newsletter to send
*/
private String getNewsletterName() {
return m_newsletterName;
}
/**
* Returns the newsletter mail recipients of type {@link InternetAddress}.<p>
*
* @return the newsletter mail recipients
*/
private List<InternetAddress> getRecipients() {
return m_recipients;
}
/**
* Returns the email address to send an error report to.<p>
*
* @return the email address to send an error report to
*/
private String getReportRecipientAddress() {
return m_reportRecipientAddress;
}
}