/**
* Copyright (c) 2000-present Liferay, 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 com.liferay.mail.messaging;
import com.liferay.mail.kernel.model.MailMessage;
import com.liferay.mail.util.HookFactory;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.messaging.BaseMessageListener;
import com.liferay.portal.kernel.messaging.Message;
import com.liferay.portal.kernel.security.auth.EmailAddressGenerator;
import com.liferay.portal.kernel.util.ArrayUtil;
import com.liferay.portal.kernel.util.MethodHandler;
import com.liferay.portal.security.auth.EmailAddressGeneratorFactory;
import com.liferay.portal.util.PropsValues;
import com.liferay.util.mail.MailEngine;
import java.util.ArrayList;
import java.util.List;
import javax.mail.internet.InternetAddress;
/**
* @author Brian Wing Shun Chan
* @author Wesley Gong
* @author Zsolt Balogh
*/
public class MailMessageListener extends BaseMessageListener {
protected void doMailMessage(MailMessage mailMessage) throws Exception {
InternetAddress from = filterInternetAddress(mailMessage.getFrom());
if (from == null) {
if (_log.isWarnEnabled()) {
_log.warn("Skipping email because the sender is not specified");
}
return;
}
mailMessage.setFrom(from);
InternetAddress[] to = filterInternetAddresses(mailMessage.getTo());
mailMessage.setTo(to);
InternetAddress[] cc = filterInternetAddresses(mailMessage.getCC());
mailMessage.setCC(cc);
InternetAddress[] bcc = filterInternetAddresses(mailMessage.getBCC());
InternetAddress[] auditTrail = InternetAddress.parse(
PropsValues.MAIL_AUDIT_TRAIL);
if (auditTrail.length > 0) {
if (ArrayUtil.isNotEmpty(bcc)) {
for (InternetAddress internetAddress : auditTrail) {
bcc = ArrayUtil.append(bcc, internetAddress);
}
}
else {
bcc = auditTrail;
}
}
mailMessage.setBCC(bcc);
InternetAddress[] bulkAddresses = filterInternetAddresses(
mailMessage.getBulkAddresses());
mailMessage.setBulkAddresses(bulkAddresses);
InternetAddress[] replyTo = filterInternetAddresses(
mailMessage.getReplyTo());
mailMessage.setReplyTo(replyTo);
if (ArrayUtil.isNotEmpty(to) || ArrayUtil.isNotEmpty(cc) ||
ArrayUtil.isNotEmpty(bcc) || ArrayUtil.isNotEmpty(bulkAddresses)) {
MailEngine.send(mailMessage);
}
}
protected void doMethodHandler(MethodHandler methodHandler)
throws Exception {
methodHandler.invoke(HookFactory.getInstance());
}
@Override
protected void doReceive(Message message) throws Exception {
Object payload = message.getPayload();
if (payload instanceof MailMessage) {
doMailMessage((MailMessage)payload);
}
else if (payload instanceof MethodHandler) {
doMethodHandler((MethodHandler)payload);
}
}
protected InternetAddress filterInternetAddress(
InternetAddress internetAddress) {
EmailAddressGenerator emailAddressGenerator =
EmailAddressGeneratorFactory.getInstance();
if (emailAddressGenerator.isFake(internetAddress.getAddress())) {
return null;
}
return internetAddress;
}
protected InternetAddress[] filterInternetAddresses(
InternetAddress[] internetAddresses) {
if (internetAddresses == null) {
return null;
}
List<InternetAddress> filteredInternetAddresses = new ArrayList<>(
internetAddresses.length);
for (InternetAddress internetAddress : internetAddresses) {
InternetAddress filteredInternetAddress = filterInternetAddress(
internetAddress);
if (filteredInternetAddress != null) {
filteredInternetAddresses.add(filteredInternetAddress);
}
}
return filteredInternetAddresses.toArray(
new InternetAddress[filteredInternetAddresses.size()]);
}
private static final Log _log = LogFactoryUtil.getLog(
MailMessageListener.class);
}