This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository pollen. See https://gitlab.nuiton.org/chorem/pollen.git commit a50c9dce1bb6eef96ea2c53301b27e4602031271 Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Fri Nov 3 11:36:33 2017 +0100 gérer les action suite au retour de mail envoyer par pollen (refs #168) --- .../h2/V3_1_0_8__add_from_and_replyTo_mail.sql | 3 + .../V3_1_0_8__add_from_and_replyTo_mail.sql | 3 + pollen-persistence/src/main/xmi/pollen.properties | 2 +- pollen-persistence/src/main/xmi/pollen.zargo | Bin 30431 -> 30597 bytes .../rest/api/PollenRestApiApplicationListener.java | 15 ++ .../rest/api/PollenRestApiRequestFilter.java | 4 +- pollen-services/pom.xml | 5 + pollen-services/src/main/config/PollenServices.ini | 27 +++ .../pollen/services/job/CheckMailBoxJob.java | 28 +++ .../services/service/PollenServiceSupport.java | 15 ++ .../services/service/mail/AbstractReportEmail.java | 7 + .../services/service/mail/AbstractVoteEmail.java | 8 + .../services/service/mail/ChoiceAddedEmail.java | 8 + .../services/service/mail/ChoiceDeletedEmail.java | 9 + .../services/service/mail/ChoiceEditedEmail.java | 8 + .../services/service/mail/CommentAddedEmail.java | 8 + .../services/service/mail/CommentDeletedEmail.java | 8 + .../services/service/mail/CommentEditedEmail.java | 8 + .../pollen/services/service/mail/EmailService.java | 112 ++++++++- .../service/mail/ExceedingMaxVotersEmail.java | 8 + .../services/service/mail/FeedbackEmail.java | 8 + .../services/service/mail/LostPasswordEmail.java | 8 + .../services/service/mail/MailBoxService.java | 268 +++++++++++++++++++++ .../service/mail/PollChoicePeriodEndedEmail.java | 8 + .../service/mail/PollChoicePeriodStartedEmail.java | 8 + .../services/service/mail/PollClosedEmail.java | 8 + .../services/service/mail/PollCreatedEmail.java | 8 + .../service/mail/PollEndReminderEmail.java | 8 + .../services/service/mail/PollInvitationEmail.java | 34 +++ .../services/service/mail/PollReportEmail.java | 7 + .../service/mail/PollReportForAdminEmail.java | 8 + .../service/mail/PollVotePeriodEndedEmail.java | 8 + .../service/mail/PollVotePeriodStartedEmail.java | 8 + .../service/mail/PollVoteReminderEmail.java | 8 + .../services/service/mail/PollenEmailKeyType.java | 51 ++++ .../pollen/services/service/mail/PollenMail.java | 17 +- .../service/mail/PollenMailReturnContext.java | 106 ++++++++ .../services/service/mail/PollenMailType.java | 75 ++++++ .../service/mail/ResendValidationEmail.java | 8 + .../mail/RestrictedPollInvitationEmail.java | 34 +++ .../service/mail/UserAccountCreatedEmail.java | 8 + .../mail/UserAccountCreatedFromProviderEmail.java | 8 + .../service/mail/UserAccountDeletedEmail.java | 8 + .../service/mail/UserAccountEditedEmail.java | 8 + .../mail/UserAccountEmailAddressAddedEmail.java | 8 + .../mail/UserAccountEmailValidatedEmail.java | 8 + .../mail/UserAccountPasswordChangedEmail.java | 8 + .../i18n/pollen-services_en_GB.properties | 10 +- .../i18n/pollen-services_fr_FR.properties | 10 +- pom.xml | 6 + 50 files changed, 1047 insertions(+), 9 deletions(-) diff --git a/pollen-persistence/src/main/resources/db/migration/h2/V3_1_0_8__add_from_and_replyTo_mail.sql b/pollen-persistence/src/main/resources/db/migration/h2/V3_1_0_8__add_from_and_replyTo_mail.sql new file mode 100644 index 00000000..5179a140 --- /dev/null +++ b/pollen-persistence/src/main/resources/db/migration/h2/V3_1_0_8__add_from_and_replyTo_mail.sql @@ -0,0 +1,3 @@ +-- add from and replyTo in email +alter table emailtoresend add adrfrom LONGVARCHAR; +alter table emailtoresend add replyto LONGVARCHAR; \ No newline at end of file diff --git a/pollen-persistence/src/main/resources/db/migration/postgresql/V3_1_0_8__add_from_and_replyTo_mail.sql b/pollen-persistence/src/main/resources/db/migration/postgresql/V3_1_0_8__add_from_and_replyTo_mail.sql new file mode 100644 index 00000000..354277e6 --- /dev/null +++ b/pollen-persistence/src/main/resources/db/migration/postgresql/V3_1_0_8__add_from_and_replyTo_mail.sql @@ -0,0 +1,3 @@ +-- add from and replyTo in email +alter table emailtoresend add adrfrom TEXT; +alter table emailtoresend add replyto TEXT; \ No newline at end of file diff --git a/pollen-persistence/src/main/xmi/pollen.properties b/pollen-persistence/src/main/xmi/pollen.properties index 3b6ddb78..e772d404 100644 --- a/pollen-persistence/src/main/xmi/pollen.properties +++ b/pollen-persistence/src/main/xmi/pollen.properties @@ -18,7 +18,7 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # #L% ###m -model.tagvalue.version=3.1.0.7 +model.tagvalue.version=3.1.0.8 #model.tagValue.notGenerateToString=true #model.tagValue.constantPrefix=PROPERTY_ #model.tagValue.useEnumerationName=true diff --git a/pollen-persistence/src/main/xmi/pollen.zargo b/pollen-persistence/src/main/xmi/pollen.zargo index 92718584..7a92a588 100644 Binary files a/pollen-persistence/src/main/xmi/pollen.zargo and b/pollen-persistence/src/main/xmi/pollen.zargo differ diff --git a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiApplicationListener.java b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiApplicationListener.java index 5bd9595e..469b0317 100644 --- a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiApplicationListener.java +++ b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiApplicationListener.java @@ -41,6 +41,7 @@ import org.chorem.pollen.services.bean.VoterListBean; import org.chorem.pollen.services.bean.VoterListMemberBean; import org.chorem.pollen.services.config.PollenServicesConfig; import org.chorem.pollen.services.job.AbstractPollenJob; +import org.chorem.pollen.services.job.CheckMailBoxJob; import org.chorem.pollen.services.job.DeleteObsoleteSessionTokensJob; import org.chorem.pollen.services.job.SendEmailInErrorsJob; import org.chorem.pollen.services.job.SendPollEndReminderJob; @@ -121,6 +122,11 @@ public class PollenRestApiApplicationListener implements ServletContextListener .withIdentity("deleteObsoleteSessionTokensJob", "pollenJobs") .build(); + JobDetail checkMailBoxJob = JobBuilder.newJob(CheckMailBoxJob.class) + .usingJobData(data) + .withIdentity("checkMailBoxJob", "pollenJobs") + .build(); + try { scheduler = new StdSchedulerFactory().getScheduler(); @@ -154,6 +160,15 @@ public class PollenRestApiApplicationListener implements ServletContextListener scheduler.scheduleJob(deleteObsoleteSessionTokensJob, deleteObsoleteSessionTokensTrigger); + // schedule send poll end reminders + Trigger checkMailBoxTrigger = TriggerBuilder + .newTrigger() + .withIdentity("checkMailBoxTrigger", "pollenTriggers") + .withSchedule(CronScheduleBuilder.cronSchedule(applicationConfig.getMailBoxCronSchedule())) + .build(); + + scheduler.scheduleJob(checkMailBoxJob, checkMailBoxTrigger); + scheduler.start(); if (log.isDebugEnabled()) { diff --git a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiRequestFilter.java b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiRequestFilter.java index e11291d1..debc8357 100644 --- a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiRequestFilter.java +++ b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiRequestFilter.java @@ -53,6 +53,7 @@ import org.chorem.pollen.services.service.VoteCountingTypeService; import org.chorem.pollen.services.service.VoteService; import org.chorem.pollen.services.service.VoterListService; import org.chorem.pollen.services.service.mail.EmailService; +import org.chorem.pollen.services.service.mail.MailBoxService; import org.chorem.pollen.services.service.security.PollenCypherTechnicalException; import org.chorem.pollen.services.service.security.PollenInvalidSessionTokenException; import org.chorem.pollen.services.service.security.PollenSecurityContext; @@ -120,7 +121,8 @@ public class PollenRestApiRequestFilter implements ContainerRequestFilter, Conta FeedbackService.class, SocialAuthService.class, GtuService.class, - ConfigurationService.class); + ConfigurationService.class, + MailBoxService.class); /** Logger. */ diff --git a/pollen-services/pom.xml b/pollen-services/pom.xml index b0a1a31c..8a1e2493 100644 --- a/pollen-services/pom.xml +++ b/pollen-services/pom.xml @@ -116,6 +116,11 @@ </dependency> <dependency> + <groupId>javax.mail</groupId> + <artifactId>mail</artifactId> + </dependency> + + <dependency> <groupId>com.github.spullara.mustache.java</groupId> <artifactId>compiler</artifactId> </dependency> diff --git a/pollen-services/src/main/config/PollenServices.ini b/pollen-services/src/main/config/PollenServices.ini index 5f8ce7d2..5b946125 100644 --- a/pollen-services/src/main/config/PollenServices.ini +++ b/pollen-services/src/main/config/PollenServices.ini @@ -99,6 +99,33 @@ key = pollen.smtp.from type = string defaultValue = "noreply@serveur.com" +[option mailBoxHost] +description = pollen.configuration.mailBox.host +key = pollen.mailBox.host +type = string + +[option mailBoxProtocol] +description = pollen.configuration.mailBox.protocol +key = pollen.mailBox.protocol +type = string +defaultValue = imap + +[option mailBoxUser] +description = pollen.configuration.mailBox.user +key = pollen.mailBox.user +type = string + +[option mailBoxPassword] +description = pollen.configuration.mailBox.password +key = pollen.mailBox.password +type = string + +[option mailBoxCronSchedule] +description = pollen.configuration.mailBox.cronSchedule +key = pollen.mailBox.cronSchedule +type = string +defaultValue = "0 2/5 * * * ?" + [option logConfigurationFile] description = pollen.configuration.logConfigurationFile key = pollen.logConfigurationFile diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/job/CheckMailBoxJob.java b/pollen-services/src/main/java/org/chorem/pollen/services/job/CheckMailBoxJob.java new file mode 100644 index 00000000..2f1cea4c --- /dev/null +++ b/pollen-services/src/main/java/org/chorem/pollen/services/job/CheckMailBoxJob.java @@ -0,0 +1,28 @@ +package org.chorem.pollen.services.job; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.chorem.pollen.services.service.mail.MailBoxService; +import org.quartz.DisallowConcurrentExecution; +import org.quartz.JobExecutionException; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +@DisallowConcurrentExecution +public class CheckMailBoxJob extends AbstractPollenJob { + + private static final Log log = LogFactory.getLog(CheckMailBoxJob.class); + + @Override + public void execute() throws JobExecutionException { + + if (log.isDebugEnabled()) { + log.debug("Start job to delete obsolete Session Tokens"); + } + + MailBoxService mailBoxService = newService(MailBoxService.class); + mailBoxService.checkMailBox(); + + } +} diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java index b9b36ae4..c5ff40ad 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java @@ -60,7 +60,9 @@ import org.chorem.pollen.services.service.mail.EmailService; import org.chorem.pollen.services.service.security.PermissionVerb; import org.chorem.pollen.services.service.security.PollenSecurityContext; import org.chorem.pollen.services.service.security.SecurityService; +import org.nuiton.topia.persistence.TopiaDao; import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.topia.persistence.TopiaIdFactory; import org.nuiton.util.StringUtil; import org.nuiton.util.pagination.PaginationResult; @@ -507,6 +509,19 @@ public abstract class PollenServiceSupport implements PollenService { return pollenEntityId; } + protected <E extends TopiaEntity> String getReduceId(E entity) { + return PollenEntityId.encode(serviceContext.getTopiaApplicationContext().getTopiaIdFactory(), entity.getTopiaId()); + } + + protected <E extends TopiaEntity> E findEntity(Class<E> type, String reduceId) { + TopiaIdFactory topiaIdFactory = serviceContext.getTopiaApplicationContext().getTopiaIdFactory(); + + String topiaId = topiaIdFactory.newTopiaId(type, reduceId); + + TopiaDao<E> dao = getPersistenceContext().getDao(type); + return dao.forTopiaIdEquals(topiaId).findUnique(); + } + protected String getPollVoteUrl(Poll poll) { return getPollVoteUrl(getPollenEntityId(poll), null); } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/AbstractReportEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/AbstractReportEmail.java index 0cf00f57..db26b3a5 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/AbstractReportEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/AbstractReportEmail.java @@ -21,11 +21,13 @@ package org.chorem.pollen.services.service.mail; * #L% */ +import com.google.common.collect.Lists; import org.chorem.pollen.persistence.entity.Poll; import org.chorem.pollen.persistence.entity.Report; import org.chorem.pollen.services.bean.ReportLevel; import org.nuiton.topia.persistence.TopiaEntity; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -89,4 +91,9 @@ public abstract class AbstractReportEmail<T extends TopiaEntity> extends Pollen public void setUrl(String url) { this.url = url; } + + @Override + public List<TopiaEntity> getEntitiesKey() { + return Lists.newArrayList(poll, target, report); + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/AbstractVoteEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/AbstractVoteEmail.java index e2096027..f336bd28 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/AbstractVoteEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/AbstractVoteEmail.java @@ -21,9 +21,12 @@ package org.chorem.pollen.services.service.mail; * #L% */ +import com.google.common.collect.Lists; import org.chorem.pollen.persistence.entity.Poll; import org.chorem.pollen.persistence.entity.Vote; +import org.nuiton.topia.persistence.TopiaEntity; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -50,4 +53,9 @@ public abstract class AbstractVoteEmail extends PollenMail { return vote; } + @Override + public List<TopiaEntity> getEntitiesKey() { + return Lists.newArrayList(poll, vote); + } + } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/ChoiceAddedEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/ChoiceAddedEmail.java index f034d634..ea202326 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/ChoiceAddedEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/ChoiceAddedEmail.java @@ -21,10 +21,13 @@ package org.chorem.pollen.services.service.mail; * #L% */ +import com.google.common.collect.Lists; import org.chorem.pollen.persistence.entity.Choice; import org.chorem.pollen.persistence.entity.Poll; import org.nuiton.i18n.I18n; +import org.nuiton.topia.persistence.TopiaEntity; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -64,4 +67,9 @@ public class ChoiceAddedEmail extends PollenMail { public void setChoice(Choice choice) { this.choice = choice; } + + @Override + public List<TopiaEntity> getEntitiesKey() { + return Lists.newArrayList(poll, choice); + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/ChoiceDeletedEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/ChoiceDeletedEmail.java index 4d50df0a..03c8a747 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/ChoiceDeletedEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/ChoiceDeletedEmail.java @@ -21,10 +21,13 @@ package org.chorem.pollen.services.service.mail; * #L% */ +import com.google.common.collect.Lists; import org.chorem.pollen.persistence.entity.Choice; import org.chorem.pollen.persistence.entity.Poll; import org.nuiton.i18n.I18n; +import org.nuiton.topia.persistence.TopiaEntity; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -64,4 +67,10 @@ public class ChoiceDeletedEmail extends PollenMail { public void setChoice(Choice choice) { this.choice = choice; } + + @Override + public List<TopiaEntity> getEntitiesKey() { + return Lists.newArrayList(poll, choice); + } + } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/ChoiceEditedEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/ChoiceEditedEmail.java index 5af161b6..5fc38e5b 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/ChoiceEditedEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/ChoiceEditedEmail.java @@ -21,10 +21,13 @@ package org.chorem.pollen.services.service.mail; * #L% */ +import com.google.common.collect.Lists; import org.chorem.pollen.persistence.entity.Choice; import org.chorem.pollen.persistence.entity.Poll; import org.nuiton.i18n.I18n; +import org.nuiton.topia.persistence.TopiaEntity; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -64,4 +67,9 @@ public class ChoiceEditedEmail extends PollenMail { public void setChoice(Choice choice) { this.choice = choice; } + + @Override + public List<TopiaEntity> getEntitiesKey() { + return Lists.newArrayList(poll, choice); + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/CommentAddedEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/CommentAddedEmail.java index 3df9eadd..f4bf22b7 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/CommentAddedEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/CommentAddedEmail.java @@ -21,10 +21,13 @@ package org.chorem.pollen.services.service.mail; * #L% */ +import com.google.common.collect.Lists; import org.chorem.pollen.persistence.entity.Comment; import org.chorem.pollen.persistence.entity.Poll; import org.nuiton.i18n.I18n; +import org.nuiton.topia.persistence.TopiaEntity; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -64,4 +67,9 @@ public class CommentAddedEmail extends PollenMail { public void setComment(Comment comment) { this.comment = comment; } + + @Override + public List<TopiaEntity> getEntitiesKey() { + return Lists.newArrayList(poll, comment); + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/CommentDeletedEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/CommentDeletedEmail.java index b7e745a8..8b04935b 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/CommentDeletedEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/CommentDeletedEmail.java @@ -21,10 +21,13 @@ package org.chorem.pollen.services.service.mail; * #L% */ +import com.google.common.collect.Lists; import org.chorem.pollen.persistence.entity.Comment; import org.chorem.pollen.persistence.entity.Poll; import org.nuiton.i18n.I18n; +import org.nuiton.topia.persistence.TopiaEntity; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -64,4 +67,9 @@ public class CommentDeletedEmail extends PollenMail { public void setComment(Comment comment) { this.comment = comment; } + + @Override + public List<TopiaEntity> getEntitiesKey() { + return Lists.newArrayList(poll, comment); + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/CommentEditedEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/CommentEditedEmail.java index e583ab8f..de01e7fb 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/CommentEditedEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/CommentEditedEmail.java @@ -21,10 +21,13 @@ package org.chorem.pollen.services.service.mail; * #L% */ +import com.google.common.collect.Lists; import org.chorem.pollen.persistence.entity.Comment; import org.chorem.pollen.persistence.entity.Poll; import org.nuiton.i18n.I18n; +import org.nuiton.topia.persistence.TopiaEntity; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -64,4 +67,9 @@ public class CommentEditedEmail extends PollenMail { public void setComment(Comment comment) { this.comment = comment; } + + @Override + public List<TopiaEntity> getEntitiesKey() { + return Lists.newArrayList(poll, comment); + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/EmailService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/EmailService.java index 3e3ba8f9..d7c4d413 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/EmailService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/EmailService.java @@ -26,11 +26,14 @@ import com.github.mustachejava.Mustache; import com.github.mustachejava.MustacheException; import com.github.mustachejava.MustacheFactory; import com.google.common.base.Charsets; +import com.google.common.base.Preconditions; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.commons.mail.Email; import org.apache.commons.mail.EmailException; +import org.apache.commons.mail.MultiPartEmail; import org.apache.commons.mail.SimpleEmail; import org.chorem.pollen.persistence.PollenTopiaApplicationContext; import org.chorem.pollen.persistence.PollenTopiaPersistenceContext; @@ -47,15 +50,25 @@ import org.chorem.pollen.persistence.entity.PollenUserEmailAddress; import org.chorem.pollen.persistence.entity.Report; import org.chorem.pollen.persistence.entity.UserCredential; import org.chorem.pollen.persistence.entity.Vote; +import org.chorem.pollen.services.PollenTechnicalException; import org.chorem.pollen.services.bean.FeedbackBean; import org.chorem.pollen.services.bean.PollenEntityId; import org.chorem.pollen.services.bean.PollenUserBean; import org.chorem.pollen.services.config.PollenServicesConfig; import org.chorem.pollen.services.service.PollenServiceSupport; +import org.nuiton.i18n.I18n; import org.nuiton.topia.persistence.BeanTopiaConfiguration; import org.nuiton.topia.persistence.TopiaConfigurationBuilder; +import javax.mail.Message; +import javax.mail.MessagingException; +import javax.mail.Part; +import javax.mail.internet.AddressException; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMultipart; import java.io.StringWriter; +import java.io.UnsupportedEncodingException; import java.util.Arrays; import java.util.Collection; import java.util.Date; @@ -81,6 +94,8 @@ public class EmailService extends PollenServiceSupport { private static final Log log = LogFactory.getLog(EmailService.class); public static final String RECIPIENT_SEPARATOR = ";"; + public static final String MAIL_ID_SEPARATOR = "+"; + public static final String MAIL_ID_SEPARATOR_REGEXP = "\\+"; static { n("pollen.service.mail.loginProvider.amazon"); @@ -339,7 +354,15 @@ public class EmailService extends PollenServiceSupport { if (StringUtils.isNotBlank(bcc)) { bccs.addAll(Arrays.asList(bcc.split(RECIPIENT_SEPARATOR))); } - doSend(emailToResend.getSubject(), emailToResend.getBody(), tos, bccs); + + Collection<InternetAddress> replyTo; + try { + replyTo = Arrays.asList(InternetAddress.parse(emailToResend.getReplyTo())); + } catch (AddressException e) { + throw new PollenTechnicalException("error parse replyTo", e); + } + + doSend(emailToResend.getSubject(), emailToResend.getBody(), emailToResend.getAdrFrom(), replyTo, tos, bccs); emailToResendDao.delete(emailToResend); commit(); @@ -362,8 +385,30 @@ public class EmailService extends PollenServiceSupport { Set<String> tos = mail.getTos(); Set<String> bccs = mail.getBccs(); + String smtpFrom = getPollenServiceConfig().getSmtpFrom(); + + InternetAddress fromAddress = null; try { - doSend(subject, body, tos, bccs); + fromAddress = new InternetAddress(smtpFrom); + + if (StringUtils.isNotBlank(mail.getFromName())) { + String personal = I18n.l(getLocale(),"pollen.service.mail.from.via", mail.getFromName(), fromAddress.getPersonal()); + fromAddress.setPersonal(personal); + } + } catch (AddressException | UnsupportedEncodingException e) { + throw new PollenTechnicalException("Error on smtp from adresse", e); + } + + String[] emailSplit = fromAddress.getAddress().split("@"); + String userFrom = emailSplit[0]; + String domainFrom = emailSplit[1]; + fromAddress.setAddress(userFrom + "+" + getMailId(mail) + "@" + domainFrom); + + String from = fromAddress.toUnicodeString(); + Collection<InternetAddress> replyTo = mail.getReplyTo(); + + try { + doSend(subject, body, from, replyTo, tos, bccs); } catch (EmailException e) { @@ -374,6 +419,8 @@ public class EmailService extends PollenServiceSupport { EmailToResend emailToResend = new EmailToResendImpl(); emailToResend.setSubject(subject); emailToResend.setBody(body); + emailToResend.setAdrFrom(from); + emailToResend.setReplyTo(replyTo.stream().map(InternetAddress::toUnicodeString).reduce("", (s, s2) -> s + ", " + s2)); emailToResend.setTos(StringUtils.join(tos, RECIPIENT_SEPARATOR)); emailToResend.setBccs(StringUtils.join(bccs, RECIPIENT_SEPARATOR)); @@ -395,7 +442,9 @@ public class EmailService extends PollenServiceSupport { } } - protected void doSend(String subject, String body, Collection<String> tos, Collection<String> bccs) throws EmailException { + protected void doSend(String subject, String body, + String from, Collection<InternetAddress> replyTo, + Collection<String> tos, Collection<String> bccs) throws EmailException { PollenServicesConfig applicationConfig = getPollenServiceConfig(); @@ -418,7 +467,11 @@ public class EmailService extends PollenServiceSupport { newEmail.setCharset(Charsets.UTF_8.name()); newEmail.setSubject(subject); - newEmail.setFrom(applicationConfig.getSmtpFrom()); + newEmail.setFrom(from); + if (CollectionUtils.isNotEmpty(replyTo)) { + newEmail.setReplyTo(replyTo); + } + for (String to : tos) { newEmail.addTo(to); } @@ -642,4 +695,55 @@ public class EmailService extends PollenServiceSupport { email.setOffersUrl(getUIContext().getOffersUrl()); return email; } + + protected String getMailId(PollenMail mail) { + PollenMailType pollenEmailType = PollenMailType.valueOfMail(mail); + return pollenEmailType.name() + + mail.getEntitiesKey().stream() + .map(entity -> PollenEmailKeyType.valueOfEntity(entity).name() + getReduceId(entity)) + .reduce("", (s, s2) -> s + MAIL_ID_SEPARATOR + s2); + } + + /** + * Fait suivre le message donnée en paramètre aux adresses données en paramètre. + * <p> + * http://www.oracle.com/technetwork/java/faq-135477.html#forward + */ + void forward(Message messageToForward, Set<String> tos, String subject, String body, String from, boolean preventAutomaticResponse) throws EmailException, MessagingException { + Preconditions.checkArgument(!tos.isEmpty(), "il faut préciser au moins un destinataire à qui faire suivre le message " + messageToForward); + + PollenServicesConfig applicationConfig = getPollenServiceConfig(); + + // create a body part to contain whatever text you want to include + MimeBodyPart bodyPart = new MimeBodyPart(); + bodyPart.setText(body); + + // create another body part to contain the message to be forwarded + MimeBodyPart messageToForwardAsAttachment = new MimeBodyPart(); + messageToForwardAsAttachment.setContent(messageToForward, "message/rfc822"); + messageToForwardAsAttachment.setDisposition(Part.ATTACHMENT); + + Email newEmail = new MultiPartEmail(); + + newEmail.setHostName(applicationConfig.getSmtpHost()); + newEmail.setSmtpPort(applicationConfig.getSmtpPort()); + newEmail.setCharset(Charsets.UTF_8.name()); + newEmail.setSubject(subject); + newEmail.setFrom(from); + + for (String to : tos) { + newEmail.addTo(to); + } + newEmail.setMsg(body); + + if (preventAutomaticResponse) { + newEmail.addHeader("Return-Path", "<>"); + } + MimeMultipart multipart = new MimeMultipart(); + multipart.addBodyPart(bodyPart); + multipart.addBodyPart(messageToForwardAsAttachment); + newEmail.setContent(multipart); + newEmail.send(); + } + } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/ExceedingMaxVotersEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/ExceedingMaxVotersEmail.java index 54aa49a8..a0a24bbb 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/ExceedingMaxVotersEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/ExceedingMaxVotersEmail.java @@ -23,7 +23,10 @@ package org.chorem.pollen.services.service.mail; import org.chorem.pollen.persistence.entity.Poll; import org.nuiton.i18n.I18n; +import org.nuiton.topia.persistence.TopiaEntity; +import java.util.Collections; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -48,6 +51,11 @@ public class ExceedingMaxVotersEmail extends PollenMail { return I18n.l(locale, "pollen.service.mail.ExceedingMaxVotersEmail.subject", poll.getTitle()); } + @Override + public List<TopiaEntity> getEntitiesKey() { + return Collections.singletonList(poll); + } + public Poll getPoll() { return poll; } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/FeedbackEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/FeedbackEmail.java index f5020d3c..3dc6937c 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/FeedbackEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/FeedbackEmail.java @@ -24,8 +24,11 @@ package org.chorem.pollen.services.service.mail; import org.chorem.pollen.services.bean.FeedbackBean; import org.chorem.pollen.services.bean.PollenUserBean; import org.nuiton.i18n.I18n; +import org.nuiton.topia.persistence.TopiaEntity; +import java.util.Collections; import java.util.Date; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -91,4 +94,9 @@ public class FeedbackEmail extends PollenMail { public String getScreenShotUrl() { return screenShotUrl; } + + @Override + public List<TopiaEntity> getEntitiesKey() { + return Collections.emptyList(); + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/LostPasswordEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/LostPasswordEmail.java index 76ed975a..654be9b2 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/LostPasswordEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/LostPasswordEmail.java @@ -23,7 +23,10 @@ package org.chorem.pollen.services.service.mail; import org.chorem.pollen.persistence.entity.PollenUser; import org.nuiton.i18n.I18n; +import org.nuiton.topia.persistence.TopiaEntity; +import java.util.Collections; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -75,4 +78,9 @@ public class LostPasswordEmail extends PollenMail { this.url = url; } */ + + @Override + public List<TopiaEntity> getEntitiesKey() { + return Collections.singletonList(user); + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/MailBoxService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/MailBoxService.java new file mode 100644 index 00000000..6578fd49 --- /dev/null +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/MailBoxService.java @@ -0,0 +1,268 @@ +package org.chorem.pollen.services.service.mail; + +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.commons.mail.EmailException; +import org.chorem.pollen.persistence.entity.Choice; +import org.chorem.pollen.persistence.entity.Comment; +import org.chorem.pollen.persistence.entity.Poll; +import org.chorem.pollen.persistence.entity.PollenPrincipal; +import org.chorem.pollen.persistence.entity.PollenUser; +import org.chorem.pollen.persistence.entity.Report; +import org.chorem.pollen.services.PollenTechnicalException; +import org.chorem.pollen.services.service.PollenServiceSupport; +import org.nuiton.i18n.I18n; +import org.nuiton.topia.persistence.TopiaEntity; + +import javax.mail.Flags; +import javax.mail.Folder; +import javax.mail.Message; +import javax.mail.MessagingException; +import javax.mail.Session; +import javax.mail.Store; +import javax.mail.internet.AddressException; +import javax.mail.internet.InternetAddress; +import javax.mail.search.FlagTerm; +import java.util.Collections; +import java.util.Properties; +import java.util.stream.Stream; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public class MailBoxService extends PollenServiceSupport { + + private static final Log log = LogFactory.getLog(MailBoxService.class); + + public void checkMailBox() { + Store store = null; + if (StringUtils.isNotBlank(getPollenServiceConfig().getMailBoxHost())) { + try { + if (log.isDebugEnabled()) { + log.debug("Open session ..."); + } + store = openSession(); + Folder folder = null; + try { + if (log.isDebugEnabled()) { + log.debug("Open folder ..."); + } + folder = openFolder(store); + if (log.isDebugEnabled()) { + log.debug("Process folder ..."); + } + processFolder(folder); + if (log.isDebugEnabled()) { + log.debug("Done."); + } + } finally { + closeQuietly(folder); + } + } catch (MessagingException e) { + log.error("une erreur est survenue pendant la traitement de la boîte " + getPollenServiceConfig().getMailBoxUser(), e); + } finally { + closeQuietly(store); + } + } + + } + + private Store openSession() throws MessagingException { + Properties properties = new Properties(); + properties.put("mail.host", getPollenServiceConfig().getMailBoxHost()); + properties.put("mail.store.protocol", getPollenServiceConfig().getMailBoxProtocol()); + Session session = Session.getInstance(properties); + Store store = session.getStore(); + store.connect(getPollenServiceConfig().getMailBoxUser(), getPollenServiceConfig().getMailBoxPassword()); + return store; + } + + private Folder openFolder(Store store) throws MessagingException { + Folder defaultFolder = store.getDefaultFolder(); + Folder inboxFolder = defaultFolder.getFolder("INBOX"); + inboxFolder.open(Folder.READ_WRITE); + return inboxFolder; + } + + protected void processFolder(Folder folder) throws MessagingException { + Flags flags = new Flags(); + flags.add(Flags.Flag.FLAGGED); + + FlagTerm searchNewMessages = new FlagTerm(flags, false); + + Message[] messages = folder.search(searchNewMessages); + + if (ArrayUtils.isNotEmpty(messages)) { + if (log.isDebugEnabled()) { + log.debug(messages.length + " messages to process ..."); + } + + Stream.of(messages).forEach(this::processMessage); + + folder.setFlags(messages, flags, true); + } else { + if (log.isDebugEnabled()) { + log.debug("No messages."); + } + } + + } + + protected void processMessage(Message message) { + try { + if (log.isDebugEnabled()) { + log.debug(String.format("Process message \"%1s\" recevied at %tF ...", message.getSubject(), message.getReceivedDate())); + } + + String[] tos = message.getHeader("To"); + + if (ArrayUtils.isNotEmpty(tos)) { + String mailId = getMailId(tos[0]); + if (StringUtils.isNotBlank(mailId)) { + PollenMailReturnContext context = extractMessageContext(message, mailId); + context.getMailType().getAction().accept(this, context); + } + } + + } catch (MessagingException e) { + if (log.isErrorEnabled()) { + log.error("error on read message on mail box", e); + } + } + } + + protected PollenMailReturnContext extractMessageContext(Message message, String mailId) { + if (log.isDebugEnabled()) { + log.debug("Extract context for mailId : " + mailId + " ..."); + } + + PollenMailReturnContext context = new PollenMailReturnContext(); + context.setMessage(message); + + String[] parts = mailId.split(EmailService.MAIL_ID_SEPARATOR_REGEXP); + + if (parts.length > 0) { + + try { + PollenMailType pollenEmailType = PollenMailType.valueOf(parts[0]); + + context.setMailType(pollenEmailType); + + String[] ids = ArrayUtils.subarray(parts, 1, parts.length); + + context.setPoll(findEntity(ids, Poll.class)); + context.setChoice(findEntity(ids, Choice.class)); + context.setUser(findEntity(ids, PollenUser.class)); + context.setReport(findEntity(ids, Report.class)); + context.setComment(findEntity(ids, Comment.class)); + context.setPrincipal(findEntity(ids, PollenPrincipal.class)); + + } catch (IllegalArgumentException e) { + if (log.isErrorEnabled()) { + log.error("unknown pollen email type " + parts[0], e); + } + } + } + return context; + } + + protected <E extends TopiaEntity> E findEntity(String[] ids, Class<E> type) { + PollenEmailKeyType keyType = PollenEmailKeyType.valueOfType(type); + + return Stream.of(ids) + .filter(id -> id.startsWith(keyType.name())) + .findFirst() + .map(id -> id.replaceFirst(keyType.name(), "")) + .map(id -> findEntity(type, id)) + .map(type::cast) + .orElse(null); + } + + + protected void noAction() {}; + + protected void forwardToCreatorAction(Poll poll, Message message) { + String email = poll.getCreator().getEmail(); + if (StringUtils.isNotBlank(email)) { + try { + getEmailService().forward(message, + Collections.singleton(email), + I18n.l(getLocale(), "pollen.service.mailBox.forward.poll.subject"), + I18n.l(getLocale(), "pollen.service.mailBox.forward.poll.body"), + getPollenServiceConfig().getSmtpFrom(), + true); + } catch (MessagingException | EmailException e) { + if (log.isErrorEnabled()) { + log.error("Error on forward message", e); + } + } + } else { + if (log.isWarnEnabled()) { + log.warn("No poll creator email for forward message"); + } + } + + } + + protected String getMailId(String address) { + String mailId = null; + String smtpFrom = getPollenServiceConfig().getSmtpFrom(); + + InternetAddress fromAddress; + try { + fromAddress = new InternetAddress(smtpFrom); + } catch (AddressException e) { + throw new PollenTechnicalException("Error on smtp from address", e); + } + + String[] emailSplit = fromAddress.getAddress().split("@"); + String userFrom = emailSplit[0]; + String domainFrom = emailSplit[1]; + + String decodeAddress = address; + + try { + InternetAddress internetAddress = new InternetAddress(address); + decodeAddress = internetAddress.getAddress(); + } catch (AddressException e) { + if (log.isErrorEnabled()) { + log.error("address parse error : " + address, e); + } + } + + if (decodeAddress.startsWith(userFrom + "+") && decodeAddress.endsWith("@" + domainFrom)) { + mailId = decodeAddress.replace(userFrom + "+", "").replace("@" + domainFrom, ""); + } + + return mailId; + } + + + + private void closeQuietly(Store store) { + if (store != null) { + try { + store.close(); + } catch (MessagingException e) { + if (log.isErrorEnabled()) { + log.error("error occured while trying to disconnect from IMAP server", e); + } + } + } + } + + private void closeQuietly(Folder inboxFolder) { + if (inboxFolder != null) { + try { + inboxFolder.close(false); + } catch (MessagingException e) { + if (log.isErrorEnabled()) { + log.error("error occured while trying to close folder", e); + } + } + } + } + +} diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollChoicePeriodEndedEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollChoicePeriodEndedEmail.java index 7349c2f8..751155b2 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollChoicePeriodEndedEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollChoicePeriodEndedEmail.java @@ -23,7 +23,10 @@ package org.chorem.pollen.services.service.mail; import org.chorem.pollen.persistence.entity.Poll; import org.nuiton.i18n.I18n; +import org.nuiton.topia.persistence.TopiaEntity; +import java.util.Collections; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -53,4 +56,9 @@ public class PollChoicePeriodEndedEmail extends PollenMail { public void setPoll(Poll poll) { this.poll = poll; } + + @Override + public List<TopiaEntity> getEntitiesKey() { + return Collections.singletonList(poll); + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollChoicePeriodStartedEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollChoicePeriodStartedEmail.java index a43e4882..3d169ff2 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollChoicePeriodStartedEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollChoicePeriodStartedEmail.java @@ -23,7 +23,10 @@ package org.chorem.pollen.services.service.mail; import org.chorem.pollen.persistence.entity.Poll; import org.nuiton.i18n.I18n; +import org.nuiton.topia.persistence.TopiaEntity; +import java.util.Collections; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -53,4 +56,9 @@ public class PollChoicePeriodStartedEmail extends PollenMail { public void setPoll(Poll poll) { this.poll = poll; } + + @Override + public List<TopiaEntity> getEntitiesKey() { + return Collections.singletonList(poll); + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollClosedEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollClosedEmail.java index 6467c183..b353f51e 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollClosedEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollClosedEmail.java @@ -23,7 +23,10 @@ package org.chorem.pollen.services.service.mail; import org.chorem.pollen.persistence.entity.Poll; import org.nuiton.i18n.I18n; +import org.nuiton.topia.persistence.TopiaEntity; +import java.util.Collections; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -53,4 +56,9 @@ public class PollClosedEmail extends PollenMail { public void setPoll(Poll poll) { this.poll = poll; } + + @Override + public List<TopiaEntity> getEntitiesKey() { + return Collections.singletonList(poll); + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollCreatedEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollCreatedEmail.java index 113a3735..00b8ea17 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollCreatedEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollCreatedEmail.java @@ -23,7 +23,10 @@ package org.chorem.pollen.services.service.mail; import org.chorem.pollen.persistence.entity.Poll; import org.nuiton.i18n.I18n; +import org.nuiton.topia.persistence.TopiaEntity; +import java.util.Collections; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -72,4 +75,9 @@ public class PollCreatedEmail extends PollenMail { public void setUrl(String url) { this.url = url; } + + @Override + public List<TopiaEntity> getEntitiesKey() { + return Collections.singletonList(poll); + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollEndReminderEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollEndReminderEmail.java index 313d5f54..35a39213 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollEndReminderEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollEndReminderEmail.java @@ -23,8 +23,11 @@ package org.chorem.pollen.services.service.mail; import org.chorem.pollen.persistence.entity.Poll; import org.nuiton.i18n.I18n; +import org.nuiton.topia.persistence.TopiaEntity; import java.text.DateFormat; +import java.util.Collections; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -56,4 +59,9 @@ public class PollEndReminderEmail extends PollenMail { public void setPoll(Poll poll) { this.poll = poll; } + + @Override + public List<TopiaEntity> getEntitiesKey() { + return Collections.singletonList(poll); + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollInvitationEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollInvitationEmail.java index c66401d6..fe8a9b66 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollInvitationEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollInvitationEmail.java @@ -21,9 +21,18 @@ package org.chorem.pollen.services.service.mail; * #L% */ +import org.apache.commons.lang3.StringUtils; import org.chorem.pollen.persistence.entity.Poll; +import org.chorem.pollen.persistence.entity.PollenPrincipal; +import org.chorem.pollen.services.PollenTechnicalException; import org.nuiton.i18n.I18n; +import org.nuiton.topia.persistence.TopiaEntity; +import javax.mail.internet.InternetAddress; +import java.io.UnsupportedEncodingException; +import java.util.Collection; +import java.util.Collections; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -82,4 +91,29 @@ public class PollInvitationEmail extends PollenMail { public String getEndChoiceDate() { return formatDate(poll.getEndChoiceDate()); } + + @Override + public List<TopiaEntity> getEntitiesKey() { + return Collections.singletonList(poll); + } + + @Override + public String getFromName() { + return poll.getCreator().getName(); + } + + @Override + public Collection<InternetAddress> getReplyTo() { + Collection<InternetAddress> replyTo = Collections.emptyList(); + PollenPrincipal creator = getPoll().getCreator(); + if (StringUtils.isNotBlank(creator.getEmail())) { + try { + replyTo = Collections.singletonList(new InternetAddress(creator.getEmail(), creator.getName())); + } catch (UnsupportedEncodingException e) { + throw new PollenTechnicalException("Error on replyTo adresse", e); + } + } + + return replyTo; + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollReportEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollReportEmail.java index 3a6b2cb0..e87b6ebc 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollReportEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollReportEmail.java @@ -21,9 +21,12 @@ package org.chorem.pollen.services.service.mail; * #L% */ +import com.google.common.collect.Lists; import org.chorem.pollen.persistence.entity.Poll; import org.nuiton.i18n.I18n; +import org.nuiton.topia.persistence.TopiaEntity; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -41,4 +44,8 @@ public class PollReportEmail extends AbstractReportEmail<Poll> { return I18n.l(locale, "pollen.service.mail.PollReportEmail.subject", poll.getTitle()); } + @Override + public List<TopiaEntity> getEntitiesKey() { + return Lists.newArrayList(poll, report); + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollReportForAdminEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollReportForAdminEmail.java index dc57e16f..8efcd294 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollReportForAdminEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollReportForAdminEmail.java @@ -21,9 +21,12 @@ package org.chorem.pollen.services.service.mail; * #L% */ +import com.google.common.collect.Lists; import org.chorem.pollen.persistence.entity.Poll; import org.nuiton.i18n.I18n; +import org.nuiton.topia.persistence.TopiaEntity; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -41,4 +44,9 @@ public class PollReportForAdminEmail extends AbstractReportForAdminEmail<Poll> { return I18n.l(locale, "pollen.service.mail.PollReportForAdminEmail.subject", poll.getTitle()); } + @Override + public List<TopiaEntity> getEntitiesKey() { + return Lists.newArrayList(poll, report); + } + } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollVotePeriodEndedEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollVotePeriodEndedEmail.java index dd58e61b..d58ec1ca 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollVotePeriodEndedEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollVotePeriodEndedEmail.java @@ -23,7 +23,10 @@ package org.chorem.pollen.services.service.mail; import org.chorem.pollen.persistence.entity.Poll; import org.nuiton.i18n.I18n; +import org.nuiton.topia.persistence.TopiaEntity; +import java.util.Collections; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -53,4 +56,9 @@ public class PollVotePeriodEndedEmail extends PollenMail { public void setPoll(Poll poll) { this.poll = poll; } + + @Override + public List<TopiaEntity> getEntitiesKey() { + return Collections.singletonList(poll); + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollVotePeriodStartedEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollVotePeriodStartedEmail.java index 698408ab..b12521af 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollVotePeriodStartedEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollVotePeriodStartedEmail.java @@ -23,7 +23,10 @@ package org.chorem.pollen.services.service.mail; import org.chorem.pollen.persistence.entity.Poll; import org.nuiton.i18n.I18n; +import org.nuiton.topia.persistence.TopiaEntity; +import java.util.Collections; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -53,4 +56,9 @@ public class PollVotePeriodStartedEmail extends PollenMail { public void setPoll(Poll poll) { this.poll = poll; } + + @Override + public List<TopiaEntity> getEntitiesKey() { + return Collections.singletonList(poll); + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollVoteReminderEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollVoteReminderEmail.java index 5e344499..0e39e8de 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollVoteReminderEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollVoteReminderEmail.java @@ -23,7 +23,10 @@ package org.chorem.pollen.services.service.mail; import org.chorem.pollen.persistence.entity.Poll; import org.nuiton.i18n.I18n; +import org.nuiton.topia.persistence.TopiaEntity; +import java.util.Collections; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -53,4 +56,9 @@ public class PollVoteReminderEmail extends PollenMail { public void setPoll(Poll poll) { this.poll = poll; } + + @Override + public List<TopiaEntity> getEntitiesKey() { + return Collections.singletonList(poll); + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollenEmailKeyType.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollenEmailKeyType.java new file mode 100644 index 00000000..b7cbcb8e --- /dev/null +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollenEmailKeyType.java @@ -0,0 +1,51 @@ +package org.chorem.pollen.services.service.mail; + +import org.chorem.pollen.persistence.entity.Choice; +import org.chorem.pollen.persistence.entity.Comment; +import org.chorem.pollen.persistence.entity.Poll; +import org.chorem.pollen.persistence.entity.PollenPrincipal; +import org.chorem.pollen.persistence.entity.PollenUser; +import org.chorem.pollen.persistence.entity.Report; +import org.chorem.pollen.persistence.entity.Vote; +import org.chorem.pollen.services.PollenTechnicalException; +import org.nuiton.topia.persistence.TopiaEntity; + +import java.util.stream.Stream; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public enum PollenEmailKeyType { + + P(Poll.class), + C(Choice.class), + V(Vote.class), + U(PollenUser.class), + R(Report.class), + O(Comment.class), + E(PollenPrincipal.class); + + protected final Class<? extends TopiaEntity> type; + + + PollenEmailKeyType(Class<? extends TopiaEntity> type) { + this.type = type; + } + + public Class<? extends TopiaEntity> getType() { + return type; + } + + public static PollenEmailKeyType valueOfType(Class<? extends TopiaEntity> typeClass) { + return Stream.of(values()) + .filter(type -> type.getType().isAssignableFrom(typeClass)) + .findFirst() + .orElseThrow(() -> new PollenTechnicalException("unknown pollenEmailKeyType of " + typeClass)); + } + + public static PollenEmailKeyType valueOfEntity(TopiaEntity entity) { + return valueOfType(entity.getClass()); + } + + +} diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollenMail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollenMail.java index 66f30ce5..44378e90 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollenMail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollenMail.java @@ -24,9 +24,14 @@ package org.chorem.pollen.services.service.mail; import com.google.common.collect.Sets; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.builder.ReflectionToStringBuilder; +import org.nuiton.topia.persistence.TopiaEntity; +import javax.mail.internet.InternetAddress; import java.text.DateFormat; +import java.util.Collection; +import java.util.Collections; import java.util.Date; +import java.util.List; import java.util.Locale; import java.util.Set; import java.util.TimeZone; @@ -59,7 +64,7 @@ public abstract class PollenMail { protected String signing; - public PollenMail(Locale locale, TimeZone timeZone) { + public PollenMail(Locale locale, TimeZone timeZone){ this.locale = locale; this.timeZone = timeZone; } @@ -113,4 +118,14 @@ public abstract class PollenMail { public void setSigning(String signing) { this.signing = signing; } + + public String getFromName() { + return null; + } + + public abstract List<TopiaEntity> getEntitiesKey(); + + public Collection<InternetAddress> getReplyTo() { + return Collections.emptyList(); + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollenMailReturnContext.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollenMailReturnContext.java new file mode 100644 index 00000000..b2895fd3 --- /dev/null +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollenMailReturnContext.java @@ -0,0 +1,106 @@ +package org.chorem.pollen.services.service.mail; + +import org.chorem.pollen.persistence.entity.Choice; +import org.chorem.pollen.persistence.entity.Comment; +import org.chorem.pollen.persistence.entity.Poll; +import org.chorem.pollen.persistence.entity.PollenPrincipal; +import org.chorem.pollen.persistence.entity.PollenUser; +import org.chorem.pollen.persistence.entity.Report; +import org.nuiton.topia.persistence.TopiaEntity; + +import javax.mail.Message; +import java.util.List; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public class PollenMailReturnContext { + + protected Message message; + + protected PollenMailType mailType; + + protected Poll poll; + + protected Choice choice; + + protected PollenUser user; + + protected Report report; + + protected Comment comment; + + protected PollenPrincipal principal; + + protected static <E extends TopiaEntity> E findEntity(List<TopiaEntity> entities, Class<E> type) { + return entities.stream() + .filter(type::isInstance) + .map(type::cast) + .findFirst() + .orElse(null); + } + + public Message getMessage() { + return message; + } + + public void setMessage(Message message) { + this.message = message; + } + + public PollenMailType getMailType() { + return mailType; + } + + public void setMailType(PollenMailType mailType) { + this.mailType = mailType; + } + + public Poll getPoll() { + return poll; + } + + public void setPoll(Poll poll) { + this.poll = poll; + } + + public Choice getChoice() { + return choice; + } + + public void setChoice(Choice choice) { + this.choice = choice; + } + + public PollenUser getUser() { + return user; + } + + public void setUser(PollenUser user) { + this.user = user; + } + + public Report getReport() { + return report; + } + + public void setReport(Report report) { + this.report = report; + } + + public Comment getComment() { + return comment; + } + + public void setComment(Comment comment) { + this.comment = comment; + } + + public PollenPrincipal getPrincipal() { + return principal; + } + + public void setPrincipal(PollenPrincipal principal) { + this.principal = principal; + } +} diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollenMailType.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollenMailType.java new file mode 100644 index 00000000..11d22bcf --- /dev/null +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollenMailType.java @@ -0,0 +1,75 @@ +package org.chorem.pollen.services.service.mail; + +import org.chorem.pollen.services.PollenTechnicalException; + +import java.util.function.BiConsumer; +import java.util.stream.Stream; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public enum PollenMailType { + + cha(ChoiceAddedEmail.class, (service, context) -> service.noAction()), + chd(ChoiceDeletedEmail.class, (service, context) -> service.noAction()), + che(ChoiceEditedEmail.class, (service, context) -> service.noAction()), + chr(ChoiceReportEmail.class, (service, context) -> service.noAction()), + chrfa(ChoiceReportForAdminEmail.class, (service, context) -> service.noAction()), + coa(CommentAddedEmail.class, (service, context) -> service.noAction()), + cod(CommentDeletedEmail.class, (service, context) -> service.noAction()), + coe(CommentEditedEmail.class, (service, context) -> service.noAction()), + cor(CommentReportEmail.class, (service, context) -> service.noAction()), + corfa(CommentReportForAdminEmail.class, (service, context) -> service.noAction()), + emv(ExceedingMaxVotersEmail.class, (service, context) -> service.noAction()), + fb(FeedbackEmail.class, (service, context) -> service.noAction()), + lp(LostPasswordEmail.class, (service, context) -> service.noAction()), + pcpe(PollChoicePeriodEndedEmail.class, (service, context) -> service.noAction()), + pcps(PollChoicePeriodStartedEmail.class, (service, context) -> service.noAction()), + pcl(PollClosedEmail.class, (service, context) -> service.noAction()), + pcr(PollCreatedEmail.class, (service, context) -> service.noAction()), + per(PollEndReminderEmail.class, (service, context) -> service.noAction()), + pi(PollInvitationEmail.class, (service, context) -> service.forwardToCreatorAction(context.getPoll(), context.getMessage())), + pr(PollReportEmail.class, (service, context) -> service.noAction()), + prfa(PollReportForAdminEmail.class, (service, context) -> service.noAction()), + pvpe(PollVotePeriodEndedEmail.class, (service, context) -> service.noAction()), + pvps(PollVotePeriodStartedEmail.class, (service, context) -> service.noAction()), + pvr(PollVoteReminderEmail.class, (service, context) -> service.noAction()), + rv(ResendValidationEmail.class, (service, context) -> service.noAction()), + rpi(RestrictedPollInvitationEmail.class, (service, context) -> service.forwardToCreatorAction(context.getPoll(), context.getMessage())), + uac(UserAccountCreatedEmail.class, (service, context) -> service.noAction()), + uacfp(UserAccountCreatedFromProviderEmail.class, (service, context) -> service.noAction()), + uad(UserAccountDeletedEmail.class, (service, context) -> service.noAction()), + uae(UserAccountEditedEmail.class, (service, context) -> service.noAction()), + uaeaa(UserAccountEmailAddressAddedEmail.class, (service, context) -> service.noAction()), + uaev(UserAccountEmailValidatedEmail.class, (service, context) -> service.noAction()), + uapc(UserAccountPasswordChangedEmail.class, (service, context) -> service.noAction()), + va(VoteAddedEmail.class, (service, context) -> service.noAction()), + vd(VoteDeletedEmail.class, (service, context) -> service.noAction()), + ve(VoteEditedEmail.class, (service, context) -> service.noAction()) + ; + + protected final Class<? extends PollenMail> emailType; + + protected final BiConsumer<MailBoxService, PollenMailReturnContext> action; + + PollenMailType(Class<? extends PollenMail> emailType, BiConsumer<MailBoxService, PollenMailReturnContext> action) { + this.emailType = emailType; + this.action = action; + } + + + public Class<? extends PollenMail> getEmailType() { + return emailType; + } + + public static PollenMailType valueOfMail(PollenMail pollenMail) { + return Stream.of(values()) + .filter(type -> type.getEmailType().isInstance(pollenMail)) + .findFirst() + .orElseThrow(() -> new PollenTechnicalException("unknown pollenEmailType of " + pollenMail.getClass())); + } + + public BiConsumer<MailBoxService, PollenMailReturnContext> getAction() { + return action; + } +} diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/ResendValidationEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/ResendValidationEmail.java index 1cbe08ea..77151bbc 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/ResendValidationEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/ResendValidationEmail.java @@ -23,7 +23,10 @@ package org.chorem.pollen.services.service.mail; import org.chorem.pollen.persistence.entity.PollenUser; import org.nuiton.i18n.I18n; +import org.nuiton.topia.persistence.TopiaEntity; +import java.util.Collections; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -64,4 +67,9 @@ public class ResendValidationEmail extends PollenMail { this.validateUrl = validateUrl; } + @Override + public List<TopiaEntity> getEntitiesKey() { + return Collections.singletonList(user); + } + } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/RestrictedPollInvitationEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/RestrictedPollInvitationEmail.java index 7e4ea728..e71ab67a 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/RestrictedPollInvitationEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/RestrictedPollInvitationEmail.java @@ -21,10 +21,19 @@ package org.chorem.pollen.services.service.mail; * #L% */ +import com.google.common.collect.Lists; +import org.apache.commons.lang3.StringUtils; import org.chorem.pollen.persistence.entity.Poll; import org.chorem.pollen.persistence.entity.PollenPrincipal; +import org.chorem.pollen.services.PollenTechnicalException; import org.nuiton.i18n.I18n; +import org.nuiton.topia.persistence.TopiaEntity; +import javax.mail.internet.InternetAddress; +import java.io.UnsupportedEncodingException; +import java.util.Collection; +import java.util.Collections; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -102,4 +111,29 @@ public class RestrictedPollInvitationEmail extends PollenMail { public String getEndChoiceDate() { return formatDate(poll.getEndChoiceDate()); } + + @Override + public List<TopiaEntity> getEntitiesKey() { + return Lists.newArrayList(poll, principal); + } + + @Override + public String getFromName() { + return poll.getCreator().getName(); + } + + @Override + public Collection<InternetAddress> getReplyTo() { + Collection<InternetAddress> replyTo = Collections.emptyList(); + PollenPrincipal creator = getPoll().getCreator(); + if (StringUtils.isNotBlank(creator.getEmail())) { + try { + replyTo = Collections.singletonList(new InternetAddress(creator.getEmail(), creator.getName())); + } catch (UnsupportedEncodingException e) { + throw new PollenTechnicalException("Error on replyTo adresse", e); + } + } + + return replyTo; + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountCreatedEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountCreatedEmail.java index c97f44e3..fcebac55 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountCreatedEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountCreatedEmail.java @@ -23,7 +23,10 @@ package org.chorem.pollen.services.service.mail; import org.chorem.pollen.persistence.entity.PollenUser; import org.nuiton.i18n.I18n; +import org.nuiton.topia.persistence.TopiaEntity; +import java.util.Collections; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -64,4 +67,9 @@ public class UserAccountCreatedEmail extends PollenMail { this.validateUrl = validateUrl; } + @Override + public List<TopiaEntity> getEntitiesKey() { + return Collections.singletonList(user); + } + } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountCreatedFromProviderEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountCreatedFromProviderEmail.java index a07586b0..86e13fa7 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountCreatedFromProviderEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountCreatedFromProviderEmail.java @@ -23,7 +23,10 @@ package org.chorem.pollen.services.service.mail; import org.chorem.pollen.persistence.entity.PollenUser; import org.nuiton.i18n.I18n; +import org.nuiton.topia.persistence.TopiaEntity; +import java.util.Collections; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -71,4 +74,9 @@ public class UserAccountCreatedFromProviderEmail extends PollenMail { public void setProfileUrl(String profileUrl) { this.profileUrl = profileUrl; } + + @Override + public List<TopiaEntity> getEntitiesKey() { + return Collections.singletonList(user); + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountDeletedEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountDeletedEmail.java index f80a9b0d..764ed6ab 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountDeletedEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountDeletedEmail.java @@ -23,7 +23,10 @@ package org.chorem.pollen.services.service.mail; import org.chorem.pollen.persistence.entity.PollenUser; import org.nuiton.i18n.I18n; +import org.nuiton.topia.persistence.TopiaEntity; +import java.util.Collections; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -51,4 +54,9 @@ public class UserAccountDeletedEmail extends PollenMail { public void setUser(PollenUser user) { this.user = user; } + + @Override + public List<TopiaEntity> getEntitiesKey() { + return Collections.singletonList(user); + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountEditedEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountEditedEmail.java index df5f8859..da930ab3 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountEditedEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountEditedEmail.java @@ -23,7 +23,10 @@ package org.chorem.pollen.services.service.mail; import org.chorem.pollen.persistence.entity.PollenUser; import org.nuiton.i18n.I18n; +import org.nuiton.topia.persistence.TopiaEntity; +import java.util.Collections; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -70,4 +73,9 @@ public class UserAccountEditedEmail extends PollenMail { public void setPassword(String password) { this.password = password; } + + @Override + public List<TopiaEntity> getEntitiesKey() { + return Collections.singletonList(user); + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountEmailAddressAddedEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountEmailAddressAddedEmail.java index 69402fa7..754ad9bc 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountEmailAddressAddedEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountEmailAddressAddedEmail.java @@ -23,7 +23,10 @@ package org.chorem.pollen.services.service.mail; import org.chorem.pollen.persistence.entity.PollenUser; import org.nuiton.i18n.I18n; +import org.nuiton.topia.persistence.TopiaEntity; +import java.util.Collections; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -61,4 +64,9 @@ public class UserAccountEmailAddressAddedEmail extends PollenMail { this.validateUrl = validateUrl; } + @Override + public List<TopiaEntity> getEntitiesKey() { + return Collections.singletonList(user); + } + } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountEmailValidatedEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountEmailValidatedEmail.java index 43c2e057..b870ce91 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountEmailValidatedEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountEmailValidatedEmail.java @@ -23,7 +23,10 @@ package org.chorem.pollen.services.service.mail; import org.chorem.pollen.persistence.entity.PollenUser; import org.nuiton.i18n.I18n; +import org.nuiton.topia.persistence.TopiaEntity; +import java.util.Collections; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -79,4 +82,9 @@ public class UserAccountEmailValidatedEmail extends PollenMail { public void setPassword(String password) { this.password = password; } + + @Override + public List<TopiaEntity> getEntitiesKey() { + return Collections.singletonList(user); + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountPasswordChangedEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountPasswordChangedEmail.java index 7a2b7cbf..e697c341 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountPasswordChangedEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountPasswordChangedEmail.java @@ -23,7 +23,10 @@ package org.chorem.pollen.services.service.mail; import org.chorem.pollen.persistence.entity.PollenUser; import org.nuiton.i18n.I18n; +import org.nuiton.topia.persistence.TopiaEntity; +import java.util.Collections; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -79,4 +82,9 @@ public class UserAccountPasswordChangedEmail extends PollenMail { public void setPassword(String password) { this.password = password; } + + @Override + public List<TopiaEntity> getEntitiesKey() { + return Collections.singletonList(user); + } } diff --git a/pollen-services/src/main/resources/i18n/pollen-services_en_GB.properties b/pollen-services/src/main/resources/i18n/pollen-services_en_GB.properties index 3bb4345c..2458d219 100644 --- a/pollen-services/src/main/resources/i18n/pollen-services_en_GB.properties +++ b/pollen-services/src/main/resources/i18n/pollen-services_en_GB.properties @@ -15,13 +15,18 @@ pollen.configuration.deleteObsoleteSessionTokensCronSchedule=Time between two cr pollen.configuration.feedback.locale=locale to send feedback pollen.configuration.feedback.mails=mails to send feedback pollen.configuration.logConfigurationFile=Path to log configuration file +pollen.configuration.mailBox.cronSchedule=Time between two Pollen mail box check +pollen.configuration.mailBox.host=Pollen mail box server +pollen.configuration.mailBox.password=Pollen mail box password +pollen.configuration.mailBox.protocol=Pollen mail box protocol +pollen.configuration.mailBox.user=Pollen mail box login pollen.configuration.maxVoters=Maximum number of votes for standar poll pollen.configuration.registration.emailAddressPattern=Regular expression that the user email address must match for registration pollen.configuration.report.maxScore=Maximum score for reporting before administrators are notified pollen.configuration.resendEmailsCronSchedule=Time between two cron jobs of email resending pollen.configuration.resource.maxSize=Maximum size of pollen resource pollen.configuration.resource.preview.max=Maximum dimension of image preview -pollen.configuration.secret= +pollen.configuration.secret=secret key for authentification tokens pollen.configuration.sendEndPollRemindersCronSchedule=Time between two cron jobs of poll end reminder sending pollen.configuration.sessionTimeoutDelay=Inactivity delay before invalidate the session of a user (in seconds) pollen.configuration.smptHost=Smtp Host @@ -156,6 +161,7 @@ pollen.service.mail.VoteAddedEmail.subject=[Pollen] A vote was added in poll %s pollen.service.mail.VoteDeletedEmail.subject=[Pollen] A vote was deleted in poll %s pollen.service.mail.VoteEditedEmail.subject=[Pollen] A vote was edited in poll %s pollen.service.mail.feedbackEmail.subject=[Pollen] feedback - %s +pollen.service.mail.from.via=%s (via %s) pollen.service.mail.loginProvider.amazon=Amazon pollen.service.mail.loginProvider.facebook=Facebook pollen.service.mail.loginProvider.flickr=Flickr @@ -175,3 +181,5 @@ pollen.service.mail.loginProvider.stackexchange=Stack Exchange pollen.service.mail.loginProvider.twitter=Twitter pollen.service.mail.loginProvider.yahoo=Yahoo pollen.service.mail.loginProvider.yammer=Yammer +pollen.service.mailBox.forward.poll.body=Attached is the email received in return for the invitation to your poll. +pollen.service.mailBox.forward.poll.subject=Mail back to your poll diff --git a/pollen-services/src/main/resources/i18n/pollen-services_fr_FR.properties b/pollen-services/src/main/resources/i18n/pollen-services_fr_FR.properties index fc54e488..03c92974 100644 --- a/pollen-services/src/main/resources/i18n/pollen-services_fr_FR.properties +++ b/pollen-services/src/main/resources/i18n/pollen-services_fr_FR.properties @@ -15,13 +15,18 @@ pollen.configuration.deleteObsoleteSessionTokensCronSchedule=Intervalle entre de pollen.configuration.feedback.locale=La locale pour envoyer les retours utlisateur pollen.configuration.feedback.mails=Courriel destinataires des retours utilisateur pollen.configuration.logConfigurationFile=Chemin vers le fichier de configuration des logs +pollen.configuration.mailBox.cronSchedule=Intervalle entre deux verification de la boite mail de Pollen +pollen.configuration.mailBox.host=serveur de la boite mail de Pollen +pollen.configuration.mailBox.password=Mot de passe de la boite mail de Pollen +pollen.configuration.mailBox.protocol=protocol de la boite mail de Pollen +pollen.configuration.mailBox.user=Nom d'utilisateur de la boite mail de Pollen pollen.configuration.maxVoters=Nombre maximum de votes pris en compte pour de sondage standard pollen.configuration.registration.emailAddressPattern=Expression régulière que doivent vérifier les adresses email des utilisateurs lors de l'inscription pollen.configuration.report.maxScore=Score maximum pour un signalement avant que les administrateurs soient avertis pollen.configuration.resendEmailsCronSchedule=Intervalle entre deux lancements de la tâche de renvoi des emails en erreur pollen.configuration.resource.maxSize=Taille maximal pour un fichier de resource de Pollen pollen.configuration.resource.preview.max=Dimension maximal de la prévisualisation d'un image -pollen.configuration.secret= +pollen.configuration.secret=Clé secret pour chiffer le jetons d'authnetification pollen.configuration.sendEndPollRemindersCronSchedule=Intervalle entre deux lancements de la tâche d'envoi de mails de rappel de fin de sondage pollen.configuration.sessionTimeoutDelay=Temps autorisé d'inactivité avant d'invalider une session utilisateur (en secondes) pollen.configuration.smptHost=Hôte smtp @@ -156,6 +161,7 @@ pollen.service.mail.VoteAddedEmail.subject=[Pollen] Un nouveau vote a été ajou pollen.service.mail.VoteDeletedEmail.subject=[Pollen] Un vote a été supprimé sur le sondage %s pollen.service.mail.VoteEditedEmail.subject=[Pollen] Un vote a été modifié du sondage %s pollen.service.mail.feedbackEmail.subject=[Pollen] retour utilisateur - %s +pollen.service.mail.from.via=%s (via %s) pollen.service.mail.loginProvider.amazon=Amazon pollen.service.mail.loginProvider.facebook=Facebook pollen.service.mail.loginProvider.flickr=Flickr @@ -175,3 +181,5 @@ pollen.service.mail.loginProvider.stackexchange=Stack Exchange pollen.service.mail.loginProvider.twitter=Twitter pollen.service.mail.loginProvider.yahoo=Yahoo pollen.service.mail.loginProvider.yammer=Yammer +pollen.service.mailBox.forward.poll.body=Ci-joint le mail reçu en retour de l'invitation à votre sondage. +pollen.service.mailBox.forward.poll.subject=[Pollen] Mail de retour à votre sondage diff --git a/pom.xml b/pom.xml index 583581cd..fe675af0 100644 --- a/pom.xml +++ b/pom.xml @@ -285,6 +285,12 @@ <version>1.4</version> </dependency> + <dependency> + <groupId>javax.mail</groupId> + <artifactId>mail</artifactId> + <version>1.4.7</version> + </dependency> + <!-- Guava --> <dependency> <groupId>com.google.guava</groupId> -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.