Author: kmorin Date: 2014-12-09 11:19:50 +0000 (Tue, 09 Dec 2014) New Revision: 725 Url: http://forge.codelutin.com/projects/faxtomail/repository/revisions/725 Log: fixes #6276 Les mails ne sont pas rout?\195?\169s quand le destinataire est en copie cach?\195?\169 Modified: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/MailFolderService.java trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/MailFolderServiceImpl.java trunk/faxtomail-service/src/test/java/com/franciaflex/faxtomail/services/service/MailFolderServiceTest.java trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/MailFilterJob.java Modified: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/MailFolderService.java =================================================================== --- trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/MailFolderService.java 2014-12-08 11:53:29 UTC (rev 724) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/MailFolderService.java 2014-12-09 11:19:50 UTC (rev 725) @@ -29,12 +29,15 @@ import java.util.Map; import java.util.Set; +import com.franciaflex.faxtomail.persistence.entities.Email; import com.franciaflex.faxtomail.persistence.entities.FaxToMailUser; import com.franciaflex.faxtomail.persistence.entities.MailFilter; import com.franciaflex.faxtomail.persistence.entities.MailFolder; import com.franciaflex.faxtomail.persistence.entities.WaitingState; import com.franciaflex.faxtomail.services.FaxToMailService; +import javax.mail.Address; + /** * @author Kevin Morin (Code Lutin) */ @@ -62,4 +65,6 @@ MailFolder getFolderForFaxToMailUser(FaxToMailUser customerResponsible); MailFolder getMailFolder(String topiaId); + + MailFilter findMailFilter(Email email, Set<String> modifiedProperties, List<Address> recipients); } Modified: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/MailFolderServiceImpl.java =================================================================== --- trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/MailFolderServiceImpl.java 2014-12-08 11:53:29 UTC (rev 724) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/MailFolderServiceImpl.java 2014-12-09 11:19:50 UTC (rev 725) @@ -32,6 +32,7 @@ import java.util.Map; import java.util.Set; +import com.franciaflex.faxtomail.persistence.entities.Email; import org.apache.commons.collections4.CollectionUtils; import org.hibernate.Hibernate; import org.nuiton.util.pagination.PaginationParameter; @@ -45,6 +46,8 @@ import com.franciaflex.faxtomail.persistence.entities.WaitingState; import com.franciaflex.faxtomail.services.FaxToMailServiceSupport; +import javax.mail.Address; + /** * @author kmorin - kmorin@codelutin.com */ @@ -324,4 +327,32 @@ return result; } + @Override + public MailFilter findMailFilter(Email email, Set<String> modifiedProperties, List<Address> recipients) { + MailFilter filter = null; + for (Address address : recipients) { + + String recipient = address.toString(); + + // some recipient are like "toto tutu<toto.tutu73@gmail.com>" + // the regex is to extract email address from it + recipient = recipient.replaceFirst("^.*<(.*)>$", "$1"); + recipient = recipient.toLowerCase(); + + List<MailFilter> filters = getFiltersForRecipient(recipient); + + if (CollectionUtils.isNotEmpty(filters)) { + MailFilter mailFilter = filters.get(0); + // see #6161 + if (filter == null || mailFilter.getPosition() < filter.getPosition()) { + filter = mailFilter; + email.setRecipient(recipient); + modifiedProperties.add(Email.PROPERTY_RECIPIENT); + } + } + } + return filter; + } + + } Modified: trunk/faxtomail-service/src/test/java/com/franciaflex/faxtomail/services/service/MailFolderServiceTest.java =================================================================== --- trunk/faxtomail-service/src/test/java/com/franciaflex/faxtomail/services/service/MailFolderServiceTest.java 2014-12-08 11:53:29 UTC (rev 724) +++ trunk/faxtomail-service/src/test/java/com/franciaflex/faxtomail/services/service/MailFolderServiceTest.java 2014-12-09 11:19:50 UTC (rev 725) @@ -25,9 +25,13 @@ */ import java.io.IOException; +import java.util.HashSet; import java.util.List; +import com.franciaflex.faxtomail.persistence.entities.EmailImpl; import com.franciaflex.faxtomail.persistence.entities.FaxToMailUser; +import com.franciaflex.faxtomail.persistence.entities.MailFilter; +import com.google.common.collect.Lists; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.Assert; @@ -36,6 +40,10 @@ import com.franciaflex.faxtomail.persistence.entities.MailFolder; +import javax.mail.Address; +import javax.mail.internet.AddressException; +import javax.mail.internet.InternetAddress; + /** * @author Kevin Morin (Code Lutin) * @@ -58,6 +66,33 @@ public void testFindFilter() { MailFolder folder = service.getFolderForRecipient("fx.savtest@franciaflex.com"); Assert.assertNotNull(folder); + + try { + Address a1 = new InternetAddress(" etyhjsd sqhdksd sdlksqdj - sqjdsq <test@franciaflex.com>"); + Address a2 = new InternetAddress("dfsdf fsf- sdfs<fx.adv%test@franciaflex.com>"); + Address a3 = new InternetAddress("dsfdsf qd qsdsq d <fx.01test@franciaflex.com>"); + + EmailImpl email = new EmailImpl(); + HashSet<String> modifiedProperties = new HashSet<String>(); + + MailFilter filter = service.findMailFilter(email, modifiedProperties, Lists.newArrayList(a1, a2, a3)); + Assert.assertNotNull(filter); + Assert.assertEquals(filter.getMailFolder().getName(), "Cyril"); + + filter = service.findMailFilter(email, modifiedProperties, Lists.newArrayList(a1, a3, a2)); + Assert.assertNotNull(filter); + Assert.assertEquals(filter.getMailFolder().getName(), "Cyril"); + + filter = service.findMailFilter(email, modifiedProperties, Lists.newArrayList(a3, a1, a2)); + Assert.assertNotNull(filter); + Assert.assertEquals(filter.getMailFolder().getName(), "Cyril"); + + + } catch (AddressException e) { + if (log.isErrorEnabled()) { + log.error("error on email creation", e); + } + } } @Test Modified: trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/MailFilterJob.java =================================================================== --- trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/MailFilterJob.java 2014-12-08 11:53:29 UTC (rev 724) +++ trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/MailFilterJob.java 2014-12-09 11:19:50 UTC (rev 725) @@ -26,6 +26,9 @@ import static org.nuiton.i18n.I18n.t; +import com.google.common.base.Function; +import com.google.common.collect.Collections2; +import com.google.common.collect.Lists; import gui.ava.html.Html2Image; import java.io.ByteArrayOutputStream; @@ -43,6 +46,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Properties; import java.util.Set; import java.util.regex.Pattern; @@ -52,6 +56,7 @@ import javax.mail.Address; import javax.mail.Flags; import javax.mail.Folder; +import javax.mail.Header; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Part; @@ -256,7 +261,7 @@ int unread = folder.getUnreadMessageCount(); if (log.isDebugEnabled()) { - log.debug(count + " messages, " + unread + " unread"); + log.debug(emailAccount.getLogin() + "@" + emailAccount.getHost() + " : " + count + " messages, " + unread + " unread"); } for (int i = 0 ; i < count ; i++) { @@ -275,26 +280,48 @@ log.debug(String.format("Message %d/%d : %s", i, count, message.getSubject())); } - List<Address> recipients = new ArrayList<>(); - Address[] toRecipients = message.getRecipients(Message.RecipientType.TO); - if (toRecipients != null) { - recipients.addAll(Arrays.asList(toRecipients)); + List<Address> recipientAddresses = new ArrayList<>(); + Address[] allRecipients = message.getAllRecipients(); + if (allRecipients != null) { + recipientAddresses.addAll(Arrays.asList(allRecipients)); } - Address[] ccRecipients = message.getRecipients(Message.RecipientType.CC); - if (ccRecipients != null) { - recipients.addAll(Arrays.asList(ccRecipients)); - } + Set<String> recipients = new HashSet<String>( + Collections2.transform(recipientAddresses, new Function<Address, String>() { + @Override + public String apply(Address address) { + String recipient = address.toString(); + // some recipient are like "toto tutu<toto.tutu73@gmail.com>" + // the regex is to extract email address from it + recipient = recipient.replaceFirst("^.*<(.*)>$", "$1"); + recipient = recipient.toLowerCase(); + return recipient; + } + })); - MailFilter filter = null; - for (Address address : recipients) { + // try to find the real recipient, in case it is in the bcc + Enumeration allHeaders = message.getAllHeaders(); + String regex = "^.*for<(.*)>.*$"; - String recipient = address.toString(); + while (allHeaders.hasMoreElements()) { + Header header = (Header) allHeaders.nextElement(); + if ("Received".equals(header.getName())) { + String forRecipient = StringUtils.removePattern(header.getValue(), "\\s"); - // some recipient are like "toto tutu<toto.tutu73@gmail.com>" - // the regex is to extract email address from it - recipient = recipient.replaceFirst("^.*<(.*)>$", "$1"); - recipient = recipient.toLowerCase(); + if (forRecipient != null && forRecipient.matches(regex)) { + forRecipient = forRecipient.replaceFirst(regex, "$1"); + if (StringUtils.isNotBlank(forRecipient) && recipients.add(forRecipient)) { + if (log.isDebugEnabled()) { + log.debug("recipient found in \"Received\" header: " + forRecipient); + } + break; + } + } + } + } + + MailFilter filter = null; + for (String recipient : recipients) { List<MailFilter> filters = mailFolderService.getFiltersForRecipient(recipient); if (CollectionUtils.isNotEmpty(filters)) { @@ -312,8 +339,8 @@ if (log.isDebugEnabled()) { log.debug(" ==> No filter found for this message"); if (log.isTraceEnabled()) { - for (Address address : recipients) { - log.trace(" - for recipient " + address.toString()); + for (String recipient : recipients) { + log.trace(" - for recipient " + recipient); } } }