branch develop updated (6c7425d1 -> a50c9dce)
This is an automated email from the git hooks/post-receive script. New change to branch develop in repository pollen. See https://gitlab.nuiton.org/chorem/pollen.git from 6c7425d1 correction de la migration new a50c9dce gérer les action suite au retour de mail envoyer par pollen (refs #168) The 1 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: 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) Summary of changes: .../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 +++ ...eSessionTokensJob.java => CheckMailBoxJob.java} | 10 +- .../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, 1024 insertions(+), 14 deletions(-) create mode 100644 pollen-persistence/src/main/resources/db/migration/h2/V3_1_0_8__add_from_and_replyTo_mail.sql create mode 100644 pollen-persistence/src/main/resources/db/migration/postgresql/V3_1_0_8__add_from_and_replyTo_mail.sql copy pollen-services/src/main/java/org/chorem/pollen/services/job/{DeleteObsoleteSessionTokensJob.java => CheckMailBoxJob.java} (58%) create mode 100644 pollen-services/src/main/java/org/chorem/pollen/services/service/mail/MailBoxService.java create mode 100644 pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollenEmailKeyType.java create mode 100644 pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollenMailReturnContext.java create mode 100644 pollen-services/src/main/java/org/chorem/pollen/services/service/mail/PollenMailType.java -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.
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>.
participants (1)
-
chorem.org scm