private boolean senderMatchSessionUser(MaybeSender maybeSender, SMTPSession session) { Preconditions.checkArgument(!maybeSender.isNullSender()); String authUser = session.getUser().toLowerCase(Locale.US); String username = getUser(maybeSender.get()); return username.equals(authUser); }
private boolean belongsToLocalDomain(MaybeSender maybeSender) { Preconditions.checkArgument(!maybeSender.isNullSender()); return isLocalDomain(maybeSender.get().getDomain()); }
@Override public Collection<MailAddress> match(Mail mail) { try { if (mail.hasSender()) { recipientRewriteTable.getMappings(mail.getMaybeSender().get().getLocalPart(), mail.getMaybeSender().get().getDomain()); } } catch (RecipientRewriteTable.TooManyMappingException e) { return mail.getRecipients(); } catch (Exception e) { LoggerFactory.getLogger(IsSenderInRRTLoop.class).warn("Error while executing RRT"); } return ImmutableList.of(); } }
public VacationReply build() throws MessagingException { Preconditions.checkState(eitherReasonOrMime()); ActionUtils.detectAndHandleLocalLooping(originalMail, context, "vacation"); MimeMessage reply = (MimeMessage) originalMail.getMessage().reply(false); reply.setSubject(generateNotificationSubject()); reply.setContent(generateNotificationContent()); return new VacationReply(retrieveOriginalSender(), ImmutableList.of(originalMail.getMaybeSender().get()), reply); }
@Test void getShouldThrowWhenNullSender() { assertThatThrownBy(() -> MaybeSender.nullSender().get()) .isInstanceOf(NoSuchElementException.class); }
@Test void getShouldThrowWhenNullSender() { assertThatThrownBy(() -> MaybeSender.nullSender().get()) .isInstanceOf(NoSuchElementException.class); }
MailAddress senderMailAddress = mail.getMaybeSender().get(); String senderUser = senderMailAddress.getLocalPart().toLowerCase(Locale.US); Domain senderHost = senderMailAddress.getDomain();
@Test void getShouldReturnWrappedValue() { assertThat(MaybeSender.of(mailAddress).get()) .isEqualTo(mailAddress); }
@Test void getShouldReturnWrappedValue() { assertThat(MaybeSender.of(mailAddress).get()) .isEqualTo(mailAddress); }
private void doService(Mail mail) throws MessagingException { if (mail.hasSender()) { MailAddress sender = mail.getMaybeSender().get(); String username = retrieveUser(sender); mailboxAppender.append(mail.getMessage(), username, folder); LOGGER.error("Local delivery with ToSenderFolder mailet for mail {} with sender {} in folder {}", mail.getName(), sender, folder); } }
return; MailAddress senderMailAddress = mail.getMaybeSender().get(); if (!getMailetContext().isLocalEmail(senderMailAddress)) {
public CompletableFuture<Void> manageVacation(MailAddress recipient, Mail processedMail, ZonedDateTime processingDate) { AccountId accountId = AccountId.fromString(recipient.toString()); return CompletableFutureUtil.combine( vacationRepository.retrieveVacation(accountId), notificationRegistry.isRegistered( AccountId.fromString(recipient.toString()), RecipientId.fromMailAddress(processedMail.getMaybeSender().get())), (vacation, alreadySent) -> sendNotificationIfRequired(recipient, processedMail, processingDate, vacation, alreadySent)) .thenCompose(Function.identity()); }
/** * Generates a bounce mail that is a bounce of the original message. * * @param bounceText the text to be prepended to the message to describe the bounce * condition * @return the bounce mail * @throws MessagingException if the bounce mail could not be created */ private MailImpl rawBounce(Mail mail, String bounceText) throws MessagingException { Preconditions.checkArgument(mail.hasSender(), "Mail should have a sender"); // This sends a message to the james component that is a bounce of the sent message MimeMessage original = mail.getMessage(); MimeMessage reply = (MimeMessage) original.reply(false); reply.setSubject("Re: " + original.getSubject()); reply.setSentDate(new Date()); Collection<MailAddress> recipients = mail.getMaybeSender().asList(); MailAddress sender = mail.getMaybeSender().get(); reply.setRecipient(Message.RecipientType.TO, new InternetAddress(mail.getMaybeSender().asString())); reply.setFrom(new InternetAddress(mail.getRecipients().iterator().next().toString())); reply.setText(bounceText); reply.setHeader(RFC2822Headers.MESSAGE_ID, "replyTo-" + mail.getName()); return new MailImpl("replyTo-" + mail.getName(), sender, recipients, reply); }
return false; MailAddress reversePath = mail.getMaybeSender().get();
private CompletableFuture<Void> sendNotification(MailAddress recipient, Mail processedMail, Vacation vacation) { try { VacationReply vacationReply = VacationReply.builder(processedMail) .receivedMailRecipient(recipient) .vacation(vacation) .build(mimeMessageBodyGenerator); sendNotification(vacationReply); return notificationRegistry.register(AccountId.fromString(recipient.toString()), RecipientId.fromMailAddress(processedMail.getMaybeSender().get()), vacation.getToDate()); } catch (MessagingException e) { LOGGER.warn("Failed to send JMAP vacation notification from {} to {}", recipient, processedMail.getMaybeSender(), e); return CompletableFuture.completedFuture(null); } }
@Override public Collection<MailAddress> match(Mail mail) throws MessagingException { // check if it's a local sender if (!mail.hasSender()) { return null; } MailAddress senderMailAddress = mail.getMaybeSender().get(); if (getMailetContext().isLocalEmail(senderMailAddress)) { // is a local sender, so return return null; } String senderUser = senderMailAddress.getLocalPart(); senderUser = senderUser.toLowerCase(Locale.US); Collection<MailAddress> recipients = mail.getRecipients(); Collection<MailAddress> inWhiteList = new java.util.HashSet<>(); for (MailAddress recipientMailAddress : recipients) { String recipientUser = recipientMailAddress.getLocalPart().toLowerCase(Locale.US); Domain recipientHost = recipientMailAddress.getDomain(); if (!getMailetContext().isLocalServer(recipientHost)) { // not a local recipient, so skip continue; } recipientUser = getPrimaryName(recipientUser); if (matchedWhitelist(recipientMailAddress, mail)) { // This address was already in the list inWhiteList.add(recipientMailAddress); } } return inWhiteList; }
|| !mail.hasSender() || !mailet.getMailetContext() .getMailServers(mail.getMaybeSender().get() .getDomain()) .isEmpty();
@Override public void service(Mail mail) throws MessagingException { // Sanity checks if (!mail.hasSender()) { LOGGER.error("Sender is null"); return; } if (!getMailetContext().isLocalServer(mail.getMaybeSender().get().getDomain())) { LOGGER.error("Sender not local"); return; } // Update the Session for the current mail and execute SettableSession session = new SettableSession(); if (mail.getAttribute(Mail.SMTP_AUTH_USER_ATTRIBUTE_NAME) != null) { session.setState(Session.State.AUTHENTICATED); } else { session.setState(Session.State.UNAUTHENTICATED); } session.setUser(mail.getMaybeSender().get().asString()); getMailetContext().sendMail( mail.getRecipients().iterator().next(), mail.getMaybeSender().asList(), transcoder.execute(session, mail.getMessage())); mail.setState(Mail.GHOST); // And tidy up clearCaches(); }
private MimeMessage generateMimeMessage(MimeMessageBodyGenerator mimeMessageBodyGenerator) throws MessagingException { MimeMessage reply = (MimeMessage) originalMail.getMessage().reply(NOT_REPLY_TO_ALL); vacation.getSubject().ifPresent(Throwing.consumer(subjectString -> reply.setHeader("subject", subjectString))); reply.setHeader(FROM_HEADER, mailRecipient.toString()); reply.setHeader(TO_HEADER, originalMail.getMaybeSender().get().asString()); reply.setHeader(AutomaticallySentMailDetector.AUTO_SUBMITTED_HEADER, AutomaticallySentMailDetector.AUTO_REPLIED_VALUE); return mimeMessageBodyGenerator.from(reply, vacation.getTextBody(), vacation.getHtmlBody()); } }
@Override public HookResult doMail(SMTPSession session, MaybeSender sender) { if (!sender.isNullSender() && !hasMXRecord(session,sender.get().getDomain().name())) { return HookResult.builder() .hookReturnCode(HookReturnCode.deny()) .smtpReturnCode(SMTPRetCode.SYNTAX_ERROR_ARGUMENTS) .smtpDescription(DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.ADDRESS_SYNTAX_SENDER) + " sender " + sender + " contains a domain with no valid MX records") .build(); } else { return HookResult.DECLINED; } }