KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > jetspeed > modules > actions > portlets > email > Email


1 /*
2  * Copyright 2000-2001,2004 The Apache Software Foundation.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */

16
17 package org.apache.jetspeed.modules.actions.portlets.email;
18
19 //JavaMail
20

21 import javax.mail.Session JavaDoc;
22 import javax.mail.Store JavaDoc;
23 import javax.mail.Folder JavaDoc;
24 import javax.mail.AuthenticationFailedException JavaDoc;
25 import javax.mail.NoSuchProviderException JavaDoc;
26 import javax.mail.Message JavaDoc;
27 import javax.mail.Transport JavaDoc;
28 import javax.mail.Address JavaDoc;
29 import javax.mail.Multipart JavaDoc;
30 import javax.mail.Flags JavaDoc;
31 import javax.mail.Part JavaDoc;
32 import javax.mail.Header JavaDoc;
33
34 import javax.mail.internet.MimeMessage JavaDoc;
35 import javax.mail.internet.InternetAddress JavaDoc;
36 import javax.mail.internet.MimeBodyPart JavaDoc;
37 import javax.mail.internet.MimeMultipart JavaDoc;
38
39 import javax.activation.DataSource JavaDoc;
40 import javax.activation.FileDataSource JavaDoc;
41 import javax.activation.DataHandler JavaDoc;
42
43 import com.sun.mail.imap.IMAPFolder;
44
45 import org.apache.turbine.util.upload.FileItem;
46 import org.apache.turbine.services.servlet.TurbineServlet;
47
48 import java.io.File JavaDoc;
49
50 //util
51
import java.util.List JavaDoc;
52 import java.util.Enumeration JavaDoc;
53 import java.util.Properties JavaDoc;
54 import java.util.Vector JavaDoc;
55 import java.util.Hashtable JavaDoc;
56
57 //tdk2.2 version
58
import org.apache.torque.util.Criteria;
59
60 import org.apache.jetspeed.om.apps.email.EmailInboxPeer;
61 import org.apache.jetspeed.om.apps.email.EmailInbox;
62
63 //for logging
64
import org.apache.commons.logging.Log;
65 import org.apache.commons.logging.LogFactory;
66
67 public class Email
68 {
69
70     private static Log log = LogFactory.getLog(Email.class);
71
72     private Properties JavaDoc props;
73
74     private Session JavaDoc session;
75
76     private Store JavaDoc store;
77
78     private Folder JavaDoc folder;
79
80     private Hashtable JavaDoc parameters;
81
82     /**
83      * Email Action
84      *
85      * @author <a HREF="mailto:jlim@gluecode.com">Jonas Lim </a>
86      * @version $Id: Email.java,v 1.2 2004/03/22 22:26:58 taylor Exp $
87      */

88     public Email(String JavaDoc user, String JavaDoc pass, Hashtable JavaDoc param)
89             throws AuthenticationFailedException JavaDoc, NoSuchProviderException JavaDoc,
90             Exception JavaDoc
91     {
92
93         parameters = param;
94         String JavaDoc host = (String JavaDoc) parameters.get("hostname");
95         String JavaDoc protocol = (String JavaDoc) parameters.get("protocol");
96         String JavaDoc smtpUser = (String JavaDoc) parameters.get("smtp_user");
97         String JavaDoc smtpPort = (String JavaDoc) parameters.get("smtp_port");
98         String JavaDoc smtpFrom = (String JavaDoc) parameters.get("smtp_from");
99         String JavaDoc smtpConnTimeout = (String JavaDoc) parameters.get("smtp_conn_timeout");
100         String JavaDoc smptTimeout = (String JavaDoc) parameters.get("smtp_timeout");
101         String JavaDoc smtpLocalhost = (String JavaDoc) parameters.get("smtp_localhost");
102         String JavaDoc smtpEhlo = (String JavaDoc) parameters.get("smtp_ehlo");
103         String JavaDoc smtpAuth = (String JavaDoc) parameters.get("smtp_auth");
104         String JavaDoc smtpDSNNotify = (String JavaDoc) parameters.get("smtp_dsn_notify");
105         String JavaDoc smtpDSNRet = (String JavaDoc) parameters.get("smtp_dsn_ret");
106         String JavaDoc smtpallow8bitmime = (String JavaDoc) parameters
107                 .get("smtp_allow8bitmime");
108         String JavaDoc smtpsendPartial = (String JavaDoc) parameters.get("smtp_send_partial");
109         String JavaDoc smtpSaslrealm = (String JavaDoc) parameters.get("smtp_sasl_realm");
110         String JavaDoc smtpquitWait = (String JavaDoc) parameters.get("smtp_quit_wait");
111         String JavaDoc imapPort = null;
112         String JavaDoc imapPartialfetch = null;
113         String JavaDoc imapFetchsize = null;
114         String JavaDoc imapTimeout = null;
115         String JavaDoc imapHost = null;
116
117         if (protocol.equals("imap"))
118         {
119             imapPort = (String JavaDoc) parameters.get("imap_port");
120             imapPartialfetch = (String JavaDoc) parameters.get("imap_partial_fetch");
121             imapFetchsize = (String JavaDoc) parameters.get("imap_fetch_size");
122             imapTimeout = (String JavaDoc) parameters.get("imap_timeout");
123             imapHost = (String JavaDoc) parameters.get("imap_host");
124         }
125
126         props = new Properties JavaDoc();
127         props.put("mail.smtp.host", host);
128         if (!smtpUser.equals(""))
129         {
130             props.put("mail.smtp.user", smtpUser);
131         }
132         if (!smtpPort.equals(""))
133         {
134             props.put("mail.smtp.port", smtpPort);
135         }
136         if (!smtpFrom.equals(""))
137         {
138             props.put("mail.smtp.from", smtpFrom);
139         }
140         if (!smtpConnTimeout.equals(""))
141         {
142             props.put("mail.smtp.connectiontimeout", smtpConnTimeout);
143         }
144         if (!smptTimeout.equals(""))
145         {
146             props.put("mail.smtp.timeout", smptTimeout);
147         }
148         if (!smtpLocalhost.equals(""))
149         {
150             props.put("mail.smtp.localhost", smtpLocalhost);
151         }
152         if (!smtpEhlo.equals(""))
153         {
154             props.put("mail.smtp.ehlo", smtpEhlo);
155         }
156         if (!smtpAuth.equals(""))
157         {
158             props.put("mail.smtp.auth", smtpAuth);
159         }
160         if (!smtpDSNNotify.equals(""))
161         {
162             props.put("mail.smtp.dsn.notify", smtpDSNNotify);
163         }
164         if (!smtpDSNRet.equals(""))
165         {
166             props.put("mail.smtp.dsn.ret", smtpDSNRet);
167         }
168         if (!smtpallow8bitmime.equals(""))
169         {
170             props.put("mail.smtp.allow8bitmime", smtpallow8bitmime);
171         }
172         if (!smtpsendPartial.equals(""))
173         {
174             props.put("mail.smtp.sendpartial", smtpsendPartial);
175         }
176         if (!smtpSaslrealm.equals(""))
177         {
178             props.put("mail.smtp.saslrealm", smtpSaslrealm);
179         }
180         if (!smtpquitWait.equals(""))
181         {
182             props.put("mail.smtp.quitwait", smtpquitWait);
183         }
184
185         if (protocol.equals("imap"))
186         {
187             if ((imapPort != null) && (!imapPort.equals("")))
188             {
189                 props.put("mail.imap.port", imapPort);
190             }
191             if ((imapPartialfetch != null) && (!imapPartialfetch.equals("")))
192             {
193                 props.put("mail.imap.partialfetch", imapPartialfetch);
194             }
195             if ((imapFetchsize != null) && (!imapFetchsize.equals("")))
196             {
197                 props.put("mail.imap.fetchsize", imapFetchsize);
198             }
199             if ((imapTimeout != null) && (!imapTimeout.equals("")))
200             {
201                 props.put("mail.imap.timeout", imapTimeout);
202             }
203             if ((imapHost != null) && (!imapHost.equals("")))
204             {
205                 props.put("mail.imap.host", imapHost);
206             }
207         }
208         // Get session
209
session = Session.getDefaultInstance(props, null);
210         // Get the store
211
//store = session.getStore("imap");
212
store = session.getStore(protocol);
213         
214
215         store.connect(host, user, pass);
216        // boolean b = store.isConnected();
217
folder = store.getFolder("INBOX");
218
219     }
220
221     public void authenticateUser(String JavaDoc user, String JavaDoc pass)
222             throws AuthenticationFailedException JavaDoc, NoSuchProviderException JavaDoc,
223             Exception JavaDoc
224     {
225         String JavaDoc protocol = (String JavaDoc) parameters.get("protocol");
226         String JavaDoc host = (String JavaDoc) parameters.get("hostname");
227         // Create empty properties
228
Properties JavaDoc props = new Properties JavaDoc();
229         props.put("mail.smtp.host", host);
230
231         // Get session
232
Session JavaDoc session = Session.getDefaultInstance(props, null);
233         // Get the store
234
//Stofalsere store = session.getStore("imap");
235
Store JavaDoc store = session.getStore(protocol);
236         store.connect(host, user, pass);
237
238        
239     }
240
241     public void doSendEmail(String JavaDoc addressTo, String JavaDoc addressFrom,
242             String JavaDoc subject, String JavaDoc msg, FileItem file) throws Exception JavaDoc
243     {
244
245         Session JavaDoc session = Session.getDefaultInstance(props, null);
246         Message JavaDoc message = new MimeMessage JavaDoc(session);
247         message.setFrom(new InternetAddress JavaDoc(addressFrom));
248
249         checkRecipients(addressTo, message);
250
251         // if no subject, default as none
252
if (subject.equals(""))
253         {
254             subject = "none";
255         }
256
257         message.setSubject(subject);
258
259         // Part two is attachment
260
// check if there's an attachment to be sent
261
if (file != null && !file.equals(""))
262         {
263             sendAttachment(message, file, msg);
264         } else
265         {
266             log.info("file null or space " + file);
267             message.setText(msg);
268         }
269
270         Transport.send(message);
271
272         if (file != null)
273         { // delete the file after being uploaded
274
//deleteUploadedfile(file);
275
}
276     }
277
278     public void uploadAttachment(FileItem fileItem) throws Exception JavaDoc
279     {
280
281         log.info("upload attachment");
282         //String contentType = fileItem.getContentType();
283
java.io.File JavaDoc file1 = new java.io.File JavaDoc(fileItem.getFileName());
284
285         String JavaDoc filePath = file1.getAbsolutePath();
286         int d = filePath.lastIndexOf(File.separator);
287         String JavaDoc b = filePath.substring(d + 1);
288         String JavaDoc filename = b;
289
290         fileItem.write(getAttachmentsFolder() + File.separator + filename);
291
292     }
293
294     public void deleteUploadedfile(FileItem file) throws Exception JavaDoc
295     {
296         {
297             log.info("delete uploaded file");
298             java.io.File JavaDoc fn = new java.io.File JavaDoc(file.getFileName());
299             String JavaDoc filename = fn.getName();
300             String JavaDoc realPath = getAttachmentsFolder();
301
302             File JavaDoc fDelete = new File JavaDoc(realPath + File.separator + filename);
303             System.out.println("deleted file : " + fDelete);
304             fDelete.delete();
305         }
306
307     }
308
309     //check if it's a single/multiple recipients
310
public void checkRecipients(String JavaDoc addressTo, Message JavaDoc message)
311             throws Exception JavaDoc
312     {
313         String JavaDoc recipient = null;
314         int startIndex = 0;
315         int semicolonIndex = 0;
316         int lastsemicolonIndex = 0;
317
318         try
319         {
320             if (addressTo.indexOf(";", 0) == -1)
321             {
322                 log.info("addr" + addressTo.indexOf(";", 0));
323                 message.setRecipients(Message.RecipientType.TO, InternetAddress
324                         .parse(addressTo, false));
325             } else
326             {
327                 while ((semicolonIndex = addressTo.indexOf(";", startIndex)) != -1)
328                 {
329                     recipient = addressTo.substring(startIndex, semicolonIndex);
330                     startIndex = semicolonIndex + 1;
331                     lastsemicolonIndex = semicolonIndex;
332                     message.addRecipient(Message.RecipientType.TO,
333                             new InternetAddress JavaDoc(recipient));
334
335                 }
336                 recipient = addressTo.substring(lastsemicolonIndex + 1);
337                 message.addRecipient(Message.RecipientType.TO,
338                         new InternetAddress JavaDoc(recipient));
339                 log.info("recipient" + recipient);
340             }
341             Address JavaDoc a[] = message.getAllRecipients();
342             for (int j = 0; j < a.length; j++)
343             {
344                 log.info("address" + a[j]);
345             }
346
347         } catch (Exception JavaDoc e)
348         {
349             log.error("Error in checkRecepients()",e);
350         }
351     }
352
353     public void sendAttachment(Message JavaDoc message, FileItem file, String JavaDoc msg)
354             throws Exception JavaDoc
355     {
356
357         log.info("file not null or space " + file);
358
359         uploadAttachment(file);
360
361         java.io.File JavaDoc fn = new java.io.File JavaDoc(file.getFileName());
362         String JavaDoc filename = fn.getName();
363
364         //set the message
365
MimeBodyPart JavaDoc messageBodyPart = new MimeBodyPart JavaDoc();
366         //messageBodyPart.setText(msg);
367
messageBodyPart.setContent(msg, "text/html");
368
369         MimeBodyPart JavaDoc messageBodyPart2 = new MimeBodyPart JavaDoc();
370
371         DataSource JavaDoc source = new FileDataSource JavaDoc(getAttachmentsFolder()
372                 + File.separator + filename);
373
374         // Set the data handler to the attachment
375
messageBodyPart2.setDataHandler(new DataHandler JavaDoc(source));
376
377         // Set the filename
378
messageBodyPart2.setFileName(filename.toString());
379
380         // Add the message part and attachment
381
Multipart JavaDoc multipart = new MimeMultipart JavaDoc();
382         multipart.addBodyPart(messageBodyPart);
383         multipart.addBodyPart(messageBodyPart2);
384
385         // Put parts in message
386
message.setContent(multipart);
387
388     }
389
390     public void reply(String JavaDoc from, String JavaDoc addressTo, String JavaDoc msgecontent,
391             String JavaDoc subject, FileItem file, Message JavaDoc msge) throws Exception JavaDoc
392     {
393
394         //since the folder in getMessage method (getting the exact message) is
395
// opened,re-opening the folder may cause an error
396
//folder.open(Folder.READ_ONLY);
397

398         //Message cmessage[] = folder.getMessages();
399
//MimeMessage message = (MimeMessage)msge[current_index].reply(false);
400

401         MimeMessage JavaDoc message = (MimeMessage JavaDoc) msge.reply(false);
402
403         message.setFrom(new InternetAddress JavaDoc(from));
404
405         checkRecipients(addressTo, message);
406
407         message.setSubject(subject);
408
409         message.setContent(msgecontent, "text/html");
410
411         if (file != null && !file.equals(""))
412         {
413             log.info("reply with attachment ******");
414             sendAttachment(message, file, msgecontent);
415         }
416
417         Transport.send(message);
418
419         if (file != null)
420         { // delete the file after being uploaded
421
deleteUploadedfile(file);
422         }
423         //folder.close(true);
424
//store.close();
425

426     }
427
428     public void forward(String JavaDoc to, String JavaDoc from, String JavaDoc subject, String JavaDoc content,
429             Message JavaDoc message) throws Exception JavaDoc
430     {
431
432         //since folder in getMessage method (getting the exact message) is
433
// opened, re-opening the folder may cause an error.
434
//folder.open(Folder.READ_ONLY);
435

436         //Message message[] = folder.getMessages();
437

438         Message JavaDoc forward = new MimeMessage JavaDoc(session);
439
440         forward.setFrom(new InternetAddress JavaDoc(from));
441         forward.setSubject(subject);
442
443         checkRecipients(to, forward);
444
445         MimeMessage JavaDoc orig = (MimeMessage JavaDoc) message;
446         if (orig.isMimeType("text/plain"))
447         {
448             log.info("text/plain forward");
449             forward.setText(content.toString());
450         } else
451         {
452             log.info("forward html *******************");
453             forward.setContent(content, "text/html");
454         }
455
456         Transport.send(forward);
457         //folder.close(true);
458
//store.close();
459
}
460
461     // delete specific message
462
public void contentDelete(int current_index) throws Exception JavaDoc
463     {
464         if(!folder.isOpen())
465         {
466             folder.open(Folder.READ_WRITE);
467         }
468         
469         // Get directory
470
Message JavaDoc message[] = folder.getMessages();
471         message[current_index].setFlag(Flags.Flag.DELETED, true);
472         log.info("index" + current_index);
473     }
474
475     //delete specific message
476
public void contentDelete(int current_index, String JavaDoc foldername,
477             String JavaDoc protocol) throws Exception JavaDoc
478     {
479
480         Folder JavaDoc folder_name = store.getFolder(foldername);
481         folder_name.open(Folder.READ_WRITE);
482         // Get directory
483
Message JavaDoc fmsge[] = folder_name.getMessages();
484         fmsge[current_index].setFlag(Flags.Flag.DELETED, true);
485         if (protocol.equals("imap"))
486         {
487             folder_name.expunge();
488         }
489
490     }
491
492     //multiple delete
493
public void checkboxDelete(String JavaDoc foldername, String JavaDoc[] checkboxes,
494             String JavaDoc protocol) throws Exception JavaDoc
495     {
496         Folder JavaDoc folder_name = store.getFolder(foldername);
497         folder_name.open(Folder.READ_WRITE);
498         // Get directory
499
Message JavaDoc message[] = folder_name.getMessages();
500
501         for (int i = 0; i < checkboxes.length; i++)
502         {
503             int ind = Integer.parseInt(checkboxes[i]);
504             message[ind].setFlag(Flags.Flag.DELETED, true);
505             if (protocol.equals("imap"))
506             {
507                 folder_name.expunge();
508             }
509         }
510     }
511
512     //multiple delete
513
public void checkboxDelete(String JavaDoc[] checkboxes) throws Exception JavaDoc
514     {
515         if(!folder.isOpen())
516         {
517             folder.open(Folder.READ_WRITE);
518         }
519         
520         // Get directory
521
Message JavaDoc message[] = folder.getMessages();
522
523         for (int i = 0; i < checkboxes.length; i++)
524         {
525             int ind = Integer.parseInt(checkboxes[i]);
526             message[ind].setFlag(Flags.Flag.DELETED, true);
527
528         }
529     }
530
531     //get the total no. of messages received
532
public int getNo_of_messages() throws Exception JavaDoc
533     {
534
535         if(!folder.isOpen())
536         {
537             folder.open(Folder.READ_WRITE);
538         }
539         
540         Vector JavaDoc vMessages = new Vector JavaDoc();
541         Message JavaDoc message[] = folder.getMessages();
542
543         int msgectr = message.length;
544         return msgectr;
545
546     }
547
548     // get the total number of new messages
549
public int num_Newmessages() throws Exception JavaDoc
550     {
551
552         if(!folder.isOpen())
553         {
554             folder.open(Folder.READ_ONLY);
555         }
556         
557         
558         Message JavaDoc message[] = folder.getMessages();
559         Vector JavaDoc vNewmessages = new Vector JavaDoc();
560
561         int length = message.length;
562         for (int i = 0; i < length; i++)
563         {
564
565             folder.close(true);
566             Message JavaDoc current_message = getMessage(i);
567             int newMessage = checkNewmessage(current_message);
568             if (newMessage == 1)
569             {
570                 vNewmessages.add(String.valueOf(current_message
571                         .getMessageNumber()));
572                 log.info("@@@@@@@@@@@@@@@@@@@@@@@@@ new!!!");
573             } else
574                 log.info("@@@@@@@@@@@@@@@@@@@@@@@@@ old");
575         }
576         int num_newMessages = vNewmessages.size();
577         return num_newMessages;
578     }
579
580     // this method simply close the inbox folder and store connection...
581
// this is important especially when using pop3 protocol since
582
// pop3 can't re-connect when mailbox is currently used.
583

584     public void close() throws Exception JavaDoc
585     {
586        
587         if(folder.isOpen() && folder != null)
588         {
589             folder.close(true);
590         }
591         
592         if(store.isConnected() && folder != null)
593         {
594             store.close();
595         }
596     }
597
598     public void storeClose() throws Exception JavaDoc
599     {
600         if(store.isConnected() && store != null)
601         {
602             store.close();
603         }
604         
605     }
606
607     public void close(Folder JavaDoc foldername) throws Exception JavaDoc
608     {
609         
610         if(folder.isOpen() && folder != null)
611         {
612             folder.close(true);
613         }
614         
615         if(store.isConnected() && store != null)
616         {
617             store.close();
618         }
619     }
620
621     public Vector JavaDoc openInbox(String JavaDoc protocol) throws Exception JavaDoc
622     {
623
624         if(!folder.isOpen())
625         {
626             folder.open(Folder.READ_ONLY);
627         }
628         
629         Vector JavaDoc vAscmessages = new Vector JavaDoc();
630         Message JavaDoc message[] = folder.getMessages();
631
632         for (int i = 0; i < message.length; i++)
633         {
634
635             Message JavaDoc msge = message[i];
636
637             boolean withAttachment = checkAttachment(msge);
638             Hashtable JavaDoc ht = new Hashtable JavaDoc();
639             ht.put("From", msge.getFrom()[0]);
640             if (msge.getSubject() == null)
641             {
642                 ht.put("Subject", "none"); // set subject to "none" if subject
643
// is null
644
} else
645             {
646                 ht.put("Subject", msge.getSubject());
647             }
648             ht.put("index", String.valueOf(i));
649
650             // POP3 does not provide a "received date", so the getReceivedDate
651
// method will
652
// return null. It may be possible to examine other message headers
653
// (e.g., the "Received" headers) to estimate the received date,
654
// but these techniques are error-prone at best.
655

656             //check protocol... if protocol is pop3, received date is empty
657
if (protocol.equals("imap"))
658             {
659                 ht.put("ReceivedDate", msge.getReceivedDate());
660             } else
661             {
662                 log.info("empty date!!!!!!!");
663                 ht.put("ReceivedDate", "");
664             }
665
666             ht.put("size", String.valueOf(msge.getSize()));
667             ht.put("message", msge);
668             if (withAttachment == true)
669             {
670                 ht.put("hasAttachment", "Attachment");
671             } else
672             {
673                 ht.put("hasAttachment", "");
674             }
675             // check if it's a new message,
676
int status = checkNewmessage(msge);
677             log.info("status " + status);
678
679             if (status == 1)
680             {//new
681
ht.put("status", "new");
682             } else
683             {
684                 ht.put("status", "");
685             }
686             vAscmessages.add(ht);
687         }
688         //folder.close(true); //1-28
689
//store.close(); //1-28
690
return vAscmessages;
691     }
692
693     //get exact message
694
public Message JavaDoc getMessage(int current_index) throws Exception JavaDoc
695     {
696
697         if(!folder.isOpen())
698         {
699             folder.open(Folder.READ_ONLY);
700         }
701         
702         Message JavaDoc[] messages = folder.getMessages();
703         Message JavaDoc message = messages[current_index];
704
705         return message;
706
707     }
708
709     //get the exact message
710
public Message JavaDoc getMessage(int current_index, String JavaDoc foldername)
711             throws Exception JavaDoc
712     {
713
714         Folder JavaDoc folder_name = store.getFolder(foldername);
715         folder_name.open(Folder.READ_ONLY);
716         Message JavaDoc[] messages = folder_name.getMessages();
717         Message JavaDoc message = messages[current_index];
718
719         return message;
720
721     }
722
723     public String JavaDoc getSubject(Message JavaDoc message) throws