25
25
import java .io .InputStream ;
26
26
import java .util .LinkedHashMap ;
27
27
import java .util .Map ;
28
+ import java .util .concurrent .ExecutorService ;
29
+ import java .util .concurrent .Executors ;
28
30
29
31
import static com .stormpath .sdk .mail .MimeType .*;
30
32
@@ -42,6 +44,8 @@ public class CommonsEmailService implements EmailService {
42
44
43
45
private final Logger log = LoggerFactory .getLogger (CommonsEmailService .class );
44
46
47
+ private final ExecutorService executorService = Executors .newCachedThreadPool ();
48
+
45
49
private final TemplateRenderer templateRenderer ;
46
50
private final EmailServiceConfig config ;
47
51
private final ResourceFactory resourceFactory ;
@@ -64,78 +68,70 @@ public void sendResetEmail(EmailRequest request) {
64
68
}
65
69
66
70
@ Override
67
- public void sendEmail (EmailRequest request , String template ) {
68
-
69
- try (InputStream inputStream = resourceFactory .createResource (template ).getInputStream ()) {
71
+ public void sendEmail (final EmailRequest request , final String template ) {
70
72
71
- Map < String , Object > context = new LinkedHashMap <>();
73
+ executorService . execute ( new Runnable () {
72
74
73
- ObjectMapper objectMapper = new ObjectMapper ();
74
- objectMapper .configure (DeserializationFeature .FAIL_ON_UNKNOWN_PROPERTIES , false );
75
- EmailTemplate emailTemplate = objectMapper .readValue (inputStream , EmailTemplate .class );
75
+ @ Override
76
+ public void run () {
77
+ log .debug ("Start email send to: {}" , request .getToAddress ());
78
+ try (InputStream inputStream = resourceFactory .createResource (template ).getInputStream ()) {
76
79
77
- String url = emailTemplate . getDefaultModel (). get ( "linkBaseUrl" ) + "?sptoken=" + request . getToken ();
80
+ Map < String , Object > context = new LinkedHashMap <> ();
78
81
79
- context .put (APPLICATION_BASE_URL , url );
82
+ ObjectMapper objectMapper = new ObjectMapper ();
83
+ objectMapper .configure (DeserializationFeature .FAIL_ON_UNKNOWN_PROPERTIES , false );
84
+ EmailTemplate emailTemplate = objectMapper .readValue (inputStream , EmailTemplate .class );
80
85
81
- context .put (FROM_NAME , emailTemplate .getFromName ());
82
- context .put (FROM_EMAIL_ADDRESS , emailTemplate .getFromName ());
83
- context .put (SUBJECT , emailTemplate .getSubject ());
86
+ String url = emailTemplate .getDefaultModel ().get ("linkBaseUrl" ) + "?sptoken=" + request .getToken ();
84
87
85
- context .put (EXPIRE_WINDOW_HOURS , config . getTokenExpirationHours () );
88
+ context .put (APPLICATION_BASE_URL , url );
86
89
87
- context .put (TO_EMAIL_ADDRESS , request .getToAddress ());
88
- context .put (TO_NAME , request .getToDisplayName ());
90
+ context .put (FROM_NAME , emailTemplate .getFromName ());
91
+ context .put (FROM_EMAIL_ADDRESS , emailTemplate .getFromName ());
92
+ context .put (SUBJECT , emailTemplate .getSubject ());
89
93
90
- try {
91
- Email email ;
92
- MimeType mimeType = MimeType .fromString (emailTemplate .getMimeType ());
94
+ context .put (EXPIRE_WINDOW_HOURS , config .getTokenExpirationHours ());
93
95
94
- if (PLAIN_TEXT == mimeType ) {
96
+ context .put (TO_EMAIL_ADDRESS , request .getToAddress ());
97
+ context .put (TO_NAME , request .getToDisplayName ());
95
98
96
- SimpleEmail simpleEmail = new SimpleEmail ();
97
- simpleEmail .setMsg (renderEmail (emailTemplate .getTextBody (), context ).toString ());
98
- email = simpleEmail ;
99
- } else if (HTML == mimeType ) {
100
-
101
- HtmlEmail htmlEmail = new HtmlEmail ();
102
- htmlEmail .setHtmlMsg (renderEmail (emailTemplate .getHtmlBody (), context ).toString ());
103
- email = htmlEmail ;
104
- } else { // both
105
- HtmlEmail htmlEmail = new HtmlEmail ();
106
- htmlEmail .setHtmlMsg (renderEmail (emailTemplate .getHtmlBody (), context ).toString ());
107
- htmlEmail .setTextMsg (renderEmail (emailTemplate .getTextBody (), context ).toString ());
108
- email = htmlEmail ;
109
- }
99
+ try {
100
+ Email email ;
101
+ MimeType mimeType = MimeType .fromString (emailTemplate .getMimeType ());
110
102
111
- email .setFrom (emailTemplate .getFromEmailAddress (), emailTemplate .getFromName ());
112
- email .addTo (request .getToAddress (), request .getToDisplayName ());
113
- email .setSubject (emailTemplate .getSubject ());
103
+ if (PLAIN_TEXT == mimeType ) {
114
104
115
- // now send it away
116
- sendEmail (email );
117
- } catch (EmailException e ) {
105
+ SimpleEmail simpleEmail = new SimpleEmail ();
106
+ simpleEmail .setMsg (renderEmail (emailTemplate .getTextBody (), context ).toString ());
107
+ email = simpleEmail ;
108
+ } else if (HTML == mimeType ) {
118
109
119
- String message = "Failed to send email." ;
120
- log .warn (message , e );
110
+ HtmlEmail htmlEmail = new HtmlEmail ();
111
+ htmlEmail .setHtmlMsg (renderEmail (emailTemplate .getHtmlBody (), context ).toString ());
112
+ email = htmlEmail ;
113
+ } else { // both
114
+ HtmlEmail htmlEmail = new HtmlEmail ();
115
+ htmlEmail .setHtmlMsg (renderEmail (emailTemplate .getHtmlBody (), context ).toString ());
116
+ htmlEmail .setTextMsg (renderEmail (emailTemplate .getTextBody (), context ).toString ());
117
+ email = htmlEmail ;
118
+ }
121
119
122
- DefaultError error = new DefaultError ( null );
123
- error . setMessage ( message );
124
- error . setDeveloperMessage ( e . getMessage ());
120
+ email . setFrom ( emailTemplate . getFromEmailAddress (), emailTemplate . getFromName () );
121
+ email . addTo ( request . getToAddress (), request . getToDisplayName () );
122
+ email . setSubject ( emailTemplate . getSubject ());
125
123
126
- throw new ResourceException (error );
124
+ // now send it away
125
+ sendEmail (email );
126
+ log .debug ("Finish email send to: {}" , request .getToAddress ());
127
+ } catch (EmailException e ) {
128
+ log .error ("Failed to send email: {}" , e .getMessage (), e );
129
+ }
130
+ } catch (IOException e ) {
131
+ log .warn ("Failed to parse email template: {}" , e .getMessage (), e );
132
+ }
127
133
}
128
- } catch (IOException e ) {
129
- String message = "Failed to parse email template." ;
130
- log .warn (message , e );
131
-
132
- DefaultError error = new DefaultError (null );
133
- error .setStatus (500 );
134
- error .setMessage (message );
135
- error .setDeveloperMessage (e .getMessage ());
136
-
137
- throw new ResourceException (error );
138
- }
134
+ });
139
135
}
140
136
141
137
protected void sendEmail (Email email ) throws EmailException {
0 commit comments