package mireka.forward;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import mireka.destination.MailDestination;
import mireka.smtp.RejectExceptionExt;
import mireka.transmission.LocalMailSystemException;
import mireka.transmission.Mail;
import mireka.transmission.Transmitter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* ForwardDestination redistributes mail to multiple recipients without changing
* the reverse path.
*
* @see <a href="http://tools.ietf.org/html/rfc5321#section-3.9">RFC 5321 3.9
* Mailing Lists and Aliases</a>
*/
public class ForwardDestination implements MailDestination {
private Logger logger = LoggerFactory.getLogger(ForwardDestination.class);
/**
* Mails sent to {@link #address} will be redistributed to the member
* addresses in this list.
*/
private final List<Member> members = new ArrayList<Member>();
/**
* The transmitter which will be used to redistribute the incoming mail to
* the members.
*/
private Transmitter transmitter;
private Srs srs;
@Override
public void data(Mail mail) throws RejectExceptionExt {
forward(mail);
}
/**
* Processes the message.
*/
public void forward(Mail srcMail) throws RejectExceptionExt {
logger.debug("Mail is received for {} from {}", toString(), srcMail);
if (members.isEmpty()) {
logger.debug("Forward list has no members, dropping mail");
return;
}
Mail mail = srcMail.copy();
mail.recipients.clear();
for (Member member : members) {
if (member.isDisabled())
continue;
mail.recipients.add(member.getRecipient());
}
try {
mail.from = srs.forward(mail.from, srcMail.recipients.get(0));
transmitter.transmit(mail);
logger.debug("Forward list mail was submitted to transmitter: {}",
mail);
} catch (LocalMailSystemException e) {
logger.error("Cannot transmit mail", e);
throw new RejectExceptionExt(e.errorStatus());
}
}
/**
* @x.category GETSET
*/
public void setMembers(List<Member> members) {
this.members.clear();
this.members.addAll(members);
}
/**
* @x.category GETSET
*/
@Inject
public void setTransmitter(Transmitter transmitter) {
this.transmitter = transmitter;
}
/**
* @x.category GETSET
*/
@Inject
public void setSrs(Srs srs) {
this.srs = srs;
}
@Override
public String toString() {
StringBuilder buffer = new StringBuilder();
if (members.size() >= 1)
buffer.append(members.get(0));
if (members.size() >= 2)
buffer.append(", ").append(members.get(1));
if (members.size() >= 3)
buffer.append(", …");
return "ForwardDestination [" + buffer + "]";
}
}