Skip to content

Commit 00784c4

Browse files
authored
Merge pull request #87 from amanteaux/master
Add timeouts to SMTP transport sockets
2 parents 3401750 + 444f8aa commit 00784c4

File tree

3 files changed

+30
-2
lines changed

3 files changed

+30
-2
lines changed

src/main/java/org/simplejavamail/mailer/Mailer.java

+16
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import org.simplejavamail.mailer.config.TransportStrategy;
1111
import org.simplejavamail.mailer.internal.mailsender.MailSender;
1212
import org.simplejavamail.converter.internal.mimemessage.MimeMessageHelper;
13+
import org.simplejavamail.util.ConfigLoader;
14+
import org.simplejavamail.util.ConfigLoader.Property;
1315
import org.slf4j.Logger;
1416
import org.slf4j.LoggerFactory;
1517

@@ -83,6 +85,12 @@ public class Mailer {
8385

8486
private static final Logger LOGGER = LoggerFactory.getLogger(Mailer.class);
8587

88+
/**
89+
* The default maximum timeout value for the transport socket is {@value #DEFAULT_MAIL_SOCKET_TIMEOUT}
90+
* milliseconds. Can be overridden from a config file or through System variable.
91+
*/
92+
private static final String DEFAULT_MAIL_SOCKET_TIMEOUT = "60000";
93+
8694
private final MailSender mailSender;
8795

8896
/**
@@ -229,6 +237,14 @@ public static Session createMailSession(final ServerConfig serverConfig, final T
229237
props.put(transportStrategy.propertyNameHost(), serverConfig.getHost());
230238
props.put(transportStrategy.propertyNamePort(), String.valueOf(serverConfig.getPort()));
231239

240+
// socket timeouts handling
241+
String sendMailTimeoutInMillis = ConfigLoader.valueOrProperty(
242+
null, Property.DEFAULT_MAIL_SOCKET_TIMEOUT_IN_MILLIS, DEFAULT_MAIL_SOCKET_TIMEOUT
243+
);
244+
props.put("mail.smtp.connectiontimeout", sendMailTimeoutInMillis);
245+
props.put("mail.smtp.timeout", sendMailTimeoutInMillis);
246+
props.put("mail.smtp.writetimeout", sendMailTimeoutInMillis);
247+
232248
if (serverConfig.getUsername() != null) {
233249
props.put(transportStrategy.propertyNameUsername(), serverConfig.getUsername());
234250
}

src/main/java/org/simplejavamail/mailer/internal/mailsender/MailSender.java

+13-2
Original file line numberDiff line numberDiff line change
@@ -162,10 +162,21 @@ the proxy bridge server (or connection pool in async mode) while a non-async ema
162162
if (executor == null || executor.isTerminated()) {
163163
executor = Executors.newFixedThreadPool(threadPoolSize);
164164
}
165-
executor.execute(new Thread("sendMail process") {
165+
executor.execute(new Runnable() {
166+
private static final String NAME = "sendMail process";
167+
166168
@Override
167169
public void run() {
168-
sendMailClosure(session, email);
170+
try {
171+
sendMailClosure(session, email);
172+
} catch (Exception e) {
173+
LOGGER.error("could not send email {}", email, e);
174+
}
175+
}
176+
177+
@Override
178+
public String toString() {
179+
return NAME;
169180
}
170181
});
171182
} else {

src/main/java/org/simplejavamail/util/ConfigLoader.java

+1
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ public enum Property {
9494
DEFAULT_BCC_NAME("simplejavamail.defaults.bcc.name"),
9595
DEFAULT_BCC_ADDRESS("simplejavamail.defaults.bcc.address"),
9696
DEFAULT_POOL_SIZE("simplejavamail.defaults.poolsize"),
97+
DEFAULT_MAIL_SOCKET_TIMEOUT_IN_MILLIS("simplejavamail.defaults.mailsockettimeoutinmillis"),
9798
TRANSPORT_MODE_LOGGING_ONLY("simplejavamail.transport.mode.logging.only");
9899

99100
private final String key;

0 commit comments

Comments
 (0)