Subversion Repositories SmartDukaan

Rev

Rev 16526 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
16526 manish.sha 1
package in.shop2020.util;
2
 
3
import com.sendgrid.smtpapi.SMTPAPI;
16527 manish.sha 4
import org.apache.http.HttpEntity;
16526 manish.sha 5
import org.apache.http.HttpResponse;
16527 manish.sha 6
import org.apache.http.client.methods.HttpPost;
7
import org.apache.http.entity.ContentType;
16526 manish.sha 8
import org.apache.http.entity.mime.MultipartEntityBuilder;
16527 manish.sha 9
import org.apache.http.impl.client.CloseableHttpClient;
16526 manish.sha 10
import org.apache.http.impl.client.HttpClientBuilder;
11
import org.apache.http.util.EntityUtils;
16527 manish.sha 12
import org.json.JSONObject;
16526 manish.sha 13
 
16527 manish.sha 14
import java.io.*;
15
import java.util.*;
16
 
16526 manish.sha 17
public class SendGrid {
16527 manish.sha 18
    private static final String VERSION = "2.2.2";
19
    private static final String USER_AGENT = "sendgrid/" + VERSION + ";java";
16526 manish.sha 20
 
16527 manish.sha 21
    private static final String PARAM_TO = "to[]";
22
    private static final String PARAM_TONAME = "toname[]";
23
    private static final String PARAM_CC = "cc[]";
24
    private static final String PARAM_BCC = "bcc[]";
16526 manish.sha 25
 
16527 manish.sha 26
    private static final String PARAM_FROM = "from";
27
    private static final String PARAM_FROMNAME = "fromname";
28
    private static final String PARAM_REPLYTO = "replyto";
29
    private static final String PARAM_SUBJECT = "subject";
30
    private static final String PARAM_HTML = "html";
31
    private static final String PARAM_TEXT = "text";
32
    private static final String PARAM_FILES = "files[%s]";
33
    private static final String PARAM_CONTENTS = "content[%s]";
34
    private static final String PARAM_XSMTPAPI = "x-smtpapi";
35
    private static final String PARAM_HEADERS = "headers";
36
    private static final String TEXT_PLAIN = "text/plain";
37
    private static final String UTF_8 = "UTF-8";
16526 manish.sha 38
 
39
 
16527 manish.sha 40
    private String username;
41
    private String password;
42
    private String url;
43
    private String port;
44
    private String endpoint;
45
    private CloseableHttpClient client;
16526 manish.sha 46
 
16527 manish.sha 47
    /**
48
     * Constructor for using a username and password
49
     *
50
     * @param username SendGrid username
51
     * @param password SendGrid password
52
     */
53
    public SendGrid(String username, String password) {
54
        this.username = username;
55
        this.password = password;
56
        this.url = "https://api.sendgrid.com";
57
        this.endpoint = "/api/mail.send.json";
58
        this.client = HttpClientBuilder.create().setUserAgent(USER_AGENT).build();
59
    }
16526 manish.sha 60
 
16527 manish.sha 61
    /**
62
     * Constructor for using an API key
63
     *
64
     * @param apiKey SendGrid api key
65
     */
66
    public SendGrid(String apiKey) {
67
        this.password = apiKey;
68
        this.username = null;
69
        this.url = "https://api.sendgrid.com";
70
        this.endpoint = "/api/mail.send.json";
71
        this.client = HttpClientBuilder.create().setUserAgent(USER_AGENT).build();
72
    }
16526 manish.sha 73
 
16527 manish.sha 74
    public SendGrid setUrl(String url) {
75
        this.url = url;
76
        return this;
77
    }
16526 manish.sha 78
 
16527 manish.sha 79
    public SendGrid setEndpoint(String endpoint) {
80
        this.endpoint = endpoint;
81
        return this;
82
    }
16526 manish.sha 83
 
16527 manish.sha 84
    public String getVersion() {
85
        return VERSION;
86
    }
16526 manish.sha 87
 
16527 manish.sha 88
    public SendGrid setClient(CloseableHttpClient client) {
89
        this.client = client;
90
        return this;
16526 manish.sha 91
    }
92
 
16527 manish.sha 93
    public HttpEntity buildBody(Email email) {
94
        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
16526 manish.sha 95
 
16527 manish.sha 96
        // We are using an API key
97
        if (this.username != null) {
98
            builder.addTextBody("api_user", this.username);
99
            builder.addTextBody("api_key", this.password);
100
        }
16526 manish.sha 101
 
16527 manish.sha 102
        String[] tos = email.getTos();
103
        String[] tonames = email.getToNames();
104
        String[] ccs = email.getCcs();
105
        String[] bccs = email.getBccs();
16526 manish.sha 106
 
16527 manish.sha 107
        // If SMTPAPI Header is used, To is still required. #workaround.
108
        if (tos.length == 0) {
109
            builder.addTextBody(String.format(PARAM_TO, 0), email.getFrom(), ContentType.create(TEXT_PLAIN, UTF_8));
110
        }
111
        for (int i = 0, len = tos.length; i < len; i++)
112
            builder.addTextBody(PARAM_TO, tos[i], ContentType.create("text/plain", "UTF-8"));
113
        for (int i = 0, len = tonames.length; i < len; i++)
114
            builder.addTextBody(PARAM_TONAME, tonames[i], ContentType.create("text/plain", "UTF-8"));
115
        for (int i = 0, len = ccs.length; i < len; i++)
116
            builder.addTextBody(PARAM_CC, ccs[i], ContentType.create("text/plain", "UTF-8"));
117
        for (int i = 0, len = bccs.length; i < len; i++)
118
            builder.addTextBody(PARAM_BCC, bccs[i], ContentType.create(TEXT_PLAIN, UTF_8));
119
        // Files
120
        if (email.getAttachments().size() > 0) {
121
            Iterator it = email.getAttachments().entrySet().iterator();
122
            while (it.hasNext()) {
123
                Map.Entry entry = (Map.Entry) it.next();
124
                builder.addBinaryBody(String.format(PARAM_FILES, entry.getKey()), (InputStream) entry.getValue());
125
            }
126
        }
16526 manish.sha 127
 
16527 manish.sha 128
        if (email.getContentIds().size() > 0) {
129
            Iterator it = email.getContentIds().entrySet().iterator();
130
            while (it.hasNext()) {
131
                Map.Entry entry = (Map.Entry) it.next();
132
                builder.addTextBody(String.format(PARAM_CONTENTS, entry.getKey()), (String) entry.getValue());
133
            }
134
        }
16526 manish.sha 135
 
16527 manish.sha 136
        if (email.getHeaders().size() > 0)
137
            builder.addTextBody(PARAM_HEADERS, new JSONObject(email.getHeaders()).toString(), ContentType.create(TEXT_PLAIN, UTF_8));
16526 manish.sha 138
 
16527 manish.sha 139
        if (email.getFrom() != null && !email.getFrom().isEmpty())
140
            builder.addTextBody(PARAM_FROM, email.getFrom(), ContentType.create(TEXT_PLAIN, UTF_8));
16526 manish.sha 141
 
16527 manish.sha 142
        if (email.getFromName() != null && !email.getFromName().isEmpty())
143
            builder.addTextBody(PARAM_FROMNAME, email.getFromName(), ContentType.create(TEXT_PLAIN, UTF_8));
16526 manish.sha 144
 
16527 manish.sha 145
        if (email.getReplyTo() != null && !email.getReplyTo().isEmpty())
146
            builder.addTextBody(PARAM_REPLYTO, email.getReplyTo(), ContentType.create(TEXT_PLAIN, UTF_8));
16526 manish.sha 147
 
16527 manish.sha 148
        if (email.getSubject() != null && !email.getSubject().isEmpty())
149
            builder.addTextBody(PARAM_SUBJECT, email.getSubject(), ContentType.create(TEXT_PLAIN, UTF_8));
16526 manish.sha 150
 
16527 manish.sha 151
        if (email.getHtml() != null && !email.getHtml().isEmpty())
152
            builder.addTextBody(PARAM_HTML, email.getHtml(), ContentType.create(TEXT_PLAIN, UTF_8));
16526 manish.sha 153
 
16527 manish.sha 154
        if (email.getText() != null && !email.getText().isEmpty())
155
            builder.addTextBody(PARAM_TEXT, email.getText(), ContentType.create(TEXT_PLAIN, UTF_8));
16526 manish.sha 156
 
16527 manish.sha 157
        String tmpString = email.smtpapi.jsonString();
158
        if (!tmpString.equals("{}"))
159
            builder.addTextBody(PARAM_XSMTPAPI, tmpString, ContentType.create(TEXT_PLAIN, UTF_8));
16526 manish.sha 160
 
16527 manish.sha 161
        return builder.build();
16526 manish.sha 162
    }
163
 
16527 manish.sha 164
    public SendGrid.Response send(Email email) throws SendGridException {
165
        HttpPost httppost = new HttpPost(this.url + this.endpoint);
166
        httppost.setEntity(this.buildBody(email));
16526 manish.sha 167
 
16527 manish.sha 168
        // Using an API key
169
        if (this.username == null) {
170
            httppost.setHeader("Authorization", "Bearer " + this.password);
171
        }
16526 manish.sha 172
 
16527 manish.sha 173
        try {
174
            HttpResponse res = this.client.execute(httppost);
175
            return new SendGrid.Response(res.getStatusLine().getStatusCode(), EntityUtils.toString(res.getEntity()));
176
        } catch (IOException e) {
177
            throw new SendGridException(e);
178
        }
16526 manish.sha 179
 
180
    }
181
 
16527 manish.sha 182
    public static class Email {
183
        private SMTPAPI smtpapi;
184
        private ArrayList<String> to;
185
        private ArrayList<String> toname;
186
        private ArrayList<String> cc;
187
        private String from;
188
        private String fromname;
189
        private String replyto;
190
        private String subject;
191
        private String text;
192
        private String html;
193
        private ArrayList<String> bcc;
194
        private Map<String, InputStream> attachments;
195
        private Map<String, String> contents;
196
        private Map<String, String> headers;
16526 manish.sha 197
 
16527 manish.sha 198
        public Email() {
199
            this.smtpapi = new SMTPAPI();
200
            this.to = new ArrayList<String>();
201
            this.toname = new ArrayList<String>();
202
            this.cc = new ArrayList<String>();
203
            this.bcc = new ArrayList<String>();
204
            this.attachments = new HashMap<String, InputStream>();
205
            this.contents = new HashMap<String, String>();
206
            this.headers = new HashMap<String, String>();
207
        }
16526 manish.sha 208
 
16527 manish.sha 209
        public Email addTo(String to) {
210
            this.to.add(to);
211
            return this;
212
        }
16526 manish.sha 213
 
16527 manish.sha 214
        public Email addTo(String[] tos) {
215
            this.to.addAll(Arrays.asList(tos));
216
            return this;
217
        }
16526 manish.sha 218
 
16527 manish.sha 219
        public Email addTo(String to, String name) {
220
            this.addTo(to);
221
            return this.addToName(name);
222
        }
16526 manish.sha 223
 
16527 manish.sha 224
        public Email setTo(String[] tos) {
225
            this.to = new ArrayList<String>(Arrays.asList(tos));
226
            return this;
227
        }
16526 manish.sha 228
 
16527 manish.sha 229
        public String[] getTos() {
230
            return this.to.toArray(new String[this.to.size()]);
231
        }
16526 manish.sha 232
 
16527 manish.sha 233
        public Email addSmtpApiTo(String to) {
234
            this.smtpapi.addTo(to);
235
            return this;
236
        }
16526 manish.sha 237
 
16527 manish.sha 238
        public Email addSmtpApiTo(String[] to) {
239
            this.smtpapi.addTos(to);
240
            return this;
241
        }
16526 manish.sha 242
 
16527 manish.sha 243
        public Email addToName(String toname) {
244
            this.toname.add(toname);
245
            return this;
246
        }
16526 manish.sha 247
 
16527 manish.sha 248
        public Email addToName(String[] tonames) {
249
            this.toname.addAll(Arrays.asList(tonames));
250
            return this;
251
        }
16526 manish.sha 252
 
16527 manish.sha 253
        public Email setToName(String[] tonames) {
254
            this.toname = new ArrayList<String>(Arrays.asList(tonames));
255
            return this;
256
        }
16526 manish.sha 257
 
16527 manish.sha 258
        public String[] getToNames() {
259
            return this.toname.toArray(new String[this.toname.size()]);
260
        }
16526 manish.sha 261
 
16527 manish.sha 262
        public Email addCc(String cc) {
263
            this.cc.add(cc);
264
            return this;
265
        }
16526 manish.sha 266
 
16527 manish.sha 267
        public Email addCc(String[] ccs) {
268
            this.cc.addAll(Arrays.asList(ccs));
269
            return this;
270
        }
16526 manish.sha 271
 
16527 manish.sha 272
        public Email setCc(String[] ccs) {
273
            this.cc = new ArrayList<String>(Arrays.asList(ccs));
274
            return this;
275
        }
16526 manish.sha 276
 
16527 manish.sha 277
        public String[] getCcs() {
278
            return this.cc.toArray(new String[this.cc.size()]);
279
        }
16526 manish.sha 280
 
16527 manish.sha 281
        public Email setFrom(String from) {
282
            this.from = from;
283
            return this;
284
        }
16526 manish.sha 285
 
16527 manish.sha 286
        public String getFrom() {
287
            return this.from;
288
        }
16526 manish.sha 289
 
16527 manish.sha 290
        public Email setFromName(String fromname) {
291
            this.fromname = fromname;
292
            return this;
293
        }
16526 manish.sha 294
 
16527 manish.sha 295
        public String getFromName() {
296
            return this.fromname;
297
        }
16526 manish.sha 298
 
16527 manish.sha 299
        public Email setReplyTo(String replyto) {
300
            this.replyto = replyto;
301
            return this;
302
        }
16526 manish.sha 303
 
16527 manish.sha 304
        public String getReplyTo() {
305
            return this.replyto;
306
        }
16526 manish.sha 307
 
16527 manish.sha 308
        public Email addBcc(String bcc) {
309
            this.bcc.add(bcc);
310
            return this;
311
        }
16526 manish.sha 312
 
16527 manish.sha 313
        public Email addBcc(String[] bccs) {
314
            this.bcc.addAll(Arrays.asList(bccs));
315
            return this;
316
        }
16526 manish.sha 317
 
16527 manish.sha 318
        public Email setBcc(String[] bccs) {
319
            this.bcc = new ArrayList<String>(Arrays.asList(bccs));
320
            return this;
321
        }
16526 manish.sha 322
 
16527 manish.sha 323
        public String[] getBccs() {
324
            return this.bcc.toArray(new String[this.bcc.size()]);
325
        }
16526 manish.sha 326
 
16527 manish.sha 327
        public Email setSubject(String subject) {
328
            this.subject = subject;
329
            return this;
330
        }
16526 manish.sha 331
 
16527 manish.sha 332
        public String getSubject() {
333
            return this.subject;
334
        }
16526 manish.sha 335
 
16527 manish.sha 336
        public Email setText(String text) {
337
            this.text = text;
338
            return this;
339
        }
16526 manish.sha 340
 
16527 manish.sha 341
        public String getText() {
342
            return this.text;
343
        }
16526 manish.sha 344
 
16527 manish.sha 345
        public Email setHtml(String html) {
346
            this.html = html;
347
            return this;
348
        }
16526 manish.sha 349
 
16527 manish.sha 350
        public String getHtml() {
351
            return this.html;
352
        }
16526 manish.sha 353
 
16527 manish.sha 354
        public Email addSubstitution(String key, String[] val) {
355
            this.smtpapi.addSubstitutions(key, val);
356
            return this;
357
        }
16526 manish.sha 358
 
16527 manish.sha 359
        public JSONObject getSubstitutions() {
360
            return this.smtpapi.getSubstitutions();
361
        }
16526 manish.sha 362
 
16527 manish.sha 363
        public Email addUniqueArg(String key, String val) {
364
            this.smtpapi.addUniqueArg(key, val);
365
            return this;
366
        }
16526 manish.sha 367
 
16527 manish.sha 368
        public JSONObject getUniqueArgs() {
369
            return this.smtpapi.getUniqueArgs();
370
        }
16526 manish.sha 371
 
16527 manish.sha 372
        public Email addCategory(String category) {
373
            this.smtpapi.addCategory(category);
374
            return this;
375
        }
16526 manish.sha 376
 
16527 manish.sha 377
        public String[] getCategories() {
378
            return this.smtpapi.getCategories();
379
        }
16526 manish.sha 380
 
16527 manish.sha 381
        public Email addSection(String key, String val) {
382
            this.smtpapi.addSection(key, val);
383
            return this;
384
        }
16526 manish.sha 385
 
16527 manish.sha 386
        public JSONObject getSections() {
387
            return this.smtpapi.getSections();
388
        }
16526 manish.sha 389
 
16527 manish.sha 390
        public Email addFilter(String filter_name, String parameter_name, String parameter_value) {
391
            this.smtpapi.addFilter(filter_name, parameter_name, parameter_value);
392
            return this;
393
        }
16526 manish.sha 394
 
16527 manish.sha 395
        public JSONObject getFilters() {
396
            return this.smtpapi.getFilters();
397
        }
16526 manish.sha 398
 
16527 manish.sha 399
        public Email setASMGroupId(int val) {
400
            this.smtpapi.setASMGroupId(val);
401
            return this;
402
        }
16526 manish.sha 403
 
16527 manish.sha 404
        public Integer getASMGroupId() {
405
            return this.smtpapi.getASMGroupId();
406
        }
16526 manish.sha 407
 
16527 manish.sha 408
        public Email setSendAt(int sendAt) {
409
            this.smtpapi.setSendAt(sendAt);
410
            return this;
411
        }
412
 
413
        public int getSendAt() {
414
            return this.smtpapi.getSendAt();
415
        }
416
 
417
        /**
418
         * Convenience method to set the template
419
         *
420
         * @param templateId The ID string of your template
421
         * @return this
422
         */
423
        public Email setTemplateId(String templateId) {
424
            this.getSMTPAPI().addFilter("templates", "enable", 1);
425
            this.getSMTPAPI().addFilter("templates", "template_id", templateId);
426
            return this;
427
        }
428
 
429
        public Email addAttachment(String name, File file) throws IOException, FileNotFoundException {
430
            return this.addAttachment(name, new FileInputStream(file));
431
        }
432
 
433
        public Email addAttachment(String name, String file) throws IOException {
434
            return this.addAttachment(name, new ByteArrayInputStream(file.getBytes()));
435
        }
436
 
437
        public Email addAttachment(String name, InputStream file) throws IOException {
438
            this.attachments.put(name, file);
439
            return this;
440
        }
441
 
442
        public Map getAttachments() {
443
            return this.attachments;
444
        }
445
 
446
        public Email addContentId(String attachmentName, String cid) {
447
            this.contents.put(attachmentName, cid);
448
            return this;
449
        }
450
 
451
        public Map getContentIds() {
452
            return this.contents;
453
        }
454
 
455
        public Email addHeader(String key, String val) {
456
            this.headers.put(key, val);
457
            return this;
458
        }
459
 
460
        public Map getHeaders() {
461
            return this.headers;
462
        }
463
 
464
        public SMTPAPI getSMTPAPI() {
465
            return this.smtpapi;
466
        }
16526 manish.sha 467
    }
468
 
16527 manish.sha 469
    public static class Response {
470
        private int code;
471
        private boolean success;
472
        private String message;
473
 
474
        public Response(int code, String msg) {
475
            this.code = code;
476
            this.success = code == 200;
477
            this.message = msg;
478
        }
479
 
480
        public int getCode() {
481
            return this.code;
482
        }
483
 
484
        public boolean getStatus() {
485
            return this.success;
486
        }
487
 
488
        public String getMessage() {
489
            return this.message;
490
        }
16526 manish.sha 491
    }
16527 manish.sha 492
}