@Nullable public Throwable getTransportThrowable () { return m_aError == null ? null : m_aError.getThrowable (); }
@Nonnegative public int getTotalQueueLength () { return MailAPI.getTotalQueueLength (); }
/** * @return The SMTP settings used for this queue. Never <code>null</code>. */ @Nonnull public ISMTPSettings getSMTPSettings () { return m_aTransport.getSMTPSettings (); }
.appendText (aTransportError.getThrowable ().getMessage ()); for (final MailSendDetails aDetails : aTransportError.getAllDetails ()) .setAttribute (ATTR_ADDRESS_VALID, aDetails.isAddressValid ()) .setAttribute (ATTR_ADDRESS, aDetails.getAddress ()) .setAttribute (ATTR_COMMAND, aDetails.getCommand ()) .setAttribute (ATTR_ERROR_MESSAGE, aDetails.getErrorMessage ()) .setAttribute (ATTR_ERROR_CODE, aDetails.getErrorCode ().getECode ());
@Nonnull public static String getAddressesString (@Nullable final Collection <? extends MailSendDetails> aAddresses) { if (aAddresses == null || aAddresses.isEmpty ()) return "[]"; final StringBuilder aSB = new StringBuilder ().append ('['); for (final MailSendDetails aFailure : aAddresses) { if (aSB.length () > 1) aSB.append (", "); aSB.append (aFailure.getAddress ()); if (!aFailure.isAddressValid ()) aSB.append (" (").append (aFailure.getErrorMessage ()).append (')'); } return aSB.append (']').toString (); }
/** * Constructor * * @param nMaxQueueSize * Maximum objects to queue * @param nMaxPerformCount * Maximum number of emails to send at once * @param aSMTPSettings * SMTP settings to use. May not be <code>null</code>. * @param aFailedMailQueue * The queue for unsent mails. May not be <code>null</code>. */ public MailQueuePerSMTP (@Nonnegative final int nMaxQueueSize, @Nonnegative final int nMaxPerformCount, @Nonnull final ISMTPSettings aSMTPSettings, @Nonnull final FailedMailQueue aFailedMailQueue) { super (nMaxQueueSize, nMaxPerformCount); ValueEnforcer.notNull (aSMTPSettings, "SMTPSettings"); // Mail mail transport object m_aTransport = new MailTransport (aSMTPSettings); setFailedMailQueue (aFailedMailQueue); // Set the callback of the concurrent collector setPerformer (this); }
/** * Unconditionally queue a mail * * @param aSMTPSettings * The SMTP settings to use. May not be <code>null</code>. * @param aMailData * The data of the email to be send. May not be <code>null</code>. * @return {@link ESuccess} */ @Nonnull public ESuccess queueMail (@Nonnull final ISMTPSettings aSMTPSettings, @Nonnull final IMutableEmailData aMailData) { return MailAPI.queueMail (aSMTPSettings, aMailData); }
/** * @param bForSMTPS * <code>true</code> for "SMTPS", if <code>false</code> for "SMTP" * @return The property name for regular SMTP transfer. Neither * <code>null</code> nor empty. */ @Nonnull @Nonempty public String getPropertyName (final boolean bForSMTPS) { return bForSMTPS ? getSMTPSPropertyName () : getSMTPPropertyName (); }
public MailTransport (@Nonnull final ISMTPSettings aSettings) { ValueEnforcer.notNull (aSettings, "Settings"); m_aSMTPSettings = aSettings; m_bSMTPS = isUseSMTPS (aSettings); m_aMailProperties = createSessionProperties (aSettings); if (LOGGER.isDebugEnabled ()) LOGGER.debug ("Mail properties: " + m_aMailProperties); // Create session based on properties final Properties aProps = new Properties (); aProps.putAll (m_aMailProperties); m_aSession = Session.getInstance (aProps); }
final boolean bSMTPS = isUseSMTPS (aSettings); ret.put (ESMTPTransportProperty.SSL_ENABLE.getPropertyName (bSMTPS), Boolean.TRUE.toString ()); ret.put (ESMTPTransportProperty.AUTH.getPropertyName (bSMTPS), Boolean.TRUE.toString ()); ret.put (ESMTPTransportProperty.STARTTLS_ENABLE.getPropertyName (bSMTPS), Boolean.TRUE.toString ()); ret.put (ESMTPTransportProperty.SSL_SOCKETFACTORY_CLASS.getPropertyName (bSMTPS), com.sun.mail.util.MailSSLSocketFactory.class.getName ()); ret.put (ESMTPTransportProperty.SSL_SOCKETFACTORY_PORT.getPropertyName (bSMTPS), Integer.toString (aSettings.getPort ())); ret.put (ESMTPTransportProperty.CONNECTIONTIMEOUT.getPropertyName (bSMTPS), Long.toString (nConnectionTimeoutMilliSecs)); ret.put (ESMTPTransportProperty.TIMEOUT.getPropertyName (bSMTPS), Long.toString (nTimeoutMilliSecs)); ret.put (ESMTPTransportProperty.REPORTSUCCESS.getPropertyName (bSMTPS), Boolean.toString (true)); ret.put (ESMTPTransportProperty.SENDPARTIAL.getPropertyName (bSMTPS), Boolean.toString (false));
/** * Stop taking new mails, and wait until all mails already in the queue are * delivered. * * @return {@link EChange} */ @Nonnull public static EChange stop () { return stop (DEFAULT_STOP_IMMEDIATLY); }
/** * Queue multiple mails at once. * * @param aSMTPSettings * The SMTP settings to be used. * @param aMailDataList * The mail messages to queue. May not be <code>null</code>. * @return The number of queued emails. Always ≥ 0. Maximum value is the * number of {@link IMutableEmailData} objects in the argument. */ @Nonnegative public int queueMails (@Nonnull final ISMTPSettings aSMTPSettings, @Nonnull final Collection <? extends IMutableEmailData> aMailDataList) { return MailAPI.queueMails (aSMTPSettings, aMailDataList); }
/** * Set a new global failed mail queue. Updates all existing queues. * * @param aFailedMailQueue * The new failed mail queue to set. May not be <code>null</code>. */ public void setFailedMailQueue (@Nonnull final FailedMailQueue aFailedMailQueue) { MailAPI.setFailedMailQueue (aFailedMailQueue); }
/** * @return The current failed mail queue. Never <code>null</code>. */ @Nonnull public FailedMailQueue getFailedMailQueue () { return MailAPI.getFailedMailQueue (); }
fillMimeMessageUnsafe (aMimeMessage, aMailData, aCharset);
@Nonnegative @MustBeLocked (ELockType.READ) private static int _getTotalQueueLength () { int ret = 0; // count over all queues for (final MailQueuePerSMTP aQueue : s_aQueueCache.values ()) ret += aQueue.getQueueLength (); return ret; }
/** * Set a new global failed mail queue. Updates all existing queues. * * @param aFailedMailQueue * The new failed mail queue to set. May not be <code>null</code>. */ public static void setFailedMailQueue (@Nonnull final FailedMailQueue aFailedMailQueue) { ValueEnforcer.notNull (aFailedMailQueue, "FailedMailQueue"); s_aRWLock.writeLocked ( () -> { s_aFailedMailQueue = aFailedMailQueue; // Update all existing queues for (final MailQueuePerSMTP aMailQueue : s_aQueueCache.values ()) aMailQueue.setFailedMailQueue (aFailedMailQueue); }); if (LOGGER.isInfoEnabled ()) LOGGER.info ("Set FailedMailQueue to " + aFailedMailQueue); }
@Nullable public String getTransportThrowableMessage () { return m_aError == null ? null : m_aError.getThrowable ().getMessage (); }
@Override protected void onDestroy (@Nonnull final IScope aScopeInDestruction) { // Stop mail queues MailAPI.stop (isStopImmediately ()); } }
/** * Queue a single mail. * * @param aSMTPSettings * The SMTP settings to be used. * @param aMailData * The mail message to queue. May not be <code>null</code>. * @return {@link ESuccess}. */ @Nonnull public static ESuccess queueMail (@Nonnull final ISMTPSettings aSMTPSettings, @Nonnull final IMutableEmailData aMailData) { final int nQueuedMails = queueMails (aSMTPSettings, new CommonsArrayList <> (aMailData)); return ESuccess.valueOf (nQueuedMails == 1); }