Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
2822 chandransh 1
package in.shop2020.utils;
2
 
4827 mandeep.dh 3
import java.io.File;
2822 chandransh 4
import java.security.Security;
5138 mandeep.dh 5
import java.util.ArrayList;
6
import java.util.HashMap;
4827 mandeep.dh 7
import java.util.List;
5138 mandeep.dh 8
import java.util.Map;
2822 chandransh 9
import java.util.Properties;
10
 
11
import javax.activation.DataHandler;
12
import javax.activation.DataSource;
13
import javax.activation.FileDataSource;
14
import javax.mail.Message;
15
import javax.mail.MessagingException;
16
import javax.mail.Multipart;
17
import javax.mail.PasswordAuthentication;
18
import javax.mail.Session;
19
import javax.mail.Transport;
4827 mandeep.dh 20
import javax.mail.internet.AddressException;
2822 chandransh 21
import javax.mail.internet.InternetAddress;
22
import javax.mail.internet.MimeBodyPart;
23
import javax.mail.internet.MimeMessage;
24
import javax.mail.internet.MimeMultipart;
5128 amit.gupta 25
import javax.mail.util.ByteArrayDataSource;
2822 chandransh 26
 
27
public class GmailUtils {
28
 
29
    private static final String SMTP_HOST_NAME = "smtp.gmail.com";
30
    private static final String SMTP_PORT = "465";
31
    private static final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
32
 
33
    public GmailUtils(){
34
    }
35
 
36
    public void sendSSLMessage(String recipients[], String subject, String message, final String from, final String password, String filename) throws MessagingException {
5138 mandeep.dh 37
        try {
38
            Message msg = prepareMessage(recipients, subject, from, password);
39
            //Create the multi-part object to hold the text and attachment parts
40
            Multipart multipart = new MimeMultipart();
41
            // create the message part 
42
            MimeBodyPart messageBodyPart = new MimeBodyPart();
43
            //Part 1: Text message
44
            messageBodyPart.setText(message);
45
            multipart.addBodyPart(messageBodyPart);
46
            //Part 2: Attachment
47
            messageBodyPart = new MimeBodyPart();
48
            DataSource source = new FileDataSource(filename);
49
            messageBodyPart.setDataHandler(new DataHandler(source));
50
            String[] names = filename.split("/");
51
            messageBodyPart.setFileName(names[names.length - 1]);
52
            multipart.addBodyPart(messageBodyPart);
53
            // Put parts in message
54
            msg.setContent(multipart);
55
            Transport.send(msg);
56
        } catch (Exception e) {
57
            // If there is any error with normal mail sending, try diving receipients across domains
58
            if (hasMultipleDomains(recipients)) {
59
                for (List<String> subReceipients : getReceipientsPerDomain(recipients).values()) {
60
                    sendSSLMessage(subReceipients.toArray(new String[0]), subject, message, from, password, filename);
61
                }
4827 mandeep.dh 62
 
5138 mandeep.dh 63
                return;
64
            }
65
 
66
            throw new MessagingException(e.getMessage(), e);
67
        }
68
    }
4827 mandeep.dh 69
 
5138 mandeep.dh 70
    /**
71
     * @param recipients
72
     * @return
73
     */
74
    private Map<String, List<String>> getReceipientsPerDomain(String[] recipients) {
75
        Map<String, List<String>> result = new HashMap<String, List<String>>();
76
        for (String recipient : recipients) {
77
            String domain = extractDomainFromEmailAddress(recipient);
4827 mandeep.dh 78
 
5138 mandeep.dh 79
            if (!result.containsKey(domain)) {
80
                result.put(domain, new ArrayList<String>());
81
            }
82
 
83
            result.get(domain).add(recipient);
84
        }
85
 
86
        return result;
4827 mandeep.dh 87
    }
88
 
5138 mandeep.dh 89
    /**
90
     * @param recipients
91
     * @return
92
     */
93
    private boolean hasMultipleDomains(String[] recipients) {
94
        String domain = extractDomainFromEmailAddress(recipients[0]);
95
        for (String recipient : recipients) {
96
            if (!domain.equals(extractDomainFromEmailAddress(recipient))) {
97
                return true;
98
            }
99
        }
100
 
101
        return false;
102
    }
103
 
104
    private String extractDomainFromEmailAddress(String recipient) {
105
        return recipient.split("@")[1];
106
    }
107
 
5128 amit.gupta 108
    public void sendSSLMessage(String recipients[], String subject, String message, final String from, final String password, String filename, byte[] bytes, String type) throws MessagingException {
109
    	Message msg = prepareMessage(recipients, subject, from, password);
110
 
111
    	//Create the multi-part object to hold the text and attachment parts
112
    	Multipart multipart = new MimeMultipart();
113
 
114
    	// create the message part 
115
    	MimeBodyPart messageBodyPart = new MimeBodyPart();
116
    	//Part 1: Text message
117
    	messageBodyPart.setText(message);
118
    	multipart.addBodyPart(messageBodyPart);
119
 
120
    	//Part 2: Attachment
121
    	messageBodyPart = new MimeBodyPart();
122
    	DataSource source = new ByteArrayDataSource(bytes, type);
123
    	messageBodyPart.setDataHandler(new DataHandler(source));
124
    	messageBodyPart.setFileName(filename);
125
    	multipart.addBodyPart(messageBodyPart);
126
 
127
    	// Put parts in message
128
    	msg.setContent(multipart);
129
    	Transport.send(msg);
130
    }
131
 
4827 mandeep.dh 132
    public void sendSSLMessage(String recipients[], String subject, String message, final String from, final String password, List<File> files) throws MessagingException {
5138 mandeep.dh 133
        try {
134
            Message msg = prepareMessage(recipients, subject, from, password);
135
 
136
            //Create the multi-part object to hold the text and attachment parts
137
            Multipart multipart = new MimeMultipart();
138
 
139
            // create the message part 
140
            MimeBodyPart messageBodyPart = new MimeBodyPart();
141
            //Part 1: Text message
142
            messageBodyPart.setText(message);
143
            multipart.addBodyPart(messageBodyPart);
4827 mandeep.dh 144
 
5138 mandeep.dh 145
            //Part 2: Attachment
146
            for (File file : files) {
147
                DataSource source = new FileDataSource(file);
148
                String[] names = file.getAbsolutePath().split("/");
149
                messageBodyPart = new MimeBodyPart();
150
                messageBodyPart.setDataHandler(new DataHandler(source));
151
                messageBodyPart.setFileName(names[names.length - 1]);
152
                multipart.addBodyPart(messageBodyPart);
153
            }
154
 
155
            // Put parts in message
156
            msg.setContent(multipart);
157
            Transport.send(msg);
158
        } catch (Exception e) {
159
            // If there is any error with normal mail sending, try diving receipients across domains
160
            if (hasMultipleDomains(recipients)) {
161
                for (List<String> subReceipients : getReceipientsPerDomain(recipients).values()) {
162
                    sendSSLMessage(subReceipients.toArray(new String[0]), subject, message, from, password, files);
163
                }
164
 
165
                return;
166
            }
167
 
168
            throw new MessagingException(e.getMessage(), e);
4827 mandeep.dh 169
        }
170
    }
171
 
5138 mandeep.dh 172
    @SuppressWarnings("restriction")
4827 mandeep.dh 173
    private Message prepareMessage(String[] recipients, String subject,
174
            final String from, final String password) throws AddressException,
175
            MessagingException {
2822 chandransh 176
        boolean debug = true;
177
 
178
        Properties props = new Properties();
179
        props.put("mail.smtp.host", SMTP_HOST_NAME);
180
        props.put("mail.smtp.auth", "true");
181
        props.put("mail.debug", "true");
182
        props.put("mail.smtp.port", SMTP_PORT);
183
        props.put("mail.smtp.socketFactory.port", SMTP_PORT);
184
        props.put("mail.smtp.socketFactory.class", SSL_FACTORY);
185
        props.put("mail.smtp.socketFactory.fallback", "false");
186
        Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
187
 
188
        Session session = Session.getDefaultInstance(props,
189
                new javax.mail.Authenticator() {
190
 
191
                    protected PasswordAuthentication getPasswordAuthentication() {
192
                        return new PasswordAuthentication(from, password);
193
                    }
194
                });
195
 
196
        session.setDebug(debug);
197
 
198
        Message msg = new MimeMessage(session);
199
 
200
        //Set the from address
201
        InternetAddress addressFrom = new InternetAddress(from);
202
        msg.setFrom(addressFrom);
203
 
204
        //Set the recipients
205
        InternetAddress[] addressTo = new InternetAddress[recipients.length];
206
        for (int i = 0; i < recipients.length; i++) {
207
            addressTo[i] = new InternetAddress(recipients[i]);
208
        }
209
        msg.setRecipients(Message.RecipientType.TO, addressTo);
210
 
211
        //Setting the Subject
212
        msg.setSubject(subject);
4827 mandeep.dh 213
        return msg;
2822 chandransh 214
    }
215
 
216
    public static void main(String args[]) throws Exception {
5138 mandeep.dh 217
        String[] sendTo = { "mandeep.dhir@shop2020.in", "mandeep.dhir@gmail.com", "mandeepcse07@yahoo.co.in", "anupam.singh@shop2020.in" };
218
        String emailSubjectTxt = "Another test from gmail";
2822 chandransh 219
        String emailMsgTxt = "Test Message Contents";
5138 mandeep.dh 220
        String emailFromAddress = "mandeep.dhir@shop2020.in";
221
        String password = "";
222
        String filename = "/home/mandeep/virtual_warehouse.sql";
223
 
2822 chandransh 224
        GmailUtils utils = new GmailUtils();
225
        utils.sendSSLMessage(sendTo, emailSubjectTxt, emailMsgTxt, emailFromAddress, password, filename);
226
        System.out.println("Sucessfully Sent mail to All Users");
227
    }
228
}