Subversion Repositories SmartDukaan

Rev

Rev 16527 | Details | Compare with Previous | Last modification | View Log | RSS feed

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