public void service(Mail originalMail) throws MessagingException {
boolean keepMessageId = false;
// duplicates the Mail object, to be able to modify the new mail keeping the original untouched
Mail newMail = ((MailImpl) originalMail).duplicate(newName((MailImpl) originalMail));
// We don't need to use the original Remote Address and Host,
// and doing so would likely cause a loop with spam detecting
// matchers.
try {
((MailImpl) newMail).setRemoteAddr(java.net.InetAddress.getLocalHost().getHostAddress());
((MailImpl) newMail).setRemoteHost(java.net.InetAddress.getLocalHost().getHostName());
} catch (java.net.UnknownHostException _) {
((MailImpl) newMail).setRemoteAddr("127.0.0.1");
((MailImpl) newMail).setRemoteHost("localhost");
}
if (isDebug) {
MailImpl newMailImpl = (MailImpl) newMail;
log("New mail - sender: " + newMailImpl.getSender()
+ ", recipients: " + arrayToString(newMailImpl.getRecipients().toArray())
+ ", name: " + newMailImpl.getName()
+ ", remoteHost: " + newMailImpl.getRemoteHost()
+ ", remoteAddr: " + newMailImpl.getRemoteAddr()
+ ", state: " + newMailImpl.getState()
+ ", lastUpdated: " + newMailImpl.getLastUpdated()
+ ", errorMessage: " + newMailImpl.getErrorMessage());
}
//Create the message
if(getInLineType(originalMail) != UNALTERED) {
if (isDebug) {
log("Alter message");
}
newMail.setMessage(new MimeMessage(Session.getDefaultInstance(System.getProperties(),
null)));
// handle the new message if altered
buildAlteredMessage(newMail, originalMail);
} else {
// if we need the original, create a copy of this message to redirect
if (getPassThrough(originalMail)) {
newMail.setMessage(new MimeMessage(originalMail.getMessage()) {
protected void updateHeaders() throws MessagingException {
if (getMessageID() == null) super.updateHeaders();
else {
modified = false;
}
}
});
}
if (isDebug) {
log("Message resent unaltered.");
}
keepMessageId = true;
}
//Set additional headers
setRecipients(newMail, getRecipients(originalMail), originalMail);
setTo(newMail, getTo(originalMail), originalMail);
setSubjectPrefix(newMail, getSubjectPrefix(originalMail), originalMail);
if(newMail.getMessage().getHeader(RFC2822Headers.DATE) == null) {
newMail.getMessage().setHeader(RFC2822Headers.DATE, rfc822DateFormat.format(new Date()));
}
setReplyTo(newMail, getReplyTo(originalMail), originalMail);
setReversePath(newMail, getReversePath(originalMail), originalMail);
setSender(newMail, getSender(originalMail), originalMail);
setIsReply(newMail, isReply(originalMail), originalMail);
newMail.getMessage().saveChanges();
if (keepMessageId) {
setMessageId(newMail, originalMail);
}
if (senderDomainIsValid(newMail)) {
//Send it off...
getMailetContext().sendMail(newMail);
} else {
StringBuffer logBuffer = new StringBuffer(256)
.append(getMailetName())
.append(" mailet cannot forward ")
.append(((MailImpl) originalMail).getName())
.append(". Invalid sender domain for ")
.append(newMail.getSender())
.append(". Consider using the Resend mailet ")
.append("using a different sender.");
throw new MessagingException(logBuffer.toString());
}