/*
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*
* This 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 software 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 software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package com.celements.web.plugin.cmd;
import java.io.UnsupportedEncodingException;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.xwiki.component.annotation.Component;
import org.xwiki.component.annotation.InstantiationStrategy;
import org.xwiki.component.descriptor.ComponentInstantiationStrategy;
import org.xwiki.context.Execution;
import com.xpn.xwiki.XWikiContext;
import com.xpn.xwiki.api.Attachment;
import com.xpn.xwiki.plugin.mailsender.Mail;
import com.xpn.xwiki.plugin.mailsender.MailSenderPluginApi;
import com.xpn.xwiki.web.Utils;
/**
* Do not use this class directly. Instead use IMailSenderRole to send emails. In the
* future it is planned, that IMailSenderRole will buffer, store and allow to resent email
* messages, if temporary failure occur. You wont be able to take advantage from this
* features if you directly access IMailObjectRole.
*/
@Component
@InstantiationStrategy(ComponentInstantiationStrategy.PER_LOOKUP)
public class CelSendMail implements IMailObjectRole {
private static Log LOGGER = LogFactory.getFactory().getInstance(CelSendMail.class);
private Mail mail;
private CelMailConfiguration mailConfiguration;
private PlainTextCommand plainTextCmd = new PlainTextCommand();
/**
* @deprecated since 2.34.0 instead use new CelSendMail()
*/
@Deprecated
public CelSendMail(XWikiContext context) {
}
/**
* @deprecated since 2.67.0 instead use Component Manager access to IMailObjectRole
*/
@Deprecated
public CelSendMail() {
}
@Override
public void setFrom(String from) {
getMailObject().setFrom(from);
}
@Override
public void setReplyTo(String replyTo) {
if ((replyTo != null) && (replyTo.trim().length() > 0)) {
getMailObject().setHeader("reply-to", replyTo);
}
}
@Override
public void setTo(String to) {
getMailObject().setTo(to);
}
@Override
public void setCc(String cc) {
getMailObject().setCc(cc);
}
@Override
public void setBcc(String bcc) {
getMailObject().setBcc(bcc);
}
@Override
public void setSubject(String subject) {
getMailObject().setSubject(subject);
}
@Override
public CelMailConfiguration getMailConfiguration() {
if (mailConfiguration == null) {
mailConfiguration = new CelMailConfiguration();
}
return mailConfiguration;
}
@Override
public void setHtmlContent(String htmlContent, boolean isLatin1) {
// TODO Probabely can be removed as soon as all installations are on xwiki 2+
if (isLatin1) {
try {
getMailObject().setHtmlPart(new String(htmlContent.getBytes(), "ISO-8859-1"));
} catch (UnsupportedEncodingException e) {
getMailObject().setHtmlPart(htmlContent);
}
} else {
getMailObject().setHtmlPart(htmlContent);
}
if ((getMailObject().getTextPart() == null) || "".equals(
getMailObject().getTextPart().trim())) {
String textContent = getContext().getMessageTool().get("cel_plain_text_mail") + "\r\n\r\n";
textContent += plainTextCmd.convertToPlainText(htmlContent);
getMailObject().setTextPart(textContent);
}
}
@Override
public void setTextContent(String textContent) {
if ((textContent != null) && (!"".equals(textContent))) {
getMailObject().setTextPart(textContent);
}
}
@Override
public void setAttachments(List<Attachment> attachments) {
if (attachments == null) {
attachments = Collections.emptyList();
}
getMailObject().setAttachments(attachments);
}
@Override
public void setOthers(Map<String, String> others) {
if (others != null) {
for (String other : others.keySet()) {
getMailObject().setHeader(other, others.get(other));
}
}
}
// TODO check if minimum required fields are set?
@Override
public int sendMail() {
int sendResult = -999;
if (mail != null) {
LOGGER.trace("Sending Mail: \nfrom = '" + mail.getFrom() + "'\n" + "replyTo='" + mail.getTo()
+ "'\n" + "\n" + mail);
MailSenderPluginApi mailPlugin = (MailSenderPluginApi) getContext().getWiki().getPluginApi(
"mailsender", getContext());
sendResult = mailPlugin.sendMail(mail, getMailConfiguration());
LOGGER.info("Sent Mail from '" + mail.getFrom() + "' to '" + mail.getTo() + "'. Result was '"
+ sendResult + "'. Time: " + Calendar.getInstance().getTimeInMillis());
} else {
LOGGER.info("Mail Object is null. Send result was '" + sendResult + "'. Time: "
+ Calendar.getInstance().getTimeInMillis());
}
return sendResult;
}
Mail getMailObject() {
if (mail == null) {
mail = new Mail();
}
return mail;
}
void injectMail(Mail mail) {
this.mail = mail;
}
private XWikiContext getContext() {
return (XWikiContext) Utils.getComponent(Execution.class).getContext().getProperty(
"xwikicontext");
}
}