private void reprocess(MailRepository repository, Mail mail) { try { targetProcessor.ifPresent(mail::setState); mailQueue.enQueue(mail); repository.remove(mail); } catch (Exception e) { throw new RuntimeException("Error encountered while reprocessing mail " + mail.getName(), e); } } }
@Override public void sendMail(Mail mail, String state, long delay, TimeUnit unit) throws MessagingException { mail.setAttribute(Mail.SENT_BY_MAILET, "true"); mail.setState(state); rootMailQueue.enQueue(mail, delay, unit); }
@Override public void sendMail(Mail mail, String state) throws MessagingException { mail.setAttribute(Mail.SENT_BY_MAILET, "true"); mail.setState(state); rootMailQueue.enQueue(mail); }
private void serviceSingleServer(Mail mail, String originalName, Map.Entry<Domain, Collection<MailAddress>> entry) { if (configuration.isDebug()) { LOGGER.debug("Sending mail to {} on host {}", entry.getValue(), entry.getKey()); } mail.setRecipients(entry.getValue()); mail.setName(originalName + NAME_JUNCTION + entry.getKey().name()); try { queue.enQueue(mail); } catch (MailQueueException e) { LOGGER.error("Unable to queue mail {} for recipients {}", mail.getName(), mail.getRecipients(), e); } }
private void serviceWithGateway(Mail mail) { if (configuration.isDebug()) { LOGGER.debug("Sending mail to {} via {}", mail.getRecipients(), configuration.getGatewayServer()); } try { queue.enQueue(mail); } catch (MailQueueException e) { LOGGER.error("Unable to queue mail {} for recipients {}", mail.getName(), mail.getRecipients(), e); } }
private void reAttemptDelivery(Mail mail, int retries) throws MailQueue.MailQueueException { LOGGER.debug("Storing message {} into outgoing after {} retries", mail.getName(), retries); DeliveryRetriesHelper.incrementRetries(mail); mail.setLastUpdated(dateSupplier.get()); // Something happened that will delay delivery. Store it back in the retry repository. long delay = getNextDelay(DeliveryRetriesHelper.retrieveRetries(mail)); if (configuration.isUsePriority()) { // Use lowest priority for retries. See JAMES-1311 mail.setAttribute(MailPrioritySupport.MAIL_PRIORITY, MailPrioritySupport.LOW_PRIORITY); } queue.enQueue(mail, delay, TimeUnit.MILLISECONDS); }
public void send(Mail mail, MailMetadata metadata) throws MailQueueException { mail.setAttribute(MailMetadata.MAIL_METADATA_MESSAGE_ID_ATTRIBUTE, metadata.getMessageId().serialize()); mail.setAttribute(MailMetadata.MAIL_METADATA_USERNAME_ATTRIBUTE, metadata.getUsername()); queue.enQueue(mail); } }
@Test public void bounceShouldEnqueueEmailWithRootState() throws Exception { MailImpl mail = new MailImpl(); mail.setSender(mailAddress); mail.setRecipients(ImmutableList.of(mailAddress)); mail.setMessage(MimeMessageUtil.defaultMimeMessage()); testee.bounce(mail, "message"); ArgumentCaptor<Mail> mailArgumentCaptor = ArgumentCaptor.forClass(Mail.class); verify(spoolMailQueue).enQueue(mailArgumentCaptor.capture()); verifyNoMoreInteractions(spoolMailQueue); assertThat(mailArgumentCaptor.getValue().getState()).isEqualTo(Mail.DEFAULT); }
@Test public void sendMailShouldEnqueueEmailWithRootState() throws Exception { MailImpl mail = new MailImpl(); mail.setSender(mailAddress); mail.setRecipients(ImmutableList.of(mailAddress)); mail.setMessage(MimeMessageUtil.defaultMimeMessage()); testee.sendMail(mail); ArgumentCaptor<Mail> mailArgumentCaptor = ArgumentCaptor.forClass(Mail.class); verify(spoolMailQueue).enQueue(mailArgumentCaptor.capture()); verifyNoMoreInteractions(spoolMailQueue); assertThat(mailArgumentCaptor.getValue().getState()).isEqualTo(Mail.DEFAULT); }
@Test public void sendMailShouldEnqueueEmailWithOtherStateWhenSpecified() throws Exception { MailImpl mail = new MailImpl(); mail.setSender(mailAddress); mail.setRecipients(ImmutableList.of(mailAddress)); mail.setMessage(MimeMessageUtil.defaultMimeMessage()); String other = "other"; testee.sendMail(mail, other); ArgumentCaptor<Mail> mailArgumentCaptor = ArgumentCaptor.forClass(Mail.class); verify(spoolMailQueue).enQueue(mailArgumentCaptor.capture()); verifyNoMoreInteractions(spoolMailQueue); assertThat(mailArgumentCaptor.getValue().getState()).isEqualTo(other); }
@Test public void sendMailForMessageShouldEnqueueEmailWithRootState() throws Exception { MimeMessage message = MimeMessageBuilder.mimeMessageBuilder() .addFrom(mailAddress.asString()) .addToRecipient(mailAddress.asString()) .setText("Simple text") .build(); testee.sendMail(message); ArgumentCaptor<Mail> mailArgumentCaptor = ArgumentCaptor.forClass(Mail.class); verify(spoolMailQueue).enQueue(mailArgumentCaptor.capture()); verifyNoMoreInteractions(spoolMailQueue); assertThat(mailArgumentCaptor.getValue().getState()).isEqualTo(Mail.DEFAULT); }
@Test public void sendMailShouldEnqueueEmailWithRootStateAndDelayWhenSpecified() throws Exception { MailImpl mail = new MailImpl(); mail.setSender(mailAddress); mail.setRecipients(ImmutableList.of(mailAddress)); mail.setMessage(MimeMessageUtil.defaultMimeMessage()); testee.sendMail(mail, 5, TimeUnit.MINUTES); ArgumentCaptor<Mail> mailArgumentCaptor = ArgumentCaptor.forClass(Mail.class); ArgumentCaptor<Long> delayArgumentCaptor = ArgumentCaptor.forClass(Long.class); ArgumentCaptor<TimeUnit> timeUnitArgumentCaptor = ArgumentCaptor.forClass(TimeUnit.class); verify(spoolMailQueue).enQueue(mailArgumentCaptor.capture(), delayArgumentCaptor.capture(), timeUnitArgumentCaptor.capture()); verifyNoMoreInteractions(spoolMailQueue); softly.assertThat(mailArgumentCaptor.getValue().getState()).isEqualTo(Mail.DEFAULT); softly.assertThat(delayArgumentCaptor.getValue()).isEqualTo(5L); softly.assertThat(timeUnitArgumentCaptor.getValue()).isEqualTo(TimeUnit.MINUTES); }
@Test public void sendMailShouldEnqueueEmailWithOtherStateAndDelayWhenSpecified() throws Exception { MailImpl mail = new MailImpl(); mail.setSender(mailAddress); mail.setRecipients(ImmutableList.of(mailAddress)); mail.setMessage(MimeMessageUtil.defaultMimeMessage()); String other = "other"; testee.sendMail(mail, other, 5, TimeUnit.MINUTES); ArgumentCaptor<Mail> mailArgumentCaptor = ArgumentCaptor.forClass(Mail.class); ArgumentCaptor<Long> delayArgumentCaptor = ArgumentCaptor.forClass(Long.class); ArgumentCaptor<TimeUnit> timeUnitArgumentCaptor = ArgumentCaptor.forClass(TimeUnit.class); verify(spoolMailQueue).enQueue(mailArgumentCaptor.capture(), delayArgumentCaptor.capture(), timeUnitArgumentCaptor.capture()); verifyNoMoreInteractions(spoolMailQueue); softly.assertThat(mailArgumentCaptor.getValue().getState()).isEqualTo(other); softly.assertThat(delayArgumentCaptor.getValue()).isEqualTo(5L); softly.assertThat(timeUnitArgumentCaptor.getValue()).isEqualTo(TimeUnit.MINUTES); }
@Test public void sendMailForMessageAndEnvelopeShouldEnqueueEmailWithOtherStateWhenSpecified() throws Exception { MimeMessage message = MimeMessageBuilder.mimeMessageBuilder() .addFrom(mailAddress.asString()) .addToRecipient(mailAddress.asString()) .setText("Simple text") .build(); MailAddress sender = mailAddress; ImmutableList<MailAddress> recipients = ImmutableList.of(mailAddress); String otherState = "other"; testee.sendMail(sender, recipients, message, otherState); ArgumentCaptor<Mail> mailArgumentCaptor = ArgumentCaptor.forClass(Mail.class); verify(spoolMailQueue).enQueue(mailArgumentCaptor.capture()); verifyNoMoreInteractions(spoolMailQueue); assertThat(mailArgumentCaptor.getValue().getState()).isEqualTo(otherState); }
@Test public void sendMailForMessageAndEnvelopeShouldEnqueueEmailWithRootState() throws Exception { MimeMessage message = MimeMessageBuilder.mimeMessageBuilder() .addFrom(mailAddress.asString()) .addToRecipient(mailAddress.asString()) .setText("Simple text") .build(); MailAddress sender = mailAddress; ImmutableList<MailAddress> recipients = ImmutableList.of(mailAddress); testee.sendMail(sender, recipients, message); ArgumentCaptor<Mail> mailArgumentCaptor = ArgumentCaptor.forClass(Mail.class); verify(spoolMailQueue).enQueue(mailArgumentCaptor.capture()); verifyNoMoreInteractions(spoolMailQueue); assertThat(mailArgumentCaptor.getValue().getState()).isEqualTo(Mail.DEFAULT); }
@Test public void deliveryTemporaryFailureShouldRetryDelivery() throws Exception { FakeMail fakeMail = FakeMail.builder().state(Mail.DEFAULT).build(); Exception exception = new Exception(); when(mailDelivrer.deliver(fakeMail)).thenReturn(ExecutionResult.temporaryFailure(exception)); testee.attemptDelivery(fakeMail); verify(mailQueue).enQueue(FakeMail.builder() .attribute(DeliveryRetriesHelper.DELIVERY_RETRY_COUNT, 1) .state(Mail.ERROR) .lastUpdated(FIXED_DATE) .build(), 1000, TimeUnit.MILLISECONDS); verifyNoMoreInteractions(mailQueue); }
@Test public void sendMailForMailShouldEnqueueEmailWithDefaults() throws Exception { MimeMessage message = MimeMessageBuilder.mimeMessageBuilder() .addFrom(mailAddress.asString()) .addToRecipient(mailAddress.asString()) .setText("Simple text") .build(); testee.sendMail(FakeMail.builder() .sender(MailAddressFixture.SENDER) .recipient(MailAddressFixture.RECIPIENT1) .mimeMessage(message) .build()); ArgumentCaptor<Mail> mailArgumentCaptor = ArgumentCaptor.forClass(Mail.class); verify(spoolMailQueue).enQueue(mailArgumentCaptor.capture()); verifyNoMoreInteractions(spoolMailQueue); assertThat(mailArgumentCaptor.getValue().getState()).isEqualTo(Mail.DEFAULT); } }
@Test public void sendMailForMailShouldEnqueueEmailWithOtherStateWhenSpecified() throws Exception { MimeMessage message = MimeMessageBuilder.mimeMessageBuilder() .addFrom(mailAddress.asString()) .addToRecipient(mailAddress.asString()) .setText("Simple text") .build(); String otherState = "other"; testee.sendMail(FakeMail.builder() .sender(MailAddressFixture.SENDER) .recipient(MailAddressFixture.RECIPIENT1) .mimeMessage(message) .state(otherState) .build()); ArgumentCaptor<Mail> mailArgumentCaptor = ArgumentCaptor.forClass(Mail.class); verify(spoolMailQueue).enQueue(mailArgumentCaptor.capture()); verifyNoMoreInteractions(spoolMailQueue); assertThat(mailArgumentCaptor.getValue().getState()).isEqualTo(otherState); }
@Test public void deliveryTemporaryFailureShouldResetDeliveryCountOnNonErrorState() throws Exception { FakeMail fakeMail = FakeMail.builder() .state(Mail.DEFAULT) .attribute(DeliveryRetriesHelper.DELIVERY_RETRY_COUNT, 5) .build(); Exception exception = new Exception(); when(mailDelivrer.deliver(fakeMail)).thenReturn(ExecutionResult.temporaryFailure(exception)); testee.attemptDelivery(fakeMail); verify(mailQueue).enQueue(FakeMail.builder() .attribute(DeliveryRetriesHelper.DELIVERY_RETRY_COUNT, 1) .state(Mail.ERROR) .lastUpdated(FIXED_DATE) .build(), 1000, TimeUnit.MILLISECONDS); verifyNoMoreInteractions(mailQueue); } }
@Test public void deliveryTemporaryFailureShouldRetryDeliveryWithRightDelay() throws Exception { FakeMail fakeMail = FakeMail.builder() .state(Mail.ERROR) .attribute(DeliveryRetriesHelper.DELIVERY_RETRY_COUNT, 2) .build(); Exception exception = new Exception(); when(mailDelivrer.deliver(fakeMail)).thenReturn(ExecutionResult.temporaryFailure(exception)); testee.attemptDelivery(fakeMail); verify(mailQueue).enQueue(FakeMail.builder() .attribute(DeliveryRetriesHelper.DELIVERY_RETRY_COUNT, 3) .state(Mail.ERROR) .lastUpdated(FIXED_DATE) .build(), 3000, TimeUnit.MILLISECONDS); verifyNoMoreInteractions(mailQueue); }