in server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/RejectAction.java [83:157]
public void execute(ActionReject anAction, Mail aMail, ActionContext context) throws MessagingException {
ActionUtils.detectAndHandleLocalLooping(aMail, context, "reject");
// Create the MDN part
StringBuilder humanText = new StringBuilder(128);
humanText.append("This message was refused by the recipient's mail filtering program.");
humanText.append("\r\n");
humanText.append("The reason given was:");
humanText.append("\r\n");
humanText.append("\r\n");
humanText.append(anAction.getMessage());
String reportingUAName = null;
try {
reportingUAName = InetAddress.getLocalHost()
.getCanonicalHostName();
} catch (UnknownHostException ex) {
reportingUAName = "localhost";
}
String reportingUAProduct = context.getServerInfo();
String[] originalRecipients = aMail.getMessage().getHeader(
"Original-Recipient");
String originalRecipient = null;
if (null != originalRecipients && originalRecipients.length > 0) {
originalRecipient = originalRecipients[0];
}
String finalRecipient = context.getRecipient().asString();
String originalMessageId = aMail.getMessage().getMessageID();
Multipart multipart = MDN.builder()
.humanReadableText(humanText.toString())
.report(
MDNReport.builder()
.reportingUserAgentField(ReportingUserAgent.builder().userAgentName(reportingUAName).userAgentProduct(reportingUAProduct).build())
.finalRecipientField(finalRecipient)
.originalRecipientField(originalRecipient)
.originalMessageIdField(originalMessageId)
.dispositionField(Disposition.builder()
.actionMode(DispositionActionMode.Automatic)
.sendingMode(DispositionSendingMode.Automatic)
.type(DispositionType.Deleted)
.addModifier(DispositionModifier.Error)
.build())
.build())
.build()
.asMultipart();
// Send the message
MimeMessage reply = (MimeMessage) aMail.getMessage().reply(false);
context.getRecipient().toInternetAddress()
.ifPresent(Throwing.<Address>consumer(reply::setFrom).sneakyThrow());
reply.setContent(multipart);
reply.saveChanges();
Address[] recipientAddresses = reply.getAllRecipients();
if (recipientAddresses != null) {
MailImpl mail = MailImpl.builder()
.name(MailImpl.getId())
.addRecipients(Arrays.stream(recipientAddresses)
.map(InternetAddress.class::cast)
.map(Throwing.function(MailAddress::new))
.collect(ImmutableList.toImmutableList()))
.mimeMessage(reply)
.build();
try {
context.post(mail);
} finally {
LifecycleUtil.dispose(mail);
}
} else {
LOGGER.info("Unable to send reject MDN. Could not determine the recipient.");
}
}