office-alexander-logistics/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/mail/MailPlugin.java
2025-06-08 11:11:48 +02:00

126 lines
6 KiB
Java

package com.alexanderlogistics.mail;
import java.io.UnsupportedEncodingException;
import java.util.Optional;
import java.util.logging.Logger;
import org.eclipse.microprofile.config.inject.ConfigProperty;
import org.imixs.marty.profile.ProfileService;
import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.exceptions.PluginException;
import jakarta.inject.Inject;
import jakarta.mail.MessagingException;
import jakarta.mail.internet.InternetAddress;
import jakarta.mail.internet.MimeMessage;
/**
* Dieses Plugin überschreibt einfach nur From und Sender im Header. Ist in
* neuen Versionen von Imixs-Workflow 6.2.2 automatisch gelöst.
*
*/
public class MailPlugin extends org.imixs.marty.profile.MailPlugin {
private static final Logger logger = Logger.getLogger(MailPlugin.class.getName());
@Inject
@ConfigProperty(name = "mail.authenticatedSender")
Optional<String> mailAuthenticatedSender;
@Inject
ProfileService profileService;
/**
* This method creates a new mail header with custom from and reply-to addresses
*
*/
@Override
public ItemCollection run(ItemCollection documentContext, ItemCollection documentActivity) throws PluginException {
// run default functionality
ItemCollection result = super.run(documentContext, documentActivity);
boolean debug = true; // immer debuggen!!
// now get the Mail Session object and adapt sender and from!!
MimeMessage mailMessage = (MimeMessage) super.getMailMessage();
if (mailMessage != null) {
try {
/*
* Now Set Sender, From and ReplyTo addresses...
*/
// compute From address - can be overwritten by env mail.defaultSender
InternetAddress adr = getInternetAddress(getFrom(documentContext,
documentActivity));
if (adr == null) {
// in case of null we set an empty address here. This can happen in case
// of a RunAs Service EJB where the user context can not be resolved to a valid
// smtp address
if (debug) {
logger.warning("│   ├── from address was resolved to null");
}
// we will force a MessagingException...
adr = new InternetAddress("");
} else {
if (mailAuthenticatedSender.isPresent()) {
logger.info("├── 📭 set authenticated sender...");
String mailDefaultPattern = mailAuthenticatedSender.get();
String sender = mailDefaultPattern;
// Expected format "COMPANY - {username} <webmaster@info.com>"
int start = mailDefaultPattern.lastIndexOf('<');
int end = mailDefaultPattern.lastIndexOf('>');
if (start >= 0 && end >= 0) {
String senderDisplayName = mailDefaultPattern.substring(0, start);
sender = mailDefaultPattern.substring(start + 1, end);
logger.info("│ ├── sender='" + sender + "'");
mailMessage.setHeader("Sender", sender);
// create custom from...
String userName = this.getWorkflowService().getUserName();
String userDisplayName = userName;
String userEmail = userName;
ItemCollection profile = profileService.findProfileById(userName);
if (profile != null) {
userDisplayName = profile.getItemValueString("txtuserName");
userEmail = profile.getItemValueString("txtemail");
senderDisplayName = senderDisplayName.replace("{username}", userDisplayName);
} else {
logger.warning(
"├── ⚠️ no matching user profile found for " + userName);
}
InternetAddress fromAddress = new InternetAddress(sender, senderDisplayName);
mailMessage.setFrom(fromAddress);
logger.info(
"│ ├── from:" + fromAddress.getPersonal() + "<" + fromAddress.getAddress() + ">");
logger.info("│ ├── replyTo:" + userEmail);
InternetAddress[] replyToAddressList = new InternetAddress[1];
replyToAddressList[0] = getInternetAddress(userEmail);
mailMessage.setReplyTo(replyToAddressList);
} else {
// default behavior - set sender and reply only
logger.info("│ ├── sender='" + sender + "'");
mailMessage.setHeader("Sender", sender);
// Dow we have a replay to?
String sReplyTo = getReplyTo(documentContext, documentActivity);
if ((sReplyTo == null) || (sReplyTo.isEmpty())) {
sReplyTo = adr.getAddress();
}
logger.info("│ ├── replyTo:" + sReplyTo);
InternetAddress[] resplysAdrs = new InternetAddress[1];
resplysAdrs[0] = getInternetAddress(sReplyTo);
mailMessage.setReplyTo(resplysAdrs);
}
}
}
} catch (MessagingException | UnsupportedEncodingException e) {
throw new PluginException(MailPlugin.class.getSimpleName(),
ERROR_MAIL_MESSAGE, e.getMessage(), e);
}
}
return result;
}
}