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 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} " 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; } }